{"_id":"@droponair/sdk-js","_rev":"53-a4855f2ca3c75483b16ccae700da1ab3","name":"@droponair/sdk-js","dist-tags":{"latest":"0.43.0"},"versions":{"0.3.0":{"name":"@droponair/sdk-js","version":"0.3.0","keywords":["droponair","messaging","e2ee","encryption","end-to-end","sdk"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.3.0","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://droponair.com","dist":{"shasum":"ebfdae33860eef64fcb8726dbbc69541977522b6","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.3.0.tgz","fileCount":26,"integrity":"sha512-hLc3vqZAiLbreGIXsW8s0DB/UFHPX6tjF1tCA+NwL0uuNZrW1phr5Rj5lw+ikRioIT+zn5hJVGXo3XflXPE/hA==","signatures":[{"sig":"MEUCIQCQJoXmzqZ3auP6YeZXTJiEc8+KaODk+Ix8zVwvO9PvuwIgTEhQ9KWpNxsViET3tCjHFQ3fneVQzx99dl9m22czJOA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":144126},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"1cbd09be8f0ba54739973a50514971fe8d36faca","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"DropOnAir SDK for end-to-end encrypted messaging","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-node":"^10.9.2","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.3.0_1776515985274_0.6699462250007826","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@droponair/sdk-js","version":"0.3.1","keywords":["droponair","messaging","e2ee","encryption","end-to-end","sdk"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.3.1","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://droponair.com","dist":{"shasum":"72414ee69a24fa221af017a26574e89b3295120d","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.3.1.tgz","fileCount":26,"integrity":"sha512-Yv5+J5CMuj5YZw137v7mLeavPDyVq1MQrZpZIy4pMYkrA0o3IixhvbrCQmh57FUCo+kbk6ekvNUpG2bF/Z4mzA==","signatures":[{"sig":"MEQCIF1/va1dtgUeWXOWA3dTfsupVGFHGGlSvtN5I3s8s4UHAiAQL58QPXWzevR0svUumAg5X2QP/Z4f/x5B1A/K8oXMlg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":123020},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"1cbd09be8f0ba54739973a50514971fe8d36faca","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"DropOnAir SDK for end-to-end encrypted messaging","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-node":"^10.9.2","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.3.1_1776517172687_0.1291932552421522","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@droponair/sdk-js","version":"0.4.0","keywords":["droponair","messaging","e2ee","encryption","end-to-end","sdk"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.4.0","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://droponair.com","dist":{"shasum":"d25a5441b16de26782da5f636f7fbeb92ef57872","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.4.0.tgz","fileCount":26,"integrity":"sha512-6VxD0Iy6FA4tUKmxAYYifqnU7Lhg7YTnyD3T5/2gyE6mTerWA8lM17LrcPdnmYlszHBMDtZkfOA8dxjIuKge9g==","signatures":[{"sig":"MEQCIHpdJTlEzKuPJ4NDohx0f+h0tlsekUIxKnHT/Sl2JKp4AiATfa8QpNj8aV1xvwFZNkhlugg7Q198ZYLRm9eKPFlKMg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":145892},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"7352dd03316dc2adeecbcd6113b02175ebf46fa6","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"DropOnAir SDK for end-to-end encrypted messaging","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-node":"^10.9.2","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.4.0_1776949164640_0.9815599839726319","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@droponair/sdk-js","version":"0.5.0","keywords":["droponair","messaging","e2ee","encryption","end-to-end","sdk"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.5.0","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://droponair.com","dist":{"shasum":"585816894d26d9c2770945d916c5bd29f1332f8e","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.5.0.tgz","fileCount":30,"integrity":"sha512-GGI55xO7Zbwd83ZEvKIZWgUPLulAV9NhTIg50MiZzlpGS2SkMHJ6P47z3E4aWfxIfU5Kk6Ba3xWHC+uG25XKlA==","signatures":[{"sig":"MEUCIQC6o3+2DVJDd5r9WQ4HS3Z5ZtUkDOQ+uEzVStFO5qZz/QIgNlNiJ/14/LtKKyhMsl+aDp4B7lofOdRt7neHtdltS/Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":181685},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"6519814f3f346f6661b3c44e8bb00644811da196","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"DropOnAir SDK for end-to-end encrypted messaging","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-node":"^10.9.2","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.5.0_1779082566454_0.37725300642455273","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@droponair/sdk-js","version":"0.6.0","keywords":["droponair","messaging","e2ee","encryption","end-to-end","sdk"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.6.0","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://droponair.com","dist":{"shasum":"7ea55b35d889e2a7ad457fadfed4a2cf9a8529d7","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.6.0.tgz","fileCount":30,"integrity":"sha512-JU8l/JuXCJVXaB/w1crnDdAxozTQsY7RAPRD6XVEPLMWNhmkk+EOVx0Nj/eCq+CzfUzZkyt9Txk4y0dj5I/hMQ==","signatures":[{"sig":"MEUCIB8hW6t1lxI2VaVG5CT3scLSEnlDZIoWYcAif2RKp01ZAiEAzdK4wnluOeiG9K/SEVMYDCWa+jEG7uWsaWqEpQ6uh7k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":188696},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"a8c83d8869a656c131917b121291420f39287ee0","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"DropOnAir SDK for end-to-end encrypted messaging","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-node":"^10.9.2","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.6.0_1779144766541_0.8221383478392013","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@droponair/sdk-js","version":"0.7.0","keywords":["droponair","messaging","e2ee","encryption","end-to-end","sdk"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.7.0","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://droponair.com","dist":{"shasum":"f4932cd999f636e2343b240cc6b7308d99d84786","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.7.0.tgz","fileCount":30,"integrity":"sha512-/LExi0P3Mtbk+7466a4uPNA3dInUCUuaBNQXfnC2LsNAapO6tzQr+X0VPjewtwshzqCf6eoNC8i27yNIHTrzKg==","signatures":[{"sig":"MEQCIFNIxnyAinT6K6dKUFA8Lyv6rmuTgiMeHQ2PTEgH8Ru7AiApK3xApXj36vdK3CJiL/r0LDB8abwyIxvVCYlYP3B3FQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":197897},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"b1abc8f4826ec76e5b26d0f1feda45ba6a17e48d","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"DropOnAir SDK for end-to-end encrypted messaging","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-node":"^10.9.2","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.7.0_1779172687860_0.5200930983551484","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@droponair/sdk-js","version":"0.8.0","keywords":["droponair","messaging","e2ee","encryption","end-to-end","sdk"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.8.0","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://droponair.com","dist":{"shasum":"c15ae2b2317988469264890e3c54c625fe5db27c","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.8.0.tgz","fileCount":30,"integrity":"sha512-flkx8oH+sDXI+zXGupbRGvKwu8t71HlOTHvAeXU1RD/7dlYPyyi8X4Ji0Lgz4gWIwQTyMbkXa2AbB2RE8IFC9g==","signatures":[{"sig":"MEUCIG+bjpfe0DN5mjxHy/b/Y66dZ6k+xm6Ab8Dk8vr55AjzAiEAjQziTll8lrOkcdXsV75JxHKtz1gCRKzOxrCrDPmgAJw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":206782},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"e902a6e3a0dbf09cab91b0164d5afb6ee065e939","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"DropOnAir SDK for end-to-end encrypted messaging","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-node":"^10.9.2","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.8.0_1779187317258_0.820217227410539","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@droponair/sdk-js","version":"0.9.0","keywords":["droponair","messaging","e2ee","encryption","end-to-end","sdk"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.9.0","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://droponair.com","dist":{"shasum":"5a0ea780c20d6100b952e8cfa2a4bf4bb477200e","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.9.0.tgz","fileCount":30,"integrity":"sha512-tX20/gELf4JmPg61b5XRPdipneW5mAXwjNP5O+lF5nawKTt31QAvEGm6I8LVhzFEwgDmTnX94EqA27R4O4u/0g==","signatures":[{"sig":"MEYCIQClB8X5KtRRJ9Jm5AOQLbRg+KlXjMElhkxuiY6p78lNEgIhAPrVym0u+xbTY4oKAANuw/ayKerzzUCDG39zpbz9lYVs","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":214250},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"7b204566c9fe9e4adc94fe859da4cd83c4cb27e8","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"DropOnAir SDK for end-to-end encrypted messaging","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-node":"^10.9.2","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.9.0_1779216142296_0.7752572228709151","host":"s3://npm-registry-packages-npm-production"}},"0.9.1":{"name":"@droponair/sdk-js","version":"0.9.1","keywords":["droponair","messaging","e2ee","encryption","end-to-end","sdk"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.9.1","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://droponair.com","dist":{"shasum":"46e7ff478b091730d32e1f87f85e0775178535d2","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.9.1.tgz","fileCount":30,"integrity":"sha512-jT/01FQaPzU3VzB1J3cNVlNPR7lz17TDwKZq+PdPPwS+NOyKGovVhECrrnRkURE3B9UUq4515nV94OwBiH7e0w==","signatures":[{"sig":"MEYCIQDwMbHC4+kmjxXtywKOxgbkODpKkxOD05pdikEKmInz2QIhAN3pzAVBW7f2H5Di1Hw/cwE9pd75gv3esuxhNYOzNVCe","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":215431},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"07723d0dde9b2e378f536ebd5bc1dfbb106aad8b","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"DropOnAir SDK for end-to-end encrypted messaging","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-node":"^10.9.2","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.9.1_1779218167625_0.7139248630664166","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"@droponair/sdk-js","version":"0.10.0","keywords":["droponair","messaging","e2ee","encryption","end-to-end","sdk"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.10.0","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://droponair.com","dist":{"shasum":"8070dd79805f76e1d3e86ac8d762e995ded195de","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.10.0.tgz","fileCount":30,"integrity":"sha512-UolNxJLvDfnrFo20Of+99THhirlhkfBynlMxk1YswsiUbKiUu0lR/wCZJXVgXKzOhr5fXWn7z7F3VEmEz8+I1g==","signatures":[{"sig":"MEQCIDCXZpY/e6hawcqbYOxuWY/r1X2JC2J/mhVhmwEPQ9rqAiBpi8PXtW+EUlgCQtogG1biTMV9EDOeOW0+sEV1aR2b+A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":221548},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"a93c7f1d560189796b0b0c29805a6969d31cde0f","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"DropOnAir SDK for end-to-end encrypted messaging","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-node":"^10.9.2","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.10.0_1779263494098_0.7232127924186753","host":"s3://npm-registry-packages-npm-production"}},"0.11.0":{"name":"@droponair/sdk-js","version":"0.11.0","keywords":["droponair","messaging","e2ee","encryption","end-to-end","sdk"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.11.0","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://droponair.com","dist":{"shasum":"4ad6782742fe62659a2cd8c5a349e598c32e4494","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.11.0.tgz","fileCount":30,"integrity":"sha512-62ba/J7S9CxeCO7YcJgZ0ePScA2k4OOwyhr5fskvyK2vv3NB/OIgAliPA6s1JLcqTK7dzRpn7s//YdpOX0tEuA==","signatures":[{"sig":"MEYCIQCOB9hX4yioWG1qRmtt2wGNc4Oo2C918lVb4+PV/SaPVAIhAI0UCo95IXrO7Wqm3wSwvtJvBns1FQ6UBDIcg3WnougM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":229568},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"257f111ceec3e49450c7137ce661b20505df63c7","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"DropOnAir SDK for end-to-end encrypted messaging","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-node":"^10.9.2","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.11.0_1779266146363_0.44802091311149805","host":"s3://npm-registry-packages-npm-production"}},"0.12.0":{"name":"@droponair/sdk-js","version":"0.12.0","keywords":["droponair","messaging","e2ee","encryption","end-to-end","sdk"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.12.0","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://droponair.com","dist":{"shasum":"a9dfc92376305e2c6c5da9fc68c3c041bd5e03a9","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.12.0.tgz","fileCount":30,"integrity":"sha512-/3MoOOYcc+3sqOGRq3v3/Y9NGWgzVvIQyxhgnK9OLwHVypnpjmyc1KyXVUnMcKh2XIgkoFbFLeRliVISiRGF8g==","signatures":[{"sig":"MEUCIQDLB4oTVBN8xXPRQVxUC6rB5lweVLeMGoWf7jn0qVMitgIgLrw3NH9BbBUmGgWBXfrogYE35ZNxM7KvM46Ic74h5HY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":237682},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"7ec40172b0c8c98a481b1c7d6ade5e2b7353d9d4","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"DropOnAir SDK for end-to-end encrypted messaging","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-node":"^10.9.2","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.12.0_1779269069363_0.27226979565981013","host":"s3://npm-registry-packages-npm-production"}},"0.13.0":{"name":"@droponair/sdk-js","version":"0.13.0","keywords":["droponair","messaging","e2ee","encryption","end-to-end","sdk"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.13.0","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://droponair.com","dist":{"shasum":"e5a2cf53226441d1fdd5adda828c2a1689020b44","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.13.0.tgz","fileCount":30,"integrity":"sha512-KAt4IR+CIG/DRd+b4PNZSmuuHgR5M1+OraBEqwHn5KZf/rZ01LInMb6gE02ymzYDLewasihH2WqGXWgzjfXdxQ==","signatures":[{"sig":"MEUCIQC+2aIPxHwwk5huybHBkfQ3W+TDqNDQzV8lUThqfu2DzwIgLR7mJfLT31vwiD3uFOQZ80uePubMfIqHL7ejjYYgU5k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":245269},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"1ccf225678f732148525ae03cd051e3729dcfe1b","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"DropOnAir SDK for end-to-end encrypted messaging","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-node":"^10.9.2","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.13.0_1779367796112_0.4490129656637014","host":"s3://npm-registry-packages-npm-production"}},"0.13.1":{"name":"@droponair/sdk-js","version":"0.13.1","keywords":["droponair","messaging","e2ee","encryption","end-to-end","sdk"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.13.1","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://droponair.com","dist":{"shasum":"05288d41ea5b879bd70e674b0ed80653e4d514f0","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.13.1.tgz","fileCount":30,"integrity":"sha512-4PqNS6m/fX8DrnIHjVh+Lx23/H2OlJ6NK17BuLFqKQtjSbeyFsyaZomqvh7GsieG7Borqy/5W6H0paqb4yxJfA==","signatures":[{"sig":"MEQCIE1DSV2pQVfz3qe7yICZcptZbeQ8Yd5QXsDlL9Nb3QRhAiA1jix4EmQ51v10XooEq4ig4GDAnZbdkHA2YTnWj0DCgA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":247388},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"6a7570d544f7b3031f1332be3481933737594530","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"DropOnAir SDK for end-to-end encrypted messaging","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-node":"^10.9.2","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.13.1_1779379413802_0.14822149424062503","host":"s3://npm-registry-packages-npm-production"}},"0.14.0":{"name":"@droponair/sdk-js","version":"0.14.0","keywords":["droponair","messaging","e2ee","encryption","end-to-end","sdk"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.14.0","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://droponair.com","dist":{"shasum":"b1a67c17bdc65f34d2d8a7f726e9eda930ec0efd","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.14.0.tgz","fileCount":30,"integrity":"sha512-TiCYuWZJUZqtVx3rJLqDD0dbw/yCY3Ob5j6kZu6ttuleBonyuPmMplBUGXhVkAKICCarkCEp8O38OCwPTlrGAg==","signatures":[{"sig":"MEUCIBmy+Af7WyRWQmYSuY6GUaKSTOVCXLui5TuvCppbDk14AiEAzgSzm1soGUD1PZ5yJFnpgmiz56Aa6E8nsFOvROCPKBw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":260442},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"fc38ee704acc57aca700eac2d530fe73f6c36f5d","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"DropOnAir SDK for end-to-end encrypted messaging","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-node":"^10.9.2","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.14.0_1779387329332_0.39022327015776703","host":"s3://npm-registry-packages-npm-production"}},"0.15.0":{"name":"@droponair/sdk-js","version":"0.15.0","keywords":["droponair","messaging","e2ee","encryption","end-to-end","sdk"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.15.0","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://droponair.com","dist":{"shasum":"0cf1ac874dd2a98c3dd7870f847d5a9d8a5c1e11","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.15.0.tgz","fileCount":30,"integrity":"sha512-IdHqjjjR/w5g4z88qZ0IFOzDMA+png7WZ8cYxgDIHAJnm1Eiok/RawNXXHTk69RByxlN29nlPngrPJi0RxuXGg==","signatures":[{"sig":"MEUCIQCzLCuKjwx+vCeJgXQOTUvQdlwIdMoHy2QphH8uFnTDngIgF+HR3CN/PbUHSDE7+bv6f5ulgu1xqmFajAEUF0fcufQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":265386},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"940052ccd7f785bdd608f6b14643836f237036f5","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"DropOnAir SDK for end-to-end encrypted messaging","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-node":"^10.9.2","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.15.0_1779390788562_0.6549819786836037","host":"s3://npm-registry-packages-npm-production"}},"0.16.0":{"name":"@droponair/sdk-js","version":"0.16.0","keywords":["droponair","messaging","e2ee","encryption","end-to-end","sdk"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.16.0","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://droponair.com","dist":{"shasum":"f0016b81694a29eb27a171e1a91d680dbab17bcd","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.16.0.tgz","fileCount":30,"integrity":"sha512-AYz3ZkB/UlhxgYObjvxT7XPhY6UK3zy4mWgTG14Et5FuWNg4TXY0vs8FHcCtphmjWAXlMbBNC67Ho41foV81fw==","signatures":[{"sig":"MEQCIHR8vCpPbnBxSuU8FyOW53YFL8+SIUgP/pygCIN9oKbwAiB+RbuRFWwp7Dx/ABWXxcN3BQeV/jAoBPjOBLV4uCIn7w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":268870},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"e5a480fbbddd0d8404816096253cd03e69a0a5ac","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"DropOnAir SDK for end-to-end encrypted messaging","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-node":"^10.9.2","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.16.0_1779400816929_0.28834715774135167","host":"s3://npm-registry-packages-npm-production"}},"0.17.0":{"name":"@droponair/sdk-js","version":"0.17.0","keywords":["droponair","messaging","e2ee","encryption","end-to-end","sdk"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.17.0","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://droponair.com","dist":{"shasum":"698141c1a3dddbac6f74acc06d916fee15af61b9","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.17.0.tgz","fileCount":30,"integrity":"sha512-SKIcrU4VolpMlsruymQN2rev9iyPnjkUyWFXBkzi0Gp7WpDOpW9Rd87i/hGvYHqMCBzoY2TTRlfNTYIx06Px5w==","signatures":[{"sig":"MEYCIQDy3MiAhoRxQhdrs1LjxvJXOVJSmP/dY8c76SdovWR9FQIhAP2y22S8hYGNGr3wvQYGSDh3HO7AttYXsWQQIyESAu+B","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":272964},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"02ae19be29ea4d871ed66bae55b992d689238ed2","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"DropOnAir SDK for end-to-end encrypted messaging","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-node":"^10.9.2","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.17.0_1779545584353_0.06610802879698485","host":"s3://npm-registry-packages-npm-production"}},"0.18.0":{"name":"@droponair/sdk-js","version":"0.18.0","keywords":["droponair","messaging","e2ee","encryption","end-to-end","sdk"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.18.0","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://droponair.com","dist":{"shasum":"4c2dac0acf81c4f42213558a348fdf177a2eeb2a","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.18.0.tgz","fileCount":30,"integrity":"sha512-xQEmps3mrf+Ghe0qwnETbCcQhY5PlsteEcr8bVhKGQN8Yz/QtgKICbDhjo8CfO0Gh9Q3WxBMqgnkM/OTBNKDRg==","signatures":[{"sig":"MEQCIHC5IY2RbCHMi6CBziMxkrYf6FE7Qoi6GhMvStfZUzdmAiBP+vHRpvzaMOMnhDmrC9/179PvYIWTzcST1PQsdmaY1A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":279016},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"fe95972de52439e24c7f28d472ef7b1b947a5d27","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"DropOnAir SDK for end-to-end encrypted messaging","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-node":"^10.9.2","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.18.0_1779564149694_0.6799525678597274","host":"s3://npm-registry-packages-npm-production"}},"0.19.0":{"name":"@droponair/sdk-js","version":"0.19.0","keywords":["droponair","messaging","e2ee","encryption","end-to-end","sdk"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.19.0","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://droponair.com","dist":{"shasum":"d9e2af7d9b3dce0a016c66a95cbaee402dba5148","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.19.0.tgz","fileCount":32,"integrity":"sha512-eCaBBhQdNdULYm7xULbrdC5medEezBigz8coPmD3/A8OsfeWrWs9EXvLC8yJib2IcoPQceg4WDKR93pmUSBl1g==","signatures":[{"sig":"MEQCIAjJQ2S2j9OtF7tyENrB5G1x0m2xqrVVnwUAZEkiBc5aAiAWhqL8KmxSuTZ1tKydccL5E+c6ZeubxXfEpdjVjhyrhQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":287849},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"c8cfcc185c709a544725705e3b1330aa97f1ea0e","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"DropOnAir SDK for end-to-end encrypted messaging","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-node":"^10.9.2","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.19.0_1779615823276_0.6576612987527111","host":"s3://npm-registry-packages-npm-production"}},"0.21.0":{"name":"@droponair/sdk-js","version":"0.21.0","keywords":["droponair","messaging","e2ee","encryption","end-to-end","sdk"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.21.0","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://droponair.com","dist":{"shasum":"9d4904a67f1998de45882c06a0153beeaaf8477d","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.21.0.tgz","fileCount":36,"integrity":"sha512-1vzhtqu3TgiL/Vhyt9lI9uNw9ZNydVMYAqR6e25f3CGjXH5cf4a7e6VGt7uzk4yVO9h0/Yj3h6K1NwJMTD/dTQ==","signatures":[{"sig":"MEUCIH0u+ZrsFQLs5YMx/3a6v5fr7v/5XQTE07cBnWozXE6yAiEA0T1dLNYin38OXp1BjD7RPxlUj3n9IN5nOlQnCx5liPQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":304958},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"0792bc8c2b3f1b5455750b298cdaed17cd48cba5","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"DropOnAir SDK for end-to-end encrypted messaging","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-node":"^10.9.2","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.21.0_1779654507176_0.31462723213300436","host":"s3://npm-registry-packages-npm-production"}},"0.22.0":{"name":"@droponair/sdk-js","version":"0.22.0","keywords":["droponair","messaging","e2ee","encryption","end-to-end","sdk"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.22.0","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://droponair.com","dist":{"shasum":"956fbe4c969d2281bc9a98f84dae74f2d06e65bd","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.22.0.tgz","fileCount":44,"integrity":"sha512-aaZjZyWsw/B7lE8pba6Xq7PHNd9LpTkXd9h3FwZseKEpqXROVtPTsUYoytrPv/WZNtRy0N+ho1dLLxwaaGtiaQ==","signatures":[{"sig":"MEYCIQDVf/0k/bDSOq5sYcTFmsKumHpvKKRcVd1/BF4acwWdagIhAN5MQiuB3ss3y4Bc0XGyMTo85tSZ2+WiPC6d2zWVO+yg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":319927},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"17bec7cacc52aeec80ee412e1acd6dd9e5442622","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"DropOnAir SDK for end-to-end encrypted messaging","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-node":"^10.9.2","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.22.0_1779707603695_0.44212502677453114","host":"s3://npm-registry-packages-npm-production"}},"0.22.1":{"name":"@droponair/sdk-js","version":"0.22.1","keywords":["droponair","messaging","e2ee","encryption","end-to-end","sdk"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.22.1","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://droponair.com","dist":{"shasum":"23608d5e47f0ea13d1e52b7f75013e42e0594108","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.22.1.tgz","fileCount":44,"integrity":"sha512-RYuy+msAIXhFfgwsYp7GEGasbGegerqyc5E/kHLa2MhpTkMKyHbOaWIRyAe/lFfUdhXY7M6CYdNKgizCvwHHZA==","signatures":[{"sig":"MEQCIATPIxUTpsETOcv9RPX6AD+aKmXgv/MY9MsCeMUC+3gRAiBzx0rK9t8GCOqVpAA/RwsMTdEgtZaoMsYhVxrDP0nq/Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":321142},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"de4f9f1b9d7ceb6ac1d04681e388bac518f764da","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"DropOnAir SDK for end-to-end encrypted messaging","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-node":"^10.9.2","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.22.1_1780257681042_0.4189338923519661","host":"s3://npm-registry-packages-npm-production"}},"0.23.0":{"name":"@droponair/sdk-js","version":"0.23.0","keywords":["droponair","messaging","e2ee","encryption","end-to-end","sdk"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.23.0","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://droponair.com","dist":{"shasum":"2b3f2c12d61b164ebbac5c04a85fddf04ad1089c","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.23.0.tgz","fileCount":44,"integrity":"sha512-kO0kg0hdh11U8PxWH+xh98zma83K7i/O2h/SWLem6PnwynZrUy32CSgwf/Ezt+5Wor1CXhiximWJQrKI52rdsg==","signatures":[{"sig":"MEUCIQDcFte924Lh72s8ZqGvtJEvY9jRfUBRxytLIEHFt3BYbgIgdqrw7slriZSvyVJti/QpLyLWS5FTOGZxsrZteYAfi5U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":322435},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"788fc596fba8c4645be694707c0999587a41961b","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"DropOnAir SDK for end-to-end encrypted messaging","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-node":"^10.9.2","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.23.0_1780306026544_0.3260878594207044","host":"s3://npm-registry-packages-npm-production"}},"0.23.1":{"name":"@droponair/sdk-js","version":"0.23.1","keywords":["droponair","messaging","e2ee","encryption","end-to-end","sdk"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.23.1","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://droponair.com","dist":{"shasum":"168f1885ca6dfc29b6d7e43ef2ddc03fcf3506c6","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.23.1.tgz","fileCount":44,"integrity":"sha512-NvRq1PX+znyCvOP0I/VS9zYV+AWDC7rfCCDYrWGhejr0n53ORm6IB1f4iFHdkBzTNHRa7+Ox9+US8fthvvZavg==","signatures":[{"sig":"MEQCIAIRqwjyUJgIZ5JydN/liK9roTjI7mlYdX0IlO0TtUe2AiBpLO0b28JwkNgQb6d+SiPeUndgDSHvseZ/p4vwCbSxhw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":327685},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"d1166df55d88784baad1283cb7fa6930b0f58f94","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"DropOnAir SDK for end-to-end encrypted messaging","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-node":"^10.9.2","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.23.1_1780525807952_0.42499550709631584","host":"s3://npm-registry-packages-npm-production"}},"0.23.2":{"name":"@droponair/sdk-js","version":"0.23.2","keywords":["droponair","messaging","e2ee","encryption","end-to-end","sdk"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.23.2","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://droponair.com","dist":{"shasum":"ac66926c87a305cf353b8d6afad7917a95d02bc8","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.23.2.tgz","fileCount":44,"integrity":"sha512-a3PPh+tFUPnos4sebSB/AsJEWsB4L6J101w+8CwGrk5pPbaXA4e1xhU1ZE3pCiTs40zipmHxmpw4wLsNRWlhEA==","signatures":[{"sig":"MEQCIDvL0kehIJFG3tEvLMCXcF7a2TxMT9gLp/ADYbtbsmatAiApANkJjqXdeKuloOr4Eq3dW3nfQbu708/gtEj1wYO0Rw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":329886},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"5ed075fba866f0c2e57c91374aa043a863dea379","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"DropOnAir SDK for end-to-end encrypted messaging","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-node":"^10.9.2","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.23.2_1780563914100_0.046533321980089415","host":"s3://npm-registry-packages-npm-production"}},"0.24.0":{"name":"@droponair/sdk-js","version":"0.24.0","keywords":["droponair","messaging","e2ee","encryption","end-to-end","sdk"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.24.0","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://droponair.com","dist":{"shasum":"2fe492bcfb8574844f50ad55ab80b44bf74a3b2b","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.24.0.tgz","fileCount":44,"integrity":"sha512-XH/Q6jZ+LJEO+V0Evp0mfWxr3baUMJLHyh20bSegXYU0qT1n2AZ6YPan7YAzlMTjDj5wqMhoZDhLYeqVh33jVw==","signatures":[{"sig":"MEQCIBlGZ3tXdIXGsNd0/zCE7VTuuYNdHRsdfykHcUqciaxnAiAfwHFzwkdHAQgzCPHU3/+xpv2eu5N2oosy8PNtlW3z/Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":330533},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"2878363c765b5a509800336616eee7ebfeb8f436","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"DropOnAir SDK for end-to-end encrypted messaging","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-node":"^10.9.2","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.24.0_1785396639664_0.8004628418235626","host":"s3://npm-registry-packages-npm-production"}},"0.24.1":{"name":"@droponair/sdk-js","version":"0.24.1","keywords":["droponair","messaging","e2ee","encryption","end-to-end","sdk"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.24.1","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://droponair.com","dist":{"shasum":"43d8980dd9a8eb6b942f0c7adc31469f66b06f34","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.24.1.tgz","fileCount":44,"integrity":"sha512-978244nxBUcS+TBZoNuLIFne3xCNIOUJl5OZXQ63uxywm+C8HYfpDZvOt/mZ/n7rDqLLIdxU9NrE83n5Zey41g==","signatures":[{"sig":"MEYCIQCbbLORfl41/J5m9ceH2fOGXp5BiFrHOWmBkCo4ZotA5QIhAKi7gE1aMQQ6onb2cnO1U1TyDBGxyY52u+si0L05tOkX","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":332024},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"2f1e4eac74111dee24f896e885347023b1f0d258","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"DropOnAir SDK for end-to-end encrypted messaging","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-node":"^10.9.2","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.24.1_1785521687046_0.33333324754231874","host":"s3://npm-registry-packages-npm-production"}},"0.24.2":{"name":"@droponair/sdk-js","version":"0.24.2","keywords":["droponair","messaging","e2ee","encryption","end-to-end","sdk"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.24.2","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://droponair.com","dist":{"shasum":"ab9474aaea815e382640f57f136466c5e15123e6","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.24.2.tgz","fileCount":44,"integrity":"sha512-URfbhFuYgZUdD328rtKkCR5WDkbFRcFFjWJjrjO38cJfuY6rwCcRpTzUHZHd8KInvbw2WfIEPH13NqW3Zoy6Fw==","signatures":[{"sig":"MEUCICZx58cgBOpo+ks0mX2cQVel9a1n4MKUEgeyF1GzfT4wAiEAtZcn11ybXTLdrX+8pY3nGtpRVSRbHbHDe6g76zuiSq4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":332801},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"1d97c98cbb20659f058e311eb8dbd653a071547e","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"DropOnAir SDK for end-to-end encrypted messaging","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-node":"^10.9.2","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.24.2_1785529424280_0.7742741017023569","host":"s3://npm-registry-packages-npm-production"}},"0.24.3":{"name":"@droponair/sdk-js","version":"0.24.3","keywords":["droponair","messaging","e2ee","encryption","end-to-end","sdk"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.24.3","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://droponair.com","dist":{"shasum":"af716bf6b408b0203517f38689b0dce53db827f6","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.24.3.tgz","fileCount":44,"integrity":"sha512-XGy/izrlhiO+dmym7+aTUgKkc8sBsMTT1u0/2SdoEcmlgK+/GRLe0eeqq+gs2cy/mCgU3cAxRESLO8XqIy8Y5Q==","signatures":[{"sig":"MEUCIFvnTPoU60x59ii7g2H4xw0X4iwu2L0Pl/Hw1cWfw2APAiEA2HCfLd5H2HuxpnoT9RlvGz0KQmY3sn8WlVjL2cx9TBM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":333493},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"c78f56bc13143c44c32f04a8ad46c2d935996598","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"DropOnAir SDK for end-to-end encrypted messaging","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-node":"^10.9.2","typescript":"^5.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.24.3_1785673859477_0.8457841393755179","host":"s3://npm-registry-packages-npm-production"}},"0.25.0":{"name":"@droponair/sdk-js","version":"0.25.0","keywords":["e2ee","end-to-end-encryption","encrypted-chat","chat-api","chat-sdk","messaging","messaging-sdk","realtime","websocket","webrtc","voice-calls","video-calls","video-calling","group-chat","push-notifications","sdk","droponair"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.25.0","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://www.droponair.com/","bugs":{"url":"https://www.droponair.com/contact/","email":"info@droponair.com"},"dist":{"shasum":"bf440b08d7f89c58a0bfada65738a0ee3fdd733c","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.25.0.tgz","fileCount":48,"integrity":"sha512-L4HzLy6Fh9n9Vm3oKlJb7qz8szBxSd393gRNqp3omBllQWevGnRz3wAYXKy6F1r8XHJd0P/3CzPdLjFFnNlJpA==","signatures":[{"sig":"MEYCIQDGUej9TEkAp7sd85htzd4/r4arTF8RqNaudeE3XtVj2AIhAM2MGw0tuAcj+dT7XeTps7rvIOrlXruRSV9NxT0rEFmm","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":368574},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"a4d82f8df68b294c379c1457f7bfd1e9c825176e","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"End-to-end encrypted messaging, voice and video calling SDK. The relay never sees your keys or message content.","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","esbuild":"^0.28.2","ts-jest":"^29.4.12","ts-node":"^10.9.2","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^20.0.0","@playwright/test":"^1.62.1"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.25.0_1787338340579_0.05687856544015224","host":"s3://npm-registry-packages-npm-production"}},"0.25.1":{"name":"@droponair/sdk-js","version":"0.25.1","keywords":["e2ee","end-to-end-encryption","encrypted-chat","chat-api","chat-sdk","messaging","messaging-sdk","realtime","websocket","webrtc","voice-calls","video-calls","video-calling","group-chat","push-notifications","sdk","droponair"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.25.1","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://www.droponair.com/","bugs":{"url":"https://www.droponair.com/contact/","email":"info@droponair.com"},"dist":{"shasum":"514fc9a2dfe0615590569163eef203b301843872","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.25.1.tgz","fileCount":48,"integrity":"sha512-W/j3iE2wOmjwqCTfeFvwPZRpPzHSZPv2NkGtP5yUFJE6rXLWukQ3L8RHMqdOlI9W9ye7V3eCjd4o0mXjhR/g8Q==","signatures":[{"sig":"MEUCIQCJMPgXapec6qAsP85v7xN0abBJAjsSmJx8FWj8/7iSZQIgaQE9U8CvV6mUG3ObOzifBz5pTgmUdPuKf8iBXHxXCE8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":368959},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"e9e3596191ee8b5a38f27969311aa3cb8e1c5294","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"End-to-end encrypted messaging, voice and video calling SDK. The relay never sees your keys or message content.","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","esbuild":"^0.28.2","ts-jest":"^29.4.12","ts-node":"^10.9.2","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^20.0.0","@playwright/test":"^1.62.1"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.25.1_1787344674829_0.5329671765705897","host":"s3://npm-registry-packages-npm-production"}},"0.26.0":{"name":"@droponair/sdk-js","version":"0.26.0","keywords":["e2ee","end-to-end-encryption","encrypted-chat","chat-api","chat-sdk","messaging","messaging-sdk","realtime","websocket","webrtc","voice-calls","video-calls","video-calling","group-chat","push-notifications","sdk","droponair"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.26.0","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://www.droponair.com/","bugs":{"url":"https://www.droponair.com/contact/","email":"info@droponair.com"},"dist":{"shasum":"c4c0c513564f2bca00c130d655ac3ad18165ce02","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.26.0.tgz","fileCount":48,"integrity":"sha512-Dc775MTk9Oz2U2tlEnJmiGnKNfYPXVxK90E32BteDyvLsbAK4bg0NHq3K+uv7gnS3f9eRpihWWnBPXubRj9nIQ==","signatures":[{"sig":"MEQCIC2isZkx6AcA5D+/yfuCm+3PNhxU4gC5LSMrr8ntq4eMAiAbZmiyU2+PtFZ768katHjbKei3eQTvpVKQjRQdo/YWpQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":378300},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"61b96ad9217cc4864553f3ec066fc58b7d9219cd","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"End-to-end encrypted messaging, voice and video calling SDK. The relay never sees your keys or message content.","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","esbuild":"^0.28.2","ts-jest":"^29.4.12","ts-node":"^10.9.2","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^20.0.0","@playwright/test":"^1.62.1"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.26.0_1788387378753_0.2396242189428539","host":"s3://npm-registry-packages-npm-production"}},"0.27.0":{"name":"@droponair/sdk-js","version":"0.27.0","keywords":["e2ee","end-to-end-encryption","encrypted-chat","chat-api","chat-sdk","messaging","messaging-sdk","realtime","websocket","webrtc","voice-calls","video-calls","video-calling","group-chat","push-notifications","sdk","droponair"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.27.0","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://www.droponair.com/","bugs":{"url":"https://www.droponair.com/contact/","email":"info@droponair.com"},"dist":{"shasum":"c9d90b0ed48000b4c755fe7c745de8a52c1a9c3d","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.27.0.tgz","fileCount":48,"integrity":"sha512-52o64J10n/2Jj0IDn96Cr4wuLtPF22TbRSFOFzXaO2wtcvDCOCOd5ro9fVbGga2e0Cv3Pq1zYkSn0WX0p2Pm1Q==","signatures":[{"sig":"MEYCIQCGTYkQL4JFNYp/Xknhxy8K0hSnkursdEK6glWJENKjPAIhAPA7JfhPGtLz0sMVSfolaqboOtNdz4OpMMRUKXrol/H4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":384307},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"d34d902bbf65f1ccde799528f0a12191ffc0ce3a","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"End-to-end encrypted messaging, voice and video calling SDK. The relay never sees your keys or message content.","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","esbuild":"^0.28.2","ts-jest":"^29.4.12","ts-node":"^10.9.2","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^20.0.0","@playwright/test":"^1.62.1"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.27.0_1788418043767_0.5385814216538092","host":"s3://npm-registry-packages-npm-production"}},"0.28.0":{"name":"@droponair/sdk-js","version":"0.28.0","keywords":["e2ee","end-to-end-encryption","encrypted-chat","chat-api","chat-sdk","messaging","messaging-sdk","realtime","websocket","webrtc","voice-calls","video-calls","video-calling","group-chat","push-notifications","sdk","droponair"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.28.0","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://www.droponair.com/","bugs":{"url":"https://www.droponair.com/contact/","email":"info@droponair.com"},"dist":{"shasum":"0510a77f3e05f054a3af882cf7d000a986a6562f","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.28.0.tgz","fileCount":48,"integrity":"sha512-pIvCuuzqHH+qricusJKtBZTGegHkoTcx9EWrVP92mRB2cKSIQQD0TIJMvVNB6hitrTC3RbN06y6JsRVgPsw7Dw==","signatures":[{"sig":"MEUCIHwR9WcHnx+lAiZ9mqsOEKLkmec5RpL4QEDH2r2XYPSmAiEAvwkIG0zu58/ZkEmniShqTQT+/L18dhidiYpCwqm8Y2w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":386930},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"6f113cb2caf837cc66325b19532c0484465c2e30","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"End-to-end encrypted messaging, voice and video calling SDK. The relay never sees your keys or message content.","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","esbuild":"^0.28.2","ts-jest":"^29.4.12","ts-node":"^10.9.2","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^20.0.0","@playwright/test":"^1.62.1"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.28.0_1788424279581_0.3727722083418785","host":"s3://npm-registry-packages-npm-production"}},"0.29.0":{"name":"@droponair/sdk-js","version":"0.29.0","keywords":["e2ee","end-to-end-encryption","encrypted-chat","chat-api","chat-sdk","messaging","messaging-sdk","realtime","websocket","webrtc","voice-calls","video-calls","video-calling","group-chat","push-notifications","sdk","droponair"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.29.0","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://www.droponair.com/","bugs":{"url":"https://www.droponair.com/contact/","email":"info@droponair.com"},"dist":{"shasum":"d9353fff441ec18ad8ed808be21946473f074339","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.29.0.tgz","fileCount":48,"integrity":"sha512-DMmdC2z08cDNblfUOJMqzYr8hfZZf9bHppDqhk2qnYKJIOWYYNXazwg/KNxiAD86uBlNtIenT8rPnAz8lfMViQ==","signatures":[{"sig":"MEQCIDUf8kRHr1fudQ9IE4hbqvbkneqrX/jJdSWhw7pkq0poAiBvp/yOqXvj3uW/2RQjXQLaKyycKkhQV8v6+qCPV0SqwA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":390469},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"f9ff1e3d4f8bc123b56a4e14d193ada07a753ee6","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"End-to-end encrypted messaging, voice and video calling SDK. The relay never sees your keys or message content.","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","esbuild":"^0.28.2","ts-jest":"^29.4.12","ts-node":"^10.9.2","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^20.0.0","@playwright/test":"^1.62.1"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.29.0_1788426136406_0.34571773212245294","host":"s3://npm-registry-packages-npm-production"}},"0.30.0":{"name":"@droponair/sdk-js","version":"0.30.0","keywords":["e2ee","end-to-end-encryption","encrypted-chat","chat-api","chat-sdk","messaging","messaging-sdk","realtime","websocket","webrtc","voice-calls","video-calls","video-calling","group-chat","push-notifications","sdk","droponair"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.30.0","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://www.droponair.com/","bugs":{"url":"https://www.droponair.com/contact/","email":"info@droponair.com"},"dist":{"shasum":"8a3c812cbdecf5d9b66034975a12d079de486762","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.30.0.tgz","fileCount":48,"integrity":"sha512-2fz0b4Kj3XsAZJ9Sd2P90nJEtWJpD5KsTMfd00S0jg0AIWb3U8LjDRhjFOrp1zpQhIcPr9WD7LcRqbWp1XWdzg==","signatures":[{"sig":"MEYCIQCAOVUvpULviJY3fkFLBnlH7Bws4Y2qE6oQ9lZxzSOzkQIhAN91JfbeR/tqF2HgNDGeh22GEMaVrhv4pr/DZbH1tbkc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":394772},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"4790da94c73805348059c9aef3b6eaa5bb55f59f","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"End-to-end encrypted messaging, voice and video calling SDK. The relay never sees your keys or message content.","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","esbuild":"^0.28.2","ts-jest":"^29.4.12","ts-node":"^10.9.2","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^20.0.0","@playwright/test":"^1.62.1"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.30.0_1788435056790_0.20072491912978796","host":"s3://npm-registry-packages-npm-production"}},"0.31.0":{"name":"@droponair/sdk-js","version":"0.31.0","keywords":["e2ee","end-to-end-encryption","encrypted-chat","chat-api","chat-sdk","messaging","messaging-sdk","realtime","websocket","webrtc","voice-calls","video-calls","video-calling","group-chat","push-notifications","sdk","droponair"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.31.0","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://www.droponair.com/","bugs":{"url":"https://www.droponair.com/contact/","email":"info@droponair.com"},"dist":{"shasum":"951d19b55be328d00ff9de0b3041b86209d59fbb","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.31.0.tgz","fileCount":48,"integrity":"sha512-deJpHrDro2tMVHIZjMjy/x37f9ash6vxQP/aQASvQ9quUECSeb+k0MCMd+VGD3yVG1DpgeceQWwylEwVbME2Fg==","signatures":[{"sig":"MEQCIA5pahbroOyF8nOaswabbwZLjaUvuEvL8s0xg3P14nd6AiAC9pTkO/DRAm9wVDQK37gCt+hIxnnwy+QvlHZw+kX0cQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIFzmbi0bRUYYwFrcFt9E4SBMJUA+laR1NempFu3M3N1wAiBCHz7V3hvCef3qDlRcG+X5AcdPeNbROH9jPpjfAHTCUA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":396529},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"a1e531d1f832d9e28faf90537e75fb948b6eb02f","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"End-to-end encrypted messaging, voice and video calling SDK. The relay never sees your keys or message content.","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","esbuild":"^0.28.2","ts-jest":"^29.4.12","ts-node":"^10.9.2","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^20.0.0","@playwright/test":"^1.62.1"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.31.0_1788462864994_0.46444662495923517","host":"s3://npm-registry-packages-npm-production"}},"0.32.0":{"name":"@droponair/sdk-js","version":"0.32.0","keywords":["e2ee","end-to-end-encryption","encrypted-chat","chat-api","chat-sdk","messaging","messaging-sdk","realtime","websocket","webrtc","voice-calls","video-calls","video-calling","group-chat","push-notifications","sdk","droponair"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.32.0","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://www.droponair.com/","bugs":{"url":"https://www.droponair.com/contact/","email":"info@droponair.com"},"dist":{"shasum":"f0b2814d8846a3697c5b16ff3aa197176ebafe39","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.32.0.tgz","fileCount":48,"integrity":"sha512-eEQxewixGWTYdrWBJp34eA4QQowucbDpmUsCv0vidAiGWwKv5VYQ7qkGi6QknM6SohYfmAMX1bh+tZPoeRCUsQ==","signatures":[{"sig":"MEYCIQC01esqmpQR36Aia4D6Jo0QCvUiXBv6y2aQdWoGRtGQagIhAPaJVizhbZD+xXpWKVRafBJSlJ5XaReUDzH5lkmiK1TJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCtXfGuxXAZJGkEkir4aKujq5VFQtK913ziMY3+nT5cDAIhAJgM5XEdXPdmfCXdBCWnYOEbwaRKhXCco9xuHNh7MEfS","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":401677},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"42c80bd3c2b019af480c00a0266fc6c7ce037a67","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"End-to-end encrypted messaging, voice and video calling SDK. The relay never sees your keys or message content.","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","esbuild":"^0.28.2","ts-jest":"^29.4.12","ts-node":"^10.9.2","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^20.0.0","@playwright/test":"^1.62.1"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.32.0_1788565199733_0.961907157995094","host":"s3://npm-registry-packages-npm-production"}},"0.32.1":{"name":"@droponair/sdk-js","version":"0.32.1","keywords":["e2ee","end-to-end-encryption","encrypted-chat","chat-api","chat-sdk","messaging","messaging-sdk","realtime","websocket","webrtc","voice-calls","video-calls","video-calling","group-chat","push-notifications","sdk","droponair"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.32.1","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://www.droponair.com/","bugs":{"url":"https://www.droponair.com/contact/","email":"info@droponair.com"},"dist":{"shasum":"388d828a940ba1cdc960e924aaf173f4a8826858","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.32.1.tgz","fileCount":48,"integrity":"sha512-w1nosXpr1VmpFgWuNRKRob1B+xRJD0R4/2nMl2kBoWWLVfVTD5AjGuBLLceGhqd8kHfsxtaBkyK6r7CiAYYNXA==","signatures":[{"sig":"MEUCIA3R7rAldzq+P/kgjwZsW01zL0vTUD0t7EUy+bbXPVzIAiEAry16lvEgiuQXVMrATthhCi/1GtEcPtH5AH2YCVmn81o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIGmGTXBDmoCT0GcamtD5UwdPlpzY0fERUeVaQTj+o/OmAiEA4SP7dbymbHBrjKh74ynoHFh2DAE2PONP7Dqs7P8F/hU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":403465},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"ceaf0f2c9a5621a606f75ad9896ad740a0fd0240","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"End-to-end encrypted messaging, voice and video calling SDK. The relay never sees your keys or message content.","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","esbuild":"^0.28.2","ts-jest":"^29.4.12","ts-node":"^10.9.2","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^20.0.0","@playwright/test":"^1.62.1"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.32.1_1789462155378_0.5704547458414031","host":"s3://npm-registry-packages-npm-production"}},"0.33.0":{"name":"@droponair/sdk-js","version":"0.33.0","keywords":["e2ee","end-to-end-encryption","encrypted-chat","chat-api","chat-sdk","messaging","messaging-sdk","realtime","websocket","webrtc","voice-calls","video-calls","video-calling","group-chat","push-notifications","sdk","droponair"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.33.0","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://www.droponair.com/","bugs":{"url":"https://www.droponair.com/contact/","email":"info@droponair.com"},"dist":{"shasum":"232eb1d4fb6f26298ee4fe2ca90767a2d42c6fad","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.33.0.tgz","fileCount":48,"integrity":"sha512-AKLjHJ/YCoU379UxZmq/leIs/23hsPcPYwNCP+Qi94Q8ZUwaa028jTsBt5vxJ4x2xebIvXUlLW2Sg5zKilbyIg==","signatures":[{"sig":"MEQCIFyd5KvyVOL2ecqKFbpcM9OzT39yKc51QWKQC64t7xfaAiAYl6zJde2VQHeXzAXsPck+/jHs/dhI9VWqY6Z9Ud38/w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIAUWec6wvTA2eChhPYlVXDwi0kbnWGHPzcR+1TqTjACAAiAuC2zXJBJwcXwqMK9sOvMLpTBFsaGoJenWHcvBdJbNuw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":422533},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"fcd4ad2d5977bb3a7698067567df1ce8746e13d0","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"End-to-end encrypted messaging, voice and video calling SDK. The relay never sees your keys or message content.","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","esbuild":"^0.28.2","ts-jest":"^29.4.12","ts-node":"^10.9.2","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^20.0.0","@playwright/test":"^1.62.1"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.33.0_1789505524842_0.020953279580603557","host":"s3://npm-registry-packages-npm-production"}},"0.34.0":{"name":"@droponair/sdk-js","version":"0.34.0","keywords":["e2ee","end-to-end-encryption","encrypted-chat","chat-api","chat-sdk","messaging","messaging-sdk","realtime","websocket","webrtc","voice-calls","video-calls","video-calling","group-chat","push-notifications","sdk","droponair"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.34.0","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://www.droponair.com/","bugs":{"url":"https://www.droponair.com/contact/","email":"info@droponair.com"},"dist":{"shasum":"7c98ef95b6cac9fe58c44a5c68d5f757c48bd290","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.34.0.tgz","fileCount":48,"integrity":"sha512-MnB7Wzmj50jLvngyOp3geSe76Cvx8xoTN6nYwbwniDGjscPJTJ1oTzVIH6lZv4FsNfsMUHeql4E0YXqPUsPnYg==","signatures":[{"sig":"MEUCIQDxOtErzOXfaPRr8OTq60W9Zi/tG7Z/XEheOCze6DUyegIgOI1RuVlIglTFlcZoah+V7WPHD9uNukwr/C6uDl9Jgzg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIGGRzCx/RJ+mb8rXA2LxzKcpifnRysXvFiEu9dWRYrbfAiEAvMMg3O+wfoF0674zv4oqUANuwAM0Ys5JysfNxgQ/anI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":425890},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"a53a825d2c996ee091cadbf0c5df181be1ba6bb2","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"End-to-end encrypted messaging, voice and video calling SDK. The relay never sees your keys or message content.","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","esbuild":"^0.28.2","ts-jest":"^29.4.12","ts-node":"^10.9.2","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^20.0.0","@playwright/test":"^1.62.1"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.34.0_1789592383029_0.7179737723060309","host":"s3://npm-registry-packages-npm-production"}},"0.34.1":{"name":"@droponair/sdk-js","version":"0.34.1","keywords":["e2ee","end-to-end-encryption","encrypted-chat","chat-api","chat-sdk","messaging","messaging-sdk","realtime","websocket","webrtc","voice-calls","video-calls","video-calling","group-chat","push-notifications","sdk","droponair"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.34.1","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://www.droponair.com/","bugs":{"url":"https://www.droponair.com/contact/","email":"info@droponair.com"},"dist":{"shasum":"3f3354560afbac5bbd028988a9b833c8a3d61f1d","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.34.1.tgz","fileCount":48,"integrity":"sha512-zbrK34MmdQTYvJcLht5VEYRCDKESx14alvejav/Gqkr3sf+FTgHfa17eKsffCmrG/EjwTGjoS2Mh05+JB4M5vA==","signatures":[{"sig":"MEUCIBCAJe84mCRjc/mJXQE5y9UUD+r7g+16UnswAA2LL8aGAiEAvLvaMTLwCKEg1V7uO8uJJsg1fKuI9yHm5LT1u2Fd4z8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIAo8hASq0HHsJqRWOs6OuuU88jkJQTG8KYoPqTM29BnAAiEA6JPjCKESaJYq0h2tnfAt+9HHVrdrt1d6xkpi1bDkZkY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":427455},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"b433990c526c613c92d0659aedef0c32b6f589cb","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"End-to-end encrypted messaging, voice and video calling SDK. The relay never sees your keys or message content.","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","esbuild":"^0.28.2","ts-jest":"^29.4.12","ts-node":"^10.9.2","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^20.0.0","@playwright/test":"^1.62.1"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.34.1_1789628030429_0.3512891471822783","host":"s3://npm-registry-packages-npm-production"}},"0.34.2":{"name":"@droponair/sdk-js","version":"0.34.2","keywords":["e2ee","end-to-end-encryption","encrypted-chat","chat-api","chat-sdk","messaging","messaging-sdk","realtime","websocket","webrtc","voice-calls","video-calls","video-calling","group-chat","push-notifications","sdk","droponair"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.34.2","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://www.droponair.com/","bugs":{"url":"https://www.droponair.com/contact/","email":"info@droponair.com"},"dist":{"shasum":"f62c94a5428aeb5a138520d98a52b2989dad0c31","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.34.2.tgz","fileCount":48,"integrity":"sha512-Rvs8mu/NdaW1wcYxWCBa0nAIrlIPItLFYK5t0iIzusvRfQtwDXrSlGqyLbcAHt2l7FB079Di4HG6PvUhskivKg==","signatures":[{"sig":"MEUCIFhvEd5HxaU6bHT2qn5xKquVch9BQMt1WgAhI2qj8aMUAiEA7hH5HQMKzPre9h8M12vdhkDDUo6Jsnm7n50ylpFoydc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCeELkzx6S0NN9Pb/ySyCp/TQAsAmiFCjwOYtXkiVnYewIgA0+iAZFG1tBEbd7hkuk/izfKH6cDMMVbB9X6X0yYV+o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":428189},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"053f099451c2c271830abff1f7a920bb06e24a77","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"End-to-end encrypted messaging, voice and video calling SDK. The relay never sees your keys or message content.","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","esbuild":"^0.28.2","ts-jest":"^29.4.12","ts-node":"^10.9.2","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^20.0.0","@playwright/test":"^1.62.1"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.34.2_1789631660798_0.08932847188880233","host":"s3://npm-registry-packages-npm-production"}},"0.35.0":{"name":"@droponair/sdk-js","version":"0.35.0","keywords":["e2ee","end-to-end-encryption","encrypted-chat","chat-api","chat-sdk","messaging","messaging-sdk","realtime","websocket","webrtc","voice-calls","video-calls","video-calling","group-chat","push-notifications","sdk","droponair"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.35.0","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://www.droponair.com/","bugs":{"url":"https://www.droponair.com/contact/","email":"info@droponair.com"},"dist":{"shasum":"c67aaa784eb21a6fde34f17c1bf78bd77281e2fd","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.35.0.tgz","fileCount":48,"integrity":"sha512-W74CExvXSvweQeByIkFT+HgsP6TyEfJVp29jFIXQQ0YX2zho5rVtuLLO9douy34x3E/jFux3Lr0B7pI3GquMQQ==","signatures":[{"sig":"MEUCIH2ZgxZtW1vYEff7Ic8IhQORJ26UISEFoHSxMhdMIYpDAiEA+eLwVQvIXU8V3rdwT36UNVQcgzs5lj2Ewe1iCyTS7r0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIAiat6GAFoNyIOTIHpQ/0Ouu0rBAopeGWCXMQbln03ajAiAlWmy2G2FBS7yWnx5SXSsf9FGM+sBNJjfdyhqWAQcmvw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":433298},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"e0da839507def8b231739a0ddd33208c7ff4fd97","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"End-to-end encrypted messaging, voice and video calling SDK. The relay never sees your keys or message content.","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","esbuild":"^0.28.2","ts-jest":"^29.4.12","ts-node":"^10.9.2","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^20.0.0","@playwright/test":"^1.62.1"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.35.0_1789650353285_0.8343883285590012","host":"s3://npm-registry-packages-npm-production"}},"0.36.0":{"name":"@droponair/sdk-js","version":"0.36.0","keywords":["e2ee","end-to-end-encryption","encrypted-chat","chat-api","chat-sdk","messaging","messaging-sdk","realtime","websocket","webrtc","voice-calls","video-calls","video-calling","group-chat","push-notifications","sdk","droponair"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.36.0","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://www.droponair.com/","bugs":{"url":"https://www.droponair.com/contact/","email":"info@droponair.com"},"dist":{"shasum":"007073fedf56eec8624c49ab7dd4b7a38d160875","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.36.0.tgz","fileCount":48,"integrity":"sha512-UecfygJBA4Wi9HSfaBOrXGDe/zIt0CUAxcs1520JEMEavoHMGiLYKinlm/0r0jjBKvKIF74kpU2/FbX/F2SHaQ==","signatures":[{"sig":"MEUCIQDfQyTjtQpQ1EtsIT+9TNTwEjUP+WOScBejUf6OeRbX8QIgLrgP6PlPIJjnnmfcRn4pZQ00+gU0NLAD1GjsyjCO9e0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDqc6AXoWltkHLMMLMIibAPDgDS1F0LuYfIuGru3SCU0gIgEUPsUIYiOanYeQiEUKfJfA2jy6UQJnricwCAoeTcmvY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":435365},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"38475ae59e9675e1f1397bc2a8d47b93f903afc7","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"End-to-end encrypted messaging, voice and video calling SDK. The relay never sees your keys or message content.","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","esbuild":"^0.28.2","ts-jest":"^29.4.12","ts-node":"^10.9.2","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^20.0.0","@playwright/test":"^1.62.1"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.36.0_1789680596593_0.5455379438155599","host":"s3://npm-registry-packages-npm-production"}},"0.37.0":{"name":"@droponair/sdk-js","version":"0.37.0","keywords":["e2ee","end-to-end-encryption","encrypted-chat","chat-api","chat-sdk","messaging","messaging-sdk","realtime","websocket","webrtc","voice-calls","video-calls","video-calling","group-chat","push-notifications","sdk","droponair"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.37.0","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://www.droponair.com/","bugs":{"url":"https://www.droponair.com/contact/","email":"info@droponair.com"},"dist":{"shasum":"df3ea66284471bf432801685b445e3b23d974f38","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.37.0.tgz","fileCount":48,"integrity":"sha512-cJOdvJjg3Z9mqmiD7pE/qkGj69eAbz5bUeejUC7MWJzEnBpVqhEgPesIfHHpVac5j7pvmrBnaAk4YWOZs7CSqQ==","signatures":[{"sig":"MEUCIQDUncuglTGmvXYcwGJAZiOfgX371sP7xrHSOtCkFag9WAIgYMwG5fBgD9plk/pzpKFfud/jHN43dX3vyMUCeLLFplA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIDoyykJA9HMml8OAQiPBMcYVazl/Iy5ksmJPWch7lq+QAiEA+YNBP1zwnADZpBA3eOl2ta0o3Pae02fi3b/kgDES1JU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":441071},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"975f57c8a16de227cd186988988d96ece9183443","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"End-to-end encrypted messaging, voice and video calling SDK. The relay never sees your keys or message content.","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","esbuild":"^0.28.2","ts-jest":"^29.4.12","ts-node":"^10.9.2","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^20.0.0","@playwright/test":"^1.62.1"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.37.0_1789684916658_0.8922967826949573","host":"s3://npm-registry-packages-npm-production"}},"0.38.0":{"name":"@droponair/sdk-js","version":"0.38.0","keywords":["e2ee","end-to-end-encryption","encrypted-chat","chat-api","chat-sdk","messaging","messaging-sdk","realtime","websocket","webrtc","voice-calls","video-calls","video-calling","group-chat","push-notifications","sdk","droponair"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.38.0","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://www.droponair.com/","bugs":{"url":"https://www.droponair.com/contact/","email":"info@droponair.com"},"dist":{"shasum":"bb747c7712f9f958d10303bd1b69f520c89f6c71","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.38.0.tgz","fileCount":48,"integrity":"sha512-qqsCSAfNuYEkMGglgf4hIEcu+wd1BVZWCpCFgp0c6OPoOEwOCAU3b3kTBIXqbaT6YU2LdYdnvdDQbFUaOWvevA==","signatures":[{"sig":"MEUCIQCuQSmmU4UMi6Sx0i54OlFNnEDic3ADEVlct+qZChpbfAIgKlNfnm2YxaxqVPyNnQCVXF2y17q9VdoRfM2uWd3CV2E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIBxoHj8a5o1ljTA94HDT4Gd6gaS1rRbpvYB/KFNsCa/gAiEAhYXTkQcxSUf8sdug7MMwOMQphRf6cChGARCAxNv/CuM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":444174},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"9df574cb79cdffa0f0a532ff0ab6cd8de3051424","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"End-to-end encrypted messaging, voice and video calling SDK. The relay never sees your keys or message content.","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","esbuild":"^0.28.2","ts-jest":"^29.4.12","ts-node":"^10.9.2","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^20.0.0","@playwright/test":"^1.62.1"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.38.0_1789827963790_0.09552257537527353","host":"s3://npm-registry-packages-npm-production"}},"0.39.0":{"name":"@droponair/sdk-js","version":"0.39.0","keywords":["e2ee","end-to-end-encryption","encrypted-chat","chat-api","chat-sdk","messaging","messaging-sdk","realtime","websocket","webrtc","voice-calls","video-calls","video-calling","group-chat","push-notifications","sdk","droponair"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.39.0","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://www.droponair.com/","bugs":{"url":"https://www.droponair.com/contact/","email":"info@droponair.com"},"dist":{"shasum":"35eb210283feba9e364deab45c842c8bf7055b66","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.39.0.tgz","fileCount":50,"integrity":"sha512-pCooajBG6Mw3xn4a7CKoN8jCZ1YF5azHg+Wna0yVr9MGUCq9qzCHjyM7xJSw2bKu3itWrmZY0/cgHGyq9Fp64A==","signatures":[{"sig":"MEQCIEyNGeKXKzkmZKB/hnVlAa2zJ0SLShY3yN/2uIMddK3aAiAp9OgcxOQmYQRVFV7fDI1NtV/CGGTxQLhmszDX/YUUpg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDu1f1In80je9qw7bpRxa0+U452cLRim2X6dnGisO67wQIhANQCkfuf2ZUuwuC0J4kPP2LR0AKYnK+iF46O0obergb7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":454003},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"52ef5c20d4528e3537a1ddbc1a1c38fa89363604","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"End-to-end encrypted messaging, voice and video calling SDK. The relay never sees your keys or message content.","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","esbuild":"^0.28.2","ts-jest":"^29.4.12","ts-node":"^10.9.2","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^20.0.0","@playwright/test":"^1.62.1"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.39.0_1790082856980_0.904866959650857","host":"s3://npm-registry-packages-npm-production"}},"0.40.0":{"name":"@droponair/sdk-js","version":"0.40.0","keywords":["e2ee","end-to-end-encryption","encrypted-chat","chat-api","chat-sdk","messaging","messaging-sdk","realtime","websocket","webrtc","voice-calls","video-calls","video-calling","group-chat","push-notifications","sdk","droponair"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.40.0","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://www.droponair.com/","bugs":{"url":"https://www.droponair.com/contact/","email":"info@droponair.com"},"dist":{"shasum":"0b0c3163702a4dae90a0a9f98f8157f8bfefa5e0","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.40.0.tgz","fileCount":50,"integrity":"sha512-sSU6Q5T130VJrR11BH53836aT9P96yFitLFP0Kz8oSYmakCqpJnRlXrkjp/gUEQ+b25x+GDw/yE2TXWybNekUQ==","signatures":[{"sig":"MEUCIQDGkzg4rGCSVue4uW9xTyIzXGAMqHTHT0S2roo80Y6AQQIgTeCpS3+XJXkLMsoK2o7rOp9zTY5D5ncSt7aUO96XAqw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIAX1LCRjTVsr1MHwdtX6D76Tg2e6DYLAUQpChlQd6VhbAiAfFf6i+nW2NpLASBVmFJG8Yosp/6yLg6TpGFNoxAmWdg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":461975},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"0751362a149dcab863090832c0f19be4942fc9b3","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"End-to-end encrypted messaging, voice and video calling SDK. The relay never sees your keys or message content.","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","esbuild":"^0.28.2","ts-jest":"^29.4.12","ts-node":"^10.9.2","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^20.0.0","@playwright/test":"^1.62.1"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.40.0_1790091339698_0.16102505947435364","host":"s3://npm-registry-packages-npm-production"}},"0.41.0":{"name":"@droponair/sdk-js","version":"0.41.0","keywords":["e2ee","end-to-end-encryption","encrypted-chat","chat-api","chat-sdk","messaging","messaging-sdk","realtime","websocket","webrtc","voice-calls","video-calls","video-calling","group-chat","push-notifications","sdk","droponair"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.41.0","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://www.droponair.com/","bugs":{"url":"https://www.droponair.com/contact/","email":"info@droponair.com"},"dist":{"shasum":"d4d9ffcd692a393718a49573da7b85493b028db4","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.41.0.tgz","fileCount":50,"integrity":"sha512-KGBYoGq6oNBXDNF2c/U0bwSq6i/dEAixvyeFD2USuSs2bh6mlMqNsBEjGUZwwzHul0KnKX4OAkuF0v+tnVi2qQ==","signatures":[{"sig":"MEUCIEwHV4hGHNUp88nbYfcHbxvp2bY0o1H+q6e90V3pl+Q3AiEAoNIC+Uip8r8YCApINs8EAagjqFEoaT8/wlacGk7/39M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQD5qGrTt1dg3XQWwsep2CchIAE1WWSx3t4ix44ufVzmrgIgIudat69g18Ybj1JCuJ6+NS0TR3Dv7g2pXpR3JG0geN8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":464045},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"3dc3d6b0e9b2144f61a7d1ed5079ace13ea19a98","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"End-to-end encrypted messaging, voice and video calling SDK. The relay never sees your keys or message content.","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","esbuild":"^0.28.2","ts-jest":"^29.4.12","ts-node":"^10.9.2","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^20.0.0","@playwright/test":"^1.62.1"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.41.0_1790113815216_0.47936049366191513","host":"s3://npm-registry-packages-npm-production"}},"0.42.0":{"name":"@droponair/sdk-js","version":"0.42.0","keywords":["e2ee","end-to-end-encryption","encrypted-chat","chat-api","chat-sdk","messaging","messaging-sdk","realtime","websocket","webrtc","voice-calls","video-calls","video-calling","group-chat","push-notifications","sdk","droponair"],"author":{"name":"DropOnAir"},"license":"MIT","_id":"@droponair/sdk-js@0.42.0","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"homepage":"https://www.droponair.com/","bugs":{"url":"https://www.droponair.com/contact/","email":"info@droponair.com"},"dist":{"shasum":"389a07a06ee49b85e702342ba17819d64823beb6","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.42.0.tgz","fileCount":50,"integrity":"sha512-8Oaw1lqfjCEyd1UmWhWksHh3405MRrClkq6RAdWwN8a0+aBSySXNva/fTk5p5QbM3NjtKt8fw2wzblB2inh4ew==","signatures":[{"sig":"MEYCIQDgA/ZIpScFVR0+TAPdXenSmz4y8fQ8MIMBwSL47FvQPwIhAO4fpQrd2TyvIRfXfiTvZADwp0pmyejNNTSfbHeLKYXk","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIE/usrtgI1ggk5ZNLQ5Q8iFD+sUAyCf9ZesvRruWiW3gAiBAlKxtMBkPhIjjySSRssBPOKF0oG6g8JPAUqe0MBmd0A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":469092},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"7cb7ad75d58f5c2ce91d77218b9f94d389053974","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"_npmVersion":"11.6.2","description":"End-to-end encrypted messaging, voice and video calling SDK. The relay never sees your keys or message content.","directories":{},"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","esbuild":"^0.28.2","ts-jest":"^29.4.12","ts-node":"^10.9.2","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^20.0.0","@playwright/test":"^1.62.1"},"_npmOperationalInternal":{"tmp":"tmp/sdk-js_0.42.0_1790148413826_0.4751655028821866","host":"s3://npm-registry-packages-npm-production"}},"0.43.0":{"_id":"@droponair/sdk-js@0.43.0","bugs":{"url":"https://www.droponair.com/contact/","email":"info@droponair.com"},"dist":{"shasum":"f1a7860f6c90d625ec3d18a1859ce31c162592b9","tarball":"https://registry.npmjs.org/@droponair/sdk-js/-/sdk-js-0.43.0.tgz","fileCount":50,"integrity":"sha512-EeGos3aUqoUf7A8WrtmbYe0UZWXj7oXhOxDX/tdcCehCoqDGjVgoM9/HH4Q4mO+o+/+xrnCmOMF7Id+5kBqiwQ==","signatures":[{"sig":"MEYCIQCTHlEtmOQBmrHAnAvPWbCZw4Zv4rkRm/KtJeyHJix22AIhAL2vY02KYUi/Lb0Yvg8ZOG47rXUx9uuvbmfIv5MfcCdk","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIEGccP5oR9BQ2X/4Qvb2L/O/2p0JDb2lpW/O3sB/dX3HAiBqZmW17SdfAXGvTPS4fEt/atgIRdq8XoFfvaRFugBFFw=="}],"unpackedSize":469092},"main":"dist/index.js","name":"@droponair/sdk-js","types":"dist/index.d.ts","author":{"name":"DropOnAir"},"engines":{"node":">=18.0.0"},"gitHead":"0e2a11982ba4fe6ce7237ac14985f9c41633f19e","license":"MIT","scripts":{"lint":"eslint src","test":"jest","build":"tsc","smoke":"ts-node smoke/messaging-client-smoke.ts","prepublishOnly":"npm run build"},"version":"0.43.0","_npmUser":{"name":"moradabadi","email":"info@droponair.com"},"homepage":"https://www.droponair.com/","keywords":["e2ee","end-to-end-encryption","encrypted-chat","chat-api","chat-sdk","messaging","messaging-sdk","realtime","websocket","webrtc","voice-calls","video-calls","video-calling","group-chat","push-notifications","sdk","droponair"],"_npmVersion":"11.6.2","description":"End-to-end encrypted messaging, voice and video calling SDK. The relay never sees your keys or message content.","directories":{},"maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"_nodeVersion":"22.12.0","dependencies":{"tweetnacl":"^1.0.3","protobufjs":"^7.4.0","tweetnacl-util":"^0.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","esbuild":"^0.28.2","ts-jest":"^29.4.12","ts-node":"^10.9.2","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^20.0.0","@playwright/test":"^1.62.1"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sdk-js_0.43.0_1790231612028_0.7753779943557662"}}},"time":{"created":"2026-04-18T12:39:45.157Z","modified":"2026-09-24T06:33:32.313Z","0.3.0":"2026-04-18T12:39:45.434Z","0.3.1":"2026-04-18T12:59:32.826Z","0.4.0":"2026-04-23T12:59:24.780Z","0.5.0":"2026-05-18T05:36:06.612Z","0.6.0":"2026-05-18T22:52:46.693Z","0.7.0":"2026-05-19T06:38:08.065Z","0.8.0":"2026-05-19T10:41:57.437Z","0.9.0":"2026-05-19T18:42:22.445Z","0.9.1":"2026-05-19T19:16:07.789Z","0.10.0":"2026-05-20T07:51:34.237Z","0.11.0":"2026-05-20T08:35:46.497Z","0.12.0":"2026-05-20T09:24:29.508Z","0.13.0":"2026-05-21T12:49:56.603Z","0.13.1":"2026-05-21T16:03:34.054Z","0.14.0":"2026-05-21T18:15:29.489Z","0.15.0":"2026-05-21T19:13:08.716Z","0.16.0":"2026-05-21T22:00:17.058Z","0.17.0":"2026-05-23T14:13:04.506Z","0.18.0":"2026-05-23T19:22:29.836Z","0.19.0":"2026-05-24T09:43:43.419Z","0.21.0":"2026-05-24T20:28:27.358Z","0.22.0":"2026-05-25T11:13:23.847Z","0.22.1":"2026-05-31T20:01:21.171Z","0.23.0":"2026-06-01T09:27:06.747Z","0.23.1":"2026-06-03T22:30:08.105Z","0.23.2":"2026-06-04T09:05:14.520Z","0.24.0":"2026-07-30T07:30:39.808Z","0.24.1":"2026-07-31T18:14:47.223Z","0.24.2":"2026-07-31T20:23:44.444Z","0.24.3":"2026-08-02T12:30:59.628Z","0.25.0":"2026-08-21T18:52:20.735Z","0.25.1":"2026-08-21T20:37:54.995Z","0.26.0":"2026-09-02T22:16:18.930Z","0.27.0":"2026-09-03T06:47:23.934Z","0.28.0":"2026-09-03T08:31:19.722Z","0.29.0":"2026-09-03T09:02:16.575Z","0.30.0":"2026-09-03T11:30:56.918Z","0.31.0":"2026-09-03T19:14:25.139Z","0.32.0":"2026-09-04T23:39:59.822Z","0.32.1":"2026-09-15T08:49:15.473Z","0.33.0":"2026-09-15T20:52:04.936Z","0.34.0":"2026-09-16T20:59:43.122Z","0.34.1":"2026-09-17T06:53:50.549Z","0.34.2":"2026-09-17T07:54:20.919Z","0.35.0":"2026-09-17T13:05:53.379Z","0.36.0":"2026-09-17T21:29:56.699Z","0.37.0":"2026-09-17T22:41:56.740Z","0.38.0":"2026-09-19T14:26:03.890Z","0.39.0":"2026-09-22T13:14:17.071Z","0.40.0":"2026-09-22T15:35:39.790Z","0.41.0":"2026-09-22T21:50:15.317Z","0.42.0":"2026-09-23T07:26:53.967Z","0.43.0":"2026-09-24T06:33:32.114Z"},"bugs":{"url":"https://www.droponair.com/contact/","email":"info@droponair.com"},"author":{"name":"DropOnAir"},"license":"MIT","homepage":"https://www.droponair.com/","keywords":["e2ee","end-to-end-encryption","encrypted-chat","chat-api","chat-sdk","messaging","messaging-sdk","realtime","websocket","webrtc","voice-calls","video-calls","video-calling","group-chat","push-notifications","sdk","droponair"],"description":"End-to-end encrypted messaging, voice and video calling SDK. The relay never sees your keys or message content.","maintainers":[{"name":"moradabadi","email":"info@droponair.com"}],"readme":"# DropOnAir JS SDK\n\nEnd-to-end encrypted messaging, group chat, voice/video calls, and broadcast channels for any app.\n\nDropOnAir operates as a **blind encrypted relay** - your users' encryption keys and message content never leave their devices.\n\n## Getting Started\n\n1. Create a free account at [panel.droponair.com](https://panel.droponair.com)\n2. Create an app in the dashboard to get your **App ID** and **Public API Key**\n3. Install the SDK:\n\n## Installation\n\n```bash\nnpm install @droponair/sdk-js\n```\n\n## Quick Start\n\n```typescript\nimport { initialize } from '@droponair/sdk-js';\n\nconst client = await initialize({\n  appId: 'your-app-id',                  // From the DropOnAir dashboard\n  publicApiKey: 'your-public-api-key',    // From the DropOnAir dashboard\n  getUserJwt: async () => {\n    const res = await fetch('/api/auth/me', { credentials: 'include' });\n    const { jwt } = await res.json();\n    return jwt;\n  },\n  keyDirectoryEndpoint: '/api/messaging/keys',\n  tokenExchangeEndpoint: '/api/messaging/token-exchange',\n});\n\n// Listen for incoming messages (already decrypted)\nclient.onMessage(({ fromUserId, plaintext, timestamp }) => {\n  console.log(`${fromUserId}: ${plaintext}`);\n});\n\n// Send an E2EE message\nawait client.sendMessage('recipient-user-id', 'Hello!');\n```\n\n## Features\n\n- **E2EE Messaging** - X25519 key agreement, AES-256-GCM encryption, multi-device support\n- **Message Edit & Delete** - Edit sent messages or tombstone them for everyone or only your own devices\n- **Cleartext Messaging** - Lightweight messages without E2EE overhead\n- **Broadcast Channels** - Pub/sub for announcements and notifications\n- **Group Messaging** - Server-managed groups with member roles\n- **Voice & Video Calls** - 1-to-1 WebRTC call signaling with TURN support\n- **Group Calls** - Mesh WebRTC group calls with per-participant signaling\n- **Offline Delivery** - Messages queued and delivered when recipients reconnect\n- **Multi-Device** - Per-device encryption with automatic self-sync\n\n## API Reference\n\n### Initialization\n\n```typescript\nconst client = await initialize(options);\n```\n\n| Option | Type | Required | Description |\n|--------|------|----------|-------------|\n| `appId` | string | Yes | Your DropOnAir app ID |\n| `publicApiKey` | string | Yes | Your DropOnAir public API key |\n| `getUserJwt` | `() => Promise<string>` | Yes | Returns a fresh user JWT from your backend |\n| `keyDirectoryEndpoint` | string | No | Public key directory URL (default: `/api/messaging/keys`) |\n| `tokenExchangeEndpoint` | string | No | Token exchange URL (default: `/api/messaging/token-exchange`) |\n| `messagingWsUrl` | string | No | WebSocket URL (default: `wss://sdk.droponair.com/ws/messages`) |\n| `messagingHttpUrl` | string | No | HTTP URL (default: `https://sdk.droponair.com`) |\n| `autoConnect` | boolean | No | Connect on init (default: `true`) |\n| `storage` | KeyStorageAdapter | No | Custom key storage (default: IndexedDB) |\n| `debug` | boolean | No | Enable debug logging (default: `false`) |\n\n### Connection\n\n| Method | Returns | Description |\n|--------|---------|-------------|\n| `connect()` | `Promise<void>` | Connect to DropOnAir (generates keys, exchanges JWT, opens WebSocket) |\n| `disconnect()` | `void` | Disconnect and stop auto-reconnect |\n\n### E2EE Messaging\n\n| Method | Returns | Description |\n|--------|---------|-------------|\n| `sendMessage(toUserId, plaintext)` | `Promise<{ messageId }>` | Send an encrypted message |\n| `editMessage(originalMessageId, toUserId, newText)` | `Promise<{ editId }>` | Edit a previously sent encrypted message |\n| `deleteMessage(originalMessageId, toUserId, scope)` | `Promise<{ deleteId }>` | Delete a previously sent 1:1 message. `scope` is `FOR_EVERYONE` or `FOR_ME` |\n| `sendCleartextMessage(toUserId, plaintext)` | `Promise<{ messageId }>` | Send a cleartext message (no E2EE) |\n| `editCleartextMessage(originalMessageId, toUserId, newText)` | `Promise<{ editId }>` | Edit a previously sent cleartext message |\n| `onMessage(callback)` | `() => void` | Listen for incoming messages. Returns unsubscribe function |\n| `onMessageEdit(callback)` | `() => void` | Listen for inbound edits to 1:1 messages |\n| `editGroupMessage(groupId, originalMessageId, newText, memberUserIds)` | `Promise<{ editId }>` | Edit a message you sent to a group, encrypted per member |\n| `editCleartextGroupMessage(groupId, originalMessageId, newText)` | `Promise<{ editId }>` | Edit a cleartext message you sent to a group |\n| `deleteGroupMessage(groupId, originalMessageId, scope?)` | `Promise<{ deleteId }>` | Delete a message you sent to a group. `scope` defaults to `FOR_EVERYONE` |\n| `onGroupMessageEdit(callback)` | `() => void` | Listen for edits to group messages |\n| `onGroupMessageDelete(callback)` | `() => void` | Listen for deletes of group messages |\n| `onMessageDelete(callback)` | `() => void` | Listen for inbound delete tombstones for 1:1 messages |\n| `onEvent(callback)` | `() => void` | Listen for system events (CONNECTED, DELIVERED, ERROR, etc.) |\n| `ack(messageId)` | `Promise<void>` | Manually acknowledge a message |\n| `registerPushToken({ platform, token, voipToken? })` | `Promise<void>` | Register this device for push notifications. `platform` is `'APNS'`, `'FCM'`, or `'WEB_PUSH'`. |\n| `unregisterPushToken({ platform })` | `Promise<void>` | Unregister this device for push notifications (e.g. on logout). |\n| `listMyDevices()` | `Promise<DeviceInfo[]>` | List the current user's registered devices. |\n| `revokeMyDevice(deviceId)` | `Promise<DeviceInfo>` | Revoke one of the current user's devices. Permanent. |\n| `markRead(messageId, conversationId?)` | `void` | Mark a message as read; relays a receipt to the user's other devices. |\n| `onReadReceipt(callback)` | `() => void` | Listen for read receipts from the user's other devices. |\n| `clearNotification(conversationId)` | `void` | Tell the user's other devices a conversation's notifications were dismissed. |\n| `onNotificationCleared(callback)` | `() => void` | Listen for notification-clear syncs from the user's other devices. |\n| `syncDraft(conversationId, draftText)` | `void` | Push a conversation draft to the user's other devices (opt-in, cleartext). |\n| `onDraftSync(callback)` | `() => void` | Listen for draft syncs from the user's other devices. |\n\n### Key custody\n\nEvery client reports how it is holding the identity private key:\n\n```ts\nconst client = await initialize({ /* ... */ });\nconsole.log(client.keyCustody); // 'software' | 'non-extractable'\n```\n\n`'software'` means the key is bytes the process can read. That is what every release before\n0.25.0 did, and what this one still does unless you opt in below.\n\n`'non-extractable'` means the key exists only inside the browser's crypto agent: your code can\nask it to derive a shared secret, and cannot read the key itself. Script that runs on your\norigin can therefore use the identity while the page is open, and cannot copy it and decrypt\nelsewhere or later.\n\nOpt in by supplying an identity:\n\n```ts\nimport { initialize, createSecureIdentity } from '@droponair/sdk-js';\n\nconst identity = await createSecureIdentity();\nif (identity) {\n  // Optional, once: carry an existing key over so the identity and its history survive.\n  await identity.migrateFromKeyStorage(myStorage);\n}\n\nconst client = await initialize({\n  appId, publicApiKey, getUserJwt,\n  identity: identity ?? undefined,   // null means this browser cannot provide it\n});\n```\n\n`createSecureIdentity()` returns `null` where the platform cannot deliver the guarantee, rather\nthan throwing or quietly giving you something weaker. It checks two things: whether the\nprimitive exists, and whether a key survives being stored and read back. That second check\nmatters, because one major engine generates and derives with the key correctly and then loses\nit on write while reporting success. Read `client.keyCustody` afterwards to see what you\nactually got.\n\nMigration is yours to trigger, not automatic, because it removes the readable copy of the key.\nIt imports the existing key, verifies it, and only then deletes the original. The public key is\nunchanged, so peers still address the same identity and existing conversations keep decrypting.\n\n### Cross-device read receipts\n\nAvailable since SDK `0.11.0`. **Your app decides when a message is read**, and the platform never infers it. Call `markRead()` at that moment; the receipt syncs to the user's *other* devices so they can clear their unread UI. It is not sent to the message's sender. The app owner can switch read receipts off entirely from the dashboard.\n\n```typescript\n// When your UI decides the message has been read\nclient.markRead(messageId, peerUserId);\n\n// On the user's other devices\nclient.onReadReceipt(e => {\n  // e.messageId was read elsewhere, so clear your unread state for it\n});\n```\n\n**Group read receipts.** Since SDK `0.13.0`, a group can opt into sharing read receipts with every member. Call `updateGroup(groupId, { readReceiptsVisibleToGroup: true })` (owner/admin); after that, a member's `markRead()` on a group message is broadcast to every other member, and `onReadReceipt` fires with `e.fromUserId` set to the member who read it. It is **opt-in per group**. The platform never enables it for you, and it has no effect unless read receipts are also enabled for your app.\n\n```typescript\nawait client.updateGroup(groupId, { readReceiptsVisibleToGroup: true });\n\nclient.onReadReceipt(e => {\n  // e.fromUserId is the group member who read e.messageId\n});\n```\n\n### Notification clear & draft sync\n\nAvailable since SDK `0.12.0`, both own-device only. `clearNotification()` tells your user's other devices a conversation's notifications were dismissed, and is always available. `syncDraft()` pushes a draft so the user can keep typing on another device, and is **opt-in** (the app owner enables it in the dashboard) and the draft text crosses the relay in cleartext.\n\n```typescript\nclient.clearNotification(conversationId);\nclient.onNotificationCleared(e => { /* clear badge for e.conversationId */ });\n\nclient.syncDraft(conversationId, composerText);\nclient.onDraftSync(e => { /* pre-fill composer with e.draftText */ });\n```\n\n### Device trust\n\nAvailable since SDK `0.10.0`. Any device that completes a connection is implicitly trusted. `listMyDevices()` powers a \"Your devices\" screen; `revokeMyDevice()` cuts a device off immediately. When the *current* device is revoked, the SDK stops reconnecting and emits a `DEVICE_REVOKED` event via `onEvent`. Listen for it to clear local key storage and prompt re-registration.\n\n```typescript\nconst devices = await client.listMyDevices();\nawait client.revokeMyDevice('old-phone-device-id');\n\nclient.onEvent(e => {\n  if (e.type === 'DEVICE_REVOKED') {\n    // This device was revoked elsewhere. Clear local keys and show a re-register screen.\n  }\n});\n```\n\n### Push notifications\n\nAvailable since SDK `0.9.0`. Customers configure their own APNs / FCM / VAPID credentials in the dashboard. The platform delivers a push only when the sender attaches a `pushPayload` to a message and the recipient device has no live WebSocket session. See the per-product availability and limits on your dashboard's Subscription page.\n\n\nRegister the token as soon as you have it. The SDK holds it until a connection\nexists and registers it then, and re-registers on every connect, so there is no\nneed to wait for the client to connect or to retry yourself.\n```typescript\n// iOS, after didRegisterForRemoteNotificationsWithDeviceToken\nawait client.registerPushToken({ platform: 'APNS', token: deviceTokenHex });\n\n// iOS + PushKit/CallKit (VoIP)\nawait client.registerPushToken({ platform: 'APNS', token: deviceTokenHex, voipToken: voipTokenHex });\n\n// Android, after FirebaseMessaging.getInstance().token\nawait client.registerPushToken({ platform: 'FCM', token: fcmToken });\n\n// Browser, the token is the JSON returned by PushManager.subscribe()\nawait client.registerPushToken({ platform: 'WEB_PUSH', token: JSON.stringify(subscription) });\n\n// On logout\nawait client.unregisterPushToken({ platform: 'APNS' });\n```\n\n#### Attaching a payload\n\nA push is only sent when the sender attaches a payload, so set a default once and\nevery message carries it. Passing one on each send also works, but forgetting once\nstops push with no error to notice.\n\n```typescript\nconst client = await initialize({\n  appId, publicApiKey, getUserJwt,\n  defaultPushPayload: { title: 'New message', delivery: 'mutable' },\n});\n\n// Override for a single message\nawait client.sendMessage(userId, text, {\n  push: { title: 'New photo', delivery: 'mutable', threadId: conversationId },\n});\n```\n\n#### Choosing how the push behaves\n\n`delivery` says what the recipient's device should do. The platform translates it\nper transport, so you pick what suits your app rather than adopting somebody else's\nmodel.\n\n| `delivery` | What happens |\n| --- | --- |\n| `'alert'` | Title and body are shown exactly as supplied. Suits apps sending cleartext. |\n| `'mutable'` | Shown as a placeholder, then your app replaces the text before it appears. This is how an end-to-end encrypted app shows real content without the relay seeing it. On iOS it needs a notification service extension; on Android it arrives as a data message. |\n| `'silent'` | The app is woken and nothing is shown. **iOS throttles these and does not guarantee delivery**, so use `'mutable'` when being woken matters. |\n| `'voip'` | Call invite: PushKit on iOS, high priority data on Android. Requires a registered VoIP token. |\n\nOmit `delivery` and it defaults to `'alert'`.\n\n**Never put message content in `title` or `body`.** Every field in the payload is\nreadable by the relay, which is exactly why it can act on them, so putting plaintext\nthere leaks it through the one path that otherwise never sees it. Send a placeholder\nand use `'mutable'` to replace it on the device.\n\n\nE2EE invariant: the push body is sender-supplied cleartext metadata only (e.g. \"1 new message from Alice\"), never the encrypted message contents. The recipient SDK decrypts the real message after the push wakes the device and the WebSocket reconnects.\n\n### Message Edit & Delete\n\nAvailable since SDK `0.4.0`.\n\n```typescript\n// Edit an encrypted message\nawait client.editMessage(originalMessageId, 'recipient-user-id', 'Updated text');\n\n// Edit a cleartext message\nawait client.editCleartextMessage(originalMessageId, 'recipient-user-id', 'Updated text');\n\n// Delete for everyone\nawait client.deleteMessage(originalMessageId, 'recipient-user-id', 'FOR_EVERYONE');\n\n// Delete only on the sender's own devices\nawait client.deleteMessage(originalMessageId, 'recipient-user-id', 'FOR_ME');\n\n// A group message: name the group, and pass the members you sent to\nawait client.editGroupMessage(groupId, messageId, 'Updated text', memberUserIds);\nawait client.deleteGroupMessage(groupId, messageId); // FOR_EVERYONE by default\n\nclient.onGroupMessageEdit((edit) => {\n  console.log('group edit', edit.groupId, edit.originalMessageId, edit.plaintext);\n});\nclient.onGroupMessageDelete((del) => {\n  console.log('group delete', del.groupId, del.originalMessageId);\n});\n// Group edits and deletes also arrive after an absence, so applying one twice\n// must be harmless, and a delete can name a message this device never received.\n\nclient.onMessageEdit((edit) => {\n  console.log('edited', edit.originalMessageId, edit.text);\n});\n\nclient.onMessageDelete((del) => {\n  console.log('deleted', del.originalMessageId, del.scope);\n});\n```\n\n- E2EE edits are re-encrypted per recipient device; the relay never sees the new plaintext.\n- `FOR_EVERYONE` notifies the recipient; `FOR_ME` only syncs the tombstone to the sender's other devices.\n- Each edit and each `FOR_EVERYONE` delete counts as one `MESSAGE` usage record.\n\n### Attachments (Customer-Managed Storage)\n\nAvailable since SDK `0.5.0`. Configure your bucket once in the DropOnAir panel (S3-compatible, GCS, or Azure Blob). DropOnAir never holds file bytes - the SDK uploads/downloads directly against your bucket via short-lived presigned URLs.\n\n```typescript\n// Convenience: encrypt + upload + finalize in one call, then send with the message.\nconst ref = await client.prepareAttachmentAndUpload(fileBytes, {\n  toUserId: 'recipient-user-id',\n  mimeType: 'image/jpeg',\n  encryptionType: 'E2EE',          // or 'CLEARTEXT' for public files\n});\n\nawait client.sendMessage('recipient-user-id', 'Here is the file', { attachments: [ref] });\n\n// Recipient side: incoming DecryptedMessage carries optional attachments[]\nclient.onMessage(async (msg) => {\n  console.log(msg.plaintext);\n  for (const att of msg.attachments ?? []) {\n    const dl = await client.downloadAttachment(att);\n    // dl.bytes is Uint8Array, dl.mimeType / dl.sizeBytes / dl.sha256 are populated\n  }\n});\n```\n\n| Method | Returns | Description |\n|--------|---------|-------------|\n| `prepareAttachmentAndUpload(bytes, options)` | `Promise<AttachmentRef>` | Encrypt (E2EE), upload, finalize, return ref |\n| `createUploadSession(options)` | `Promise<UploadSession>` | Low-level: presigned PUT URL only |\n| `finalizeAttachment(attachmentId, sha256)` | `Promise<void>` | Low-level: commit integrity hash |\n| `retentionSeconds` (upload option) | | How long this one file should live. Never granted longer than your own retention. |\n| `deleteWhenEveryoneHasIt` (upload option) | | Delete the stored bytes as soon as every recipient has fetched them. A later request is answered \"no longer available\". |\n| `downloadAttachment(ref)` | `Promise<DownloadedAttachment>` | Get presigned URL + download + decrypt |\n| `revokeAttachment(attachmentId \\| ref)` | `Promise<void>` | Revoke an attachment you sent; recipients get `ATTACHMENT_REVOKED` |\n| `sendMessage(toUserId, text, { attachments })` | `Promise<{ messageId }>` | Send with attachments |\n\n- **Preview thumbnails (optional).** Pass `thumbnail` (bytes) in `prepareAttachmentAndUpload` options and the SDK uploads it as a separate encrypted attachment, linked via `AttachmentRef.thumbnailAttachmentId`. Purely the developer's choice; omit it and there is no thumbnail. Download the thumbnail like any attachment.\n- **Revoke.** `revokeAttachment()` stops the platform issuing new download URLs and notifies recipients. Bytes a recipient already downloaded cannot be recalled. For GROUP attachments, download is authorized against *current* group membership, so a removed member loses access. Pass an `AttachmentRef` instead of an id (`revokeAttachment(ref)`, since 0.13.1) to revoke the linked preview thumbnail in the same call; a thumbnail is a separate attachment, so revoking a bare id leaves its thumbnail untouched.\n\n- E2EE: a random AES-256-GCM file key encrypts the bytes; the file key is wrapped per recipient device using X25519 + HKDF (same model as message payloads). Server never sees the unwrapped file key.\n- Availability and per-file / per-month limits depend on your plan and are enforced server-side before the presigned URL is issued. See the [pricing page](https://www.droponair.com/pricing) and your dashboard Subscription page for what's enabled on your app.\n- Upload URL TTL = 15 min. Download URL TTL = 5 min. Download authorization checks that the requester is the original sender or in the captured recipient list.\n\n### Broadcast Channels\n\n| Method | Returns | Description |\n|--------|---------|-------------|\n| `subscribeBroadcast(channelId)` | `Promise<void>` | Subscribe to a channel |\n| `unsubscribeBroadcast(channelId)` | `Promise<void>` | Unsubscribe from a channel |\n| `publishBroadcast(channelId, plaintext)` | `Promise<{ broadcastId }>` | Publish to a channel |\n| `onBroadcast(callback)` | `() => void` | Listen for broadcast messages |\n\n### Groups\n\n| Method | Returns | Description |\n|--------|---------|-------------|\n| `createGroup(name, memberUserIds?)` | `Promise<GroupInfo>` | Create a group with optional members |\n| `listGroups()` | `Promise<GroupInfo[]>` | List your groups |\n| `getGroup(groupId)` | `Promise<GroupInfo>` | Get group details |\n| `addGroupMembers(groupId, userIds)` | `Promise<GroupInfo>` | Add members (owner/admin) |\n| `removeGroupMember(groupId, userId)` | `Promise<GroupInfo>` | Remove a member (owner/admin) |\n| `updateGroup(groupId, { name?, readReceiptsVisibleToGroup? })` | `Promise<GroupInfo>` | Update group settings (owner/admin) |\n| `deleteGroup(groupId)` | `Promise<void>` | Delete a group (owner only) |\n| `sendGroupMessage(groupId, plaintext, memberUserIds, options?)` | `Promise<{ messageId }>` | Send an end-to-end encrypted group message (sender-side per-recipient fan-out). `options.attachments` for E2EE group attachments. |\n| `sendCleartextGroupMessage(groupId, plaintext)` | `Promise<{ messageId }>` | Send a plaintext (non-encrypted) group message; server fans out to every other member. |\n| `onGroupMessage(callback)` | `() => void` | Listen for group messages |\n\nDelivered and seen are caught up on every connect, so a sender that was away\nwhile someone fetched or read still learns about it. The state arrives through\nthe same delivered and read callbacks a live receipt uses, so there is nothing\nextra to handle; make sure your handling is idempotent and only ever moves a\nmark forward, since catch-up replays the current state rather than the changes.\n\n**Group delivery is per member.** A group message has many recipients, so the platform\nreports delivery as a set rather than a single flag and leaves the presentation to you.\n`DELIVERED` and `SEEN` arrive as events whose `metadata` carries `messageId`, `groupId`\nand `memberUserId`, the member the acknowledgement is about. Show one tick once the set\ncovers the group, or a read-by list, whichever suits your app. `memberUserId` is absent\non `SERVER_RECEIVED`, which is about the relay rather than any member.\n\n**Group messages missed while offline arrive on connect.** Anything sent while the app\nwas closed or disconnected is drained automatically when it reconnects and delivered\nthrough `onGroupMessage` just like a live message. There is nothing to call.\n\n### Typing indicators\n\nSay when someone starts and stops composing, and hear it about others. Nothing is\nstored: it reaches only those connected at the time and is never replayed, so\ntreat a start as expiring on its own rather than waiting for the stop, which is\nlost if the sender disconnects mid-sentence.\n\n```typescript\nclient.sendTyping(groupId, true);\nclient.sendTyping(groupId, false);\n\nclient.onTyping((event) => {\n  // event.conversationId, event.fromUserId, event.isTyping\n});\n```\n\n### Signals, your own ephemeral messages\n\nTyping says one thing. A signal says whatever your app means: the name is yours,\nthe data is yours, and the platform carries both without reading either. Two apps\ncan use the same relay for entirely different signals without knowing about each\nother.\n\nEphemeral in the same way typing is: nothing is stored, it reaches only those\nconnected at the time, and it is never replayed. Treat a signal as expiring on\nits own rather than waiting for one that cancels it, because that one is lost if\nthe sender disconnects.\n\nA signal is a hint rather than a message. It is capped at two kilobytes and rate\nlimited per sender per conversation; anything past either is dropped without an\nerror.\n\n```typescript\n// Somebody started sending a photo, and the room can say so before it lands.\nclient.sendSignal(groupId, 'file.sending', 'photo');\nclient.sendSignal(groupId, 'file.sent');\n\nconst stop = client.onSignal((event) => {\n  // event.name, event.data, event.fromUserId, event.conversationId\n});\n```\n\nAvailable where the platform advertises `app_signals` in `GET /api/info`.\n\n### 1-to-1 Calls\n\n| Method | Returns | Description |\n|--------|---------|-------------|\n| `startCall(targetUserId, options?)` | `Promise<string>` | Start a call, returns callId. `options.push` rings a phone that is not connected |\n| `acceptCall(callId)` | `Promise<void>` | Accept incoming call |\n| `rejectCall(callId)` | `Promise<void>` | Reject incoming call |\n| `endCall(callId)` | `Promise<void>` | End or cancel a call |\n| `toggleVideo(callId, enabled)` | `void` | Toggle video on/off |\n| `sendCallSignal(type, callId, payload)` | `void` | Send SDP/ICE signaling data |\n| `onCallEvent(callback)` | `() => void` | Listen for call events |\n| `fetchTurnCredentials()` | `Promise<TurnCredentials>` | Get TURN server credentials for NAT traversal |\n\n#### Ringing a phone that is not connected\n\nWithout `options.push`, a call only reaches a device that already holds a\nconnection open, and an invite to anybody else is refused with `CALLEE_OFFLINE`.\nThat matters most for an app that closes its connection when it goes to the\nbackground, which is the right thing to do, since the platform only pushes to\nsomeone it believes is away.\n\n```ts\nconst callId = await client.startCall(targetUserId, {\n  push: {\n    title: 'Ana',\n    body: 'is calling',\n    delivery: 'voip',\n    customJson: JSON.stringify({ roomId }),\n  },\n});\n```\n\nThe platform adds two keys to your `customJson` and takes nothing else away:\n\n| Key | Meaning |\n|-----|---------|\n| `callId` | Which call this is, so a woken app can answer it without a connection |\n| `call` | `\"ring\"` when it starts, `\"stop\"` when there is nothing left to answer |\n\nHandle `\"stop\"` as well as `\"ring\"`. It arrives when the call is answered\nelsewhere, refused, called off or never answered, and it is what stops a\nnotification claiming a call is waiting long after it is over. A device already\nin the call receives it too and should ignore it: stop a call you are still\nringing, never one you are already in.\n\nIn a group this is decided per member, so anybody already connected is rung over\nthe connection and only the rest are woken.\n\nA call never inherits `defaultPushPayload`. That default describes an arriving\nmessage, and an app that set one has not thereby asked for its calls to start\nreaching phones that are away.\n\nAvailable where the platform advertises `call_push` in `GET /api/info`.\n\n### Group Calls\n\n| Method | Returns | Description |\n|--------|---------|-------------|\n| `startGroupCall(groupId, options?)` | `Promise<string>` | Start a group call, returns callId. `options.push` rings members who are not connected |\n| `joinGroupCall(callId, groupId)` | `Promise<void>` | Join an active group call |\n| `rejectGroupCall(callId, groupId)` | `Promise<void>` | Decline an incoming group call invite |\n| `leaveGroupCall(callId)` | `Promise<void>` | Leave a group call |\n| `endGroupCall(callId)` | `Promise<void>` | End a group call for all |\n| `sendGroupCallSignal(type, callId, groupId, targetUserId, payload)` | `void` | Send SDP/ICE to a peer |\n| `onGroupCallEvent(callback)` | `() => void` | Listen for group call events |\n\n### Scheduled & Persistent Rooms\n\nAvailable since SDK `0.14.0`. A **room** is an addressable container a live multi-party call runs inside - unlike a group, it is not tied to a member roster. Anyone in your app with the room id can attempt to join; the room's policy is the gate. \"Scheduled\" vs \"persistent\" is just how you compose the knobs - the platform imposes no meeting model.\n\n| Method | Returns | Description |\n|--------|---------|-------------|\n| `createRoom(options?)` | `Promise<Room>` | Create a room (name, schedule, policy, hosts) |\n| `listRooms()` | `Promise<Room[]>` | Rooms you created or host |\n| `getRoom(roomId)` | `Promise<Room>` | One room, including live-call state |\n| `updateRoom(roomId, update)` | `Promise<Room>` | Update name/schedule/policy/hosts (creator only) |\n| `deleteRoom(roomId)` | `Promise<void>` | Delete a room (creator only) |\n| `joinRoom(roomId)` | `Promise<string>` | Join the room's live call, returns callId |\n| `leaveRoom(callId)` | `Promise<void>` | Leave the room's live call |\n| `getSfuToken(roomId)` | `Promise<SfuToken>` | Token to join the room's SFU media (SFU-mode rooms only) |\n| `startSfuRecording(roomId, destinationId)` | `Promise<SfuRecording>` | Start server-side recording (SFU + `mediaEncryption: 'SFU'` only) |\n| `stopSfuRecording(roomId, recordingId)` | `Promise<SfuRecording>` | Stop a running SFU recording |\n| `listSfuRecordings(roomId)` | `Promise<SfuRecording[]>` | List SFU recordings for a room, newest first |\n\nRoom policy (`RoomPolicy`, all optional): `waitingRoom` (non-hosts wait for host admit), `requireHost` (non-hosts cannot open the call), `maxParticipants` (per-room cap), `autoCloseWhenEmpty` (room flips to `CLOSED` when the last participant leaves), `mediaMode` (`'MESH'` default | `'SFU'`), `mediaEncryption` (`'E2EE'` default | `'SFU'`).\n\n```typescript\nconst room = await client.createRoom({\n  name: 'Weekly sync',\n  scheduledStartAt: Date.now() + 3_600_000,   // metadata - your app drives the countdown UX\n  policy: { waitingRoom: true, requireHost: true },\n});\n\n// Join the live call. The returned callId works with every group-call\n// signaling method - pass '' for groupId.\nconst callId = await client.joinRoom(room.roomId);\nclient.onGroupCallEvent((e) => {\n  // room-call events carry e.roomId; e.type GROUP_CALL_PARTICIPANT_JOINED, etc.\n});\nclient.sendGroupCallSignal('GROUP_CALL_SDP_OFFER', callId, '', peerUserId, sdp);\n```\n\n`joinRoom` rejects with `HOST_REQUIRED`, `ROOM_CLOSED`, or `WAITING_ROOM_PENDING` (listen for `GROUP_CALL_WAITING_ROOM_ADMITTED`, then call `joinRoom` again).\n\n### Live Stage\n\nAvailable since SDK `0.15.0`. Create a room with `policy.stageMode` and its live call runs as a stage: hosts join as **speakers**, everyone else joins as receive-only **audience**. Audience can raise a hand; a host promotes them to speaker. The media topology is still the WebRTC mesh, so a stage is suited to panels and small/medium audiences - large-audience streaming needs an SFU and is out of scope.\n\n| Method | Description |\n|--------|-------------|\n| `raiseHand(callId)` | Request promotion to speaker (any participant) |\n| `lowerHand(callId)` | Lower your raised hand |\n| `promoteToSpeaker(callId, userId)` | Promote an audience member (host / co-host) |\n| `demoteToAudience(callId, userId)` | Demote a speaker (host / co-host) |\n| `submitStageQuestion(callId, text)` | Submit a text question to the stage's speakers |\n\n```typescript\nconst room = await client.createRoom({ name: 'AMA', policy: { stageMode: true, requireHost: true } });\nconst callId = await client.joinRoom(room.roomId);\n\n// Audience side\nclient.raiseHand(callId);\nclient.submitStageQuestion(callId, 'How does E2EE key rotation work?');\n\n// Host side - role changes arrive as GROUP_CALL_ROLE_CHANGED events\nclient.onGroupCallEvent((e) => {\n  if (e.type === 'GROUP_CALL_STAGE_HAND_RAISED') client.promoteToSpeaker(callId, e.payload!);\n  if (e.type === 'GROUP_CALL_ROLE_CHANGED') updateStageUi(e.payload);   // {\"userId\",\"role\":\"SPEAKER\"|\"AUDIENCE\"}\n});\n```\n\nAudience members are receive-only by convention: on `GROUP_CALL_ROLE_CHANGED` to `AUDIENCE`, your app simply does not publish a local media track. The platform signals the role; your app owns the WebRTC tracks.\n\n### Routed media (SFU)\n\nAvailable since SDK `0.17.0`. A room can opt out of peer-to-peer mesh and route its live-call media through the platform's media server. Set `policy.mediaMode` to `'SFU'` at create time, then ask the SDK for a join token; hand the token to your SFU client (e.g. LiveKit) to connect. `policy.mediaEncryption` controls whether the media server can decrypt the media: `'E2EE'` (default) keeps the platform blind, `'SFU'` lets the server terminate media so it can be recorded server-side.\n\n```typescript\nconst room = await client.createRoom({\n  name: 'All hands',\n  policy: { mediaMode: 'SFU', mediaEncryption: 'E2EE' },\n});\n\nconst sfu = await client.getSfuToken(room.roomId);\n// sfu = { url, token, room, mediaEncryption, expiresAt }\n// connect with your SFU client using sfu.url + sfu.token\n```\n\nMesh remains the default; only switch to SFU once the participant count outgrows mesh or you specifically need server-side recording. The `getSfuToken` call returns `409` for mesh-mode rooms and `503` if the media server is not available.\n\n### SFU recording\n\nAvailable since SDK `0.18.0`. Server-side recording for SFU-mode rooms with `mediaEncryption: 'SFU'`. The platform's media server captures the room composite and uploads the finalized file directly to your storage bucket (S3, GCS, or Azure); the platform never holds the recorded bytes. Storage destinations are registered in the panel; the SDK references each by an opaque `destinationId`.\n\n```typescript\nconst rec = await client.startSfuRecording(room.roomId, 'dst_aBc123');\n// { recordingId, status: 'STARTING', startedAt, ... }\n\n// Later, when the host ends the recording:\nawait client.stopSfuRecording(room.roomId, rec.recordingId);\n```\n\nCompletion lands as the `sfu-recording.completed` webhook (or by polling `listSfuRecordings`) and carries `locationUri` pointing at the finalized file in your bucket. E2EE-encrypted SFU rooms cannot be server-recorded by design (the media server forwards traffic it cannot decrypt) - use the client-side `startRecording` for those.\n\nLive call participants also receive in-band notification frames via the existing group-call event callback so a \"🔴 RECORDING\" UI badge stays in sync. The event types are `GROUP_CALL_SFU_RECORDING_STARTED` (payload = recordingId), `GROUP_CALL_SFU_RECORDING_STOPPED` (recordingId), and `GROUP_CALL_SFU_RECORDING_AVAILABLE` (`recordingId|locationUri`); the platform also notifies late joiners about any already-active SFU recording on the room. Plan limits (`maxSfuRecordingMinutesPerMonth`) are enforced server-side; deny at `startSfuRecording` returns HTTP 403 with a deny reason such as `MONTHLY_SFU_RECORDING_MINUTES_LIMIT_REACHED`.\n\n### HTTP fallback (SSE) transport\n\nAvailable since SDK `0.19.0`. For environments where WebSocket upgrades are blocked by a corporate firewall but plain HTTPS GET/POST work, the SDK exports a standalone `SseTransport` primitive that rides the platform's `/v1/transport/stream` (long-lived SSE) and `/v1/transport/send` (POST) endpoints. WebSocket on `/ws` remains the default for `client.connect()`; this primitive is opt-in for the corporate-firewall use case.\n\n```typescript\nimport { SseTransport } from '@droponair/sdk-js';\n\nconst sse = new SseTransport({\n  httpUrl: 'https://sdk.droponair.com',\n  getJwt: async () => jwt,\n});\nsse.onFrame((bytes) => { /* protobuf decode */ });\nawait sse.connect();\nawait sse.sendEnvelope(envelopeBytes);\n```\n\nEventSource-based receive (auto-reconnects + 25s keep-alives that defeat proxy idle timeouts), `fetch` POST for send. Bring your own protobuf decoder (use the codec already exported by the SDK). Verify the lane is enabled on the server via `GET /api/info`: the `transports` array includes `\"sse\"` and `features` includes `\"transport_sse\"`. v1 covers 1:1 Envelope delivery; call signaling stays on WebSocket. Full `init({ transport: 'sse' })` integration into `MessagingClient` lands in a follow-up.\n\n### WebTransport (HTTP/3) transport\n\nAvailable since SDK `0.20.0`. For modern browsers + environments with native HTTP/3 support, the SDK exports a `WebTransportTransport` primitive that rides the platform's `/v1/transport/wt` endpoint. Multi-stream and lower head-of-line blocking versus WebSocket; particularly useful on flaky cellular networks.\n\n```typescript\nimport { WebTransportTransport } from '@droponair/sdk-js';\n\nconst wt = new WebTransportTransport({\n  httpUrl: 'https://sdk.droponair.com',\n  getJwt: async () => jwt,\n});\nwt.onFrame((bytes) => { /* protobuf decode */ });\nawait wt.connect();\nawait wt.sendEnvelope(envelopeBytes);\n```\n\nUses the browser-native `WebTransport` API; opens a single bidirectional stream and rides raw bytes both ways. Browser support: Chromium 97+ (stable), Firefox 125+ (stable), Safari Technology Preview only, Node 22+ behind experimental flags. The endpoint advertises `transports: [\"webtransport\"]` only where the lane is available; check `GET /api/info.transports` and `features.transport_webtransport` to detect it. Bring your own protobuf decoder. WebSocket remains the default; this primitive is purely opt-in.\n\n### Transport auto-select\n\nAvailable since SDK `0.21.0`. `selectTransport({ httpUrl })` queries `/api/info.transports`, intersects with what the runtime supports (`WebTransport` / `WebSocket` / `EventSource`), and returns the best lane for this client + platform pair. Default preference: WebTransport → WebSocket → SSE (overridable).\n\n```typescript\nimport { selectTransport, WebTransportTransport, SseTransport } from '@droponair/sdk-js';\n\nconst lane = await selectTransport({ httpUrl: 'https://sdk.droponair.com' });\nswitch (lane) {\n  case 'webtransport': /* new WebTransportTransport(...) */ break;\n  case 'sse':          /* new SseTransport(...) */          break;\n  default:             /* fall through to your WebSocket client */\n}\n```\n\nFoundation for an `init({ transport: 'auto' })` shortcut once full `MessagingClient` integration lands (a follow-up). Today it's a small standalone helper so existing customers can adopt the pattern without waiting.\n\n### Call Recording\n\nAvailable since SDK `0.16.0`. The SDK **signals** recording state on a group or room call; your app does the actual media capture (`MediaRecorder`) and uploads the file to your own storage. The platform never holds the media. The recording signal is broadcast to every participant (including anyone who joins later); that transparency is enforced server-side.\n\n| Method | Description |\n|--------|-------------|\n| `startRecording(callId)` | Signal that you started recording |\n| `stopRecording(callId)` | Signal that you stopped recording |\n| `markRecordingAvailable(callId, location)` | Announce an uploaded recording (`location` references it in your storage) |\n\n```typescript\nclient.startRecording(callId);\n// ... your app records the streams and uploads the file ...\nclient.markRecordingAvailable(callId, 's3://my-bucket/recordings/call-123.webm');\nclient.stopRecording(callId);\n\nclient.onGroupCallEvent((e) => {\n  if (e.type === 'GROUP_CALL_RECORDING_STARTED') showRecordingBanner(e.payload);  // recorder userId\n});\n```\n\nThe platform also fires `recording.started` / `recording.stopped` / `recording.available` webhooks. For E2EE calls, recording stays on the client (the platform has no media plane); a server-side SFU recording mode is a future option.\n\n### Screen Sharing\n\nAvailable since SDK `0.6.0`. The SDK only signals start/stop - capture (via the browser's `getDisplayMedia()`) and adding the resulting `MediaStreamTrack` to the existing peer connection are the app's responsibility.\n\n```typescript\n// 1:1 call\nasync function shareMyScreen(callId: string, peerConnection: RTCPeerConnection) {\n  const stream = await navigator.mediaDevices.getDisplayMedia({ video: true });\n  const track  = stream.getVideoTracks()[0];\n  peerConnection.addTrack(track, stream);\n  client.startScreenShare(callId);\n  track.onended = () => client.stopScreenShare(callId);\n}\n\n// Group call\nasync function shareMyScreenInGroup(callId: string, groupId: string, peerConnections: RTCPeerConnection[]) {\n  const stream = await navigator.mediaDevices.getDisplayMedia({ video: true });\n  const track  = stream.getVideoTracks()[0];\n  peerConnections.forEach(pc => pc.addTrack(track, stream));\n  client.startGroupScreenShare(callId, groupId);\n  track.onended = () => client.stopGroupScreenShare(callId, groupId);\n}\n\nclient.onCallEvent((evt) => {\n  if (evt.type === 'CALL_SCREEN_SHARE_STARTED')  showShareIndicator(evt.callId);\n  if (evt.type === 'CALL_SCREEN_SHARE_STOPPED')  hideShareIndicator(evt.callId);\n});\n\nclient.onGroupCallEvent((evt) => {\n  if (evt.type === 'GROUP_CALL_SCREEN_SHARE_STARTED')  showShareIndicator(evt.callId, evt.payload);  // payload = sharer userId\n  if (evt.type === 'GROUP_CALL_SCREEN_SHARE_STOPPED')  hideShareIndicator(evt.callId);\n});\n```\n\n| Method | Returns | Description |\n|--------|---------|-------------|\n| `startScreenShare(callId, payload?)` | `void` | Signal start in a 1:1 call |\n| `stopScreenShare(callId, payload?)` | `void` | Signal stop in a 1:1 call |\n| `startGroupScreenShare(callId, groupId, payload?)` | `void` | Signal start in a group call |\n| `stopGroupScreenShare(callId, groupId, payload?)` | `void` | Signal stop in a group call |\n\n- The server enforces **one concurrent sharer per group call**. If another participant already holds the slot when you call `startGroupScreenShare`, the SDK delivers a `GROUP_CALL_SCREEN_SHARE_STOPPED` event with the current holder's userId in `payload`, so you can roll back the optimistic UI.\n- When a sharer leaves the call, the server broadcasts a STOPPED event to remaining participants before they see `PARTICIPANT_LEFT`.\n- Availability depends on your plan. See the [pricing page](https://www.droponair.com/pricing) and your dashboard Subscription page for what's enabled on your app.\n\n### Conference moderation and waiting room\n\nAvailable since SDK `0.7.0`. The call initiator is the default host; host can transfer the role mid-call or appoint co-hosts. Host and co-host can mute, remove, and gate joiners through a waiting room. If the host leaves without transferring, the server auto-promotes the longest-joined remaining participant and broadcasts `GROUP_CALL_ROLE_CHANGED`.\n\n```typescript\n// Host actions\nclient.transferHost(callId, groupId, 'alice');\nclient.appointCoHost(callId, groupId, 'bob');\nclient.muteParticipant(callId, groupId, 'eve');           // signaling hint\nclient.removeParticipant(callId, groupId, 'mallory');     // server-enforced drop\n\n// Waiting room\nclient.requestWaitingRoomEntry(callId, groupId);          // would-be joiner side\nclient.admitFromWaitingRoom(callId, groupId, 'newbie');   // host / co-host\nclient.rejectFromWaitingRoom(callId, groupId, 'troll');\n\nclient.onGroupCallEvent((evt) => {\n  if (evt.type === 'GROUP_CALL_ROLE_CHANGED')          updateHostUi(evt.payload);   // {\"userId\":\"...\",\"role\":\"HOST|CO_HOST|PARTICIPANT\"}\n  if (evt.type === 'GROUP_CALL_WAITING_ROOM_JOINED')   showWaitingApprovalPrompt(evt.payload);\n  if (evt.type === 'GROUP_CALL_WAITING_ROOM_ADMITTED') joinTheCall(evt.callId, evt.groupId);\n  if (evt.type === 'GROUP_CALL_MUTE_PARTICIPANT')      muteMyMicLocally();\n  if (evt.type === 'GROUP_CALL_PARTICIPANT_REMOVED')   exitCallUi();\n});\n```\n\n| Method | Returns | Description |\n|--------|---------|-------------|\n| `transferHost(callId, groupId, newHostUserId)` | `void` | Host only |\n| `appointCoHost(callId, groupId, userId)` | `void` | Host only |\n| `revokeCoHost(callId, groupId, userId)` | `void` | Host only |\n| `muteParticipant(callId, groupId, targetUserId)` | `void` | Host / co-host. Signaling hint - the target SDK mutes the local mic. |\n| `removeParticipant(callId, groupId, targetUserId)` | `void` | Host / co-host. Server drops the target from the call session. |\n| `requestWaitingRoomEntry(callId, groupId)` | `void` | Would-be joiner |\n| `admitFromWaitingRoom(callId, groupId, userId)` | `void` | Host / co-host |\n| `rejectFromWaitingRoom(callId, groupId, userId)` | `void` | Host / co-host |\n\n- Mute is intentionally a signaling hint: WebRTC media tracks can't be muted from outside the producing client. Remove is server-enforced - the target SDK receives `GROUP_CALL_PARTICIPANT_REMOVED` and the others receive `PARTICIPANT_LEFT`.\n- Availability depends on your plan. See the [pricing page](https://www.droponair.com/pricing) and your dashboard Subscription page for what's enabled on your app.\n\n## Two identities at once\n\nEvery message carries the publisher's user id to whoever receives it, so a single\nidentity is a single visible identity everywhere the app speaks. When that is not\nwhat you want, name a second instance. Each named instance has its own\nconnection, its own token, and its own key storage, so nobody observing them can\ntell the two identities belong to one device.\n\nThe usual shape is a long-lived identity for the user's own conversations plus a\nshort-lived or anonymous one for an ephemeral context, running side by side.\n\n```ts\nconst mine = await initialize({ ...options });\nconst anon = await initialize({ ...options, instanceName: 'nearby' });\n\nawait anon.publishBroadcast(channelId, 'hello');\n```\n\n| Option | Description |\n|---|---|\n| `instanceName` | Names this instance. Defaults to `'default'`. |\n\nOnly the default key storage is namespaced for you. A `storage` adapter you\nsupply yourself is used exactly as given, so give each instance its own.\n\nCalls without a name use the instance named `default`, which keeps the key\nstorage an app already has. Upgrading changes nothing for existing code.\n\n## Security\n\n- **X25519 ECDH** key agreement for shared secrets\n- **HKDF-SHA256** key derivation\n- **AES-256-GCM** authenticated encryption with AAD binding (messageId, senderId, recipientId, timestamp)\n- Private keys generated and stored locally, never sent to DropOnAir\n- Multi-device: each device has its own keypair, messages encrypted per-device\n\n## Requirements\n\n- Node.js >= 18.0.0\n- Browser with Web Crypto API support (all modern browsers)\n\n## License\n\nMIT\n\n## Support\n\n- **Website:** [droponair.com](https://droponair.com)\n- **Email:** info@droponair.com\n","readmeFilename":"README.md"}