{"_id":"@absolutejs/secure-transfer","_rev":"8-6183c4f07e4b0bc0478302866fe5c68c","name":"@absolutejs/secure-transfer","dist-tags":{"latest":"0.3.0"},"versions":{"0.0.1":{"name":"@absolutejs/secure-transfer","version":"0.0.1","author":{"name":"Alex Kahn"},"license":"Apache-2.0","_id":"@absolutejs/secure-transfer@0.0.1","maintainers":[{"name":"alexkahndev","email":"alexkahn2019@gmail.com"}],"homepage":"https://github.com/absolutejs/secure-transfer","bugs":{"url":"https://github.com/absolutejs/secure-transfer/issues"},"dist":{"shasum":"82b37f10a3bd103e006ded1b1718707e3ff8b595","tarball":"https://registry.npmjs.org/@absolutejs/secure-transfer/-/secure-transfer-0.0.1.tgz","fileCount":16,"integrity":"sha512-gxNsfm6tJImeJ6ggDjKE0VleCi1GnqaOhqVrpogpKu4Yn+3Me+n+eexWcS7EpJhAUHbxO6CVsB787ZRuWuo8bQ==","signatures":[{"sig":"MEYCIQCoExVWs6WG7zlv+71V0Vwzoa0Jlo2gM7n9KByOJhfB4AIhALEoX3bYSb2CzxCWhu8hnLdLmATSV6CcafWZeY+t7yFn","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":78177},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./manifest":{"types":"./dist/manifest.d.ts","import":"./dist/manifest.js","default":"./dist/manifest.js"},"./manifest.json":"./dist/manifest.json"},"gitHead":"8c6c836966b5e03437b0b89b6202abdc1357f195","scripts":{"test":"bun test tests/","build":"rm -rf dist && bun build src/index.ts src/manifest.ts --outdir dist --root src --sourcemap --target=browser --external @absolutejs/manifest --external @sinclair/typebox && tsc --project tsconfig.build.json && absolute-manifest emit","format":"prettier --write \"./**/*.{ts,json,md}\"","release":"bun run check:package && npm publish --access public","typecheck":"tsc --noEmit","format:check":"prettier --check \"./**/*.{ts,json,md}\"","check:package":"bun run format:check && bun run typecheck && bun run test && bun run build && bun run verify-package","verify-package":"absolute-manifest verify-package"},"_npmUser":{"name":"alexkahndev","email":"alexkahn2019@gmail.com"},"absolutejs":{"manifestContract":2},"repository":{"url":"git+https://github.com/absolutejs/secure-transfer.git","type":"git"},"_npmVersion":"10.9.2","description":"Provider-neutral encrypted, record-oriented large-object transfer for AbsoluteJS.","directories":{},"_nodeVersion":"22.14.0","dependencies":{"@sinclair/typebox":"^0.34.0","@absolutejs/manifest":"^0.9.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"prettier":"^3.9.0","@types/bun":"^1.3.14","typescript":"^5.9.0"},"_npmOperationalInternal":{"tmp":"tmp/secure-transfer_0.0.1_1787791476627_0.43365112902915093","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"@absolutejs/secure-transfer","version":"0.0.2","author":{"name":"Alex Kahn"},"license":"Apache-2.0","_id":"@absolutejs/secure-transfer@0.0.2","maintainers":[{"name":"alexkahndev","email":"alexkahn2019@gmail.com"}],"homepage":"https://github.com/absolutejs/secure-transfer","bugs":{"url":"https://github.com/absolutejs/secure-transfer/issues"},"dist":{"shasum":"5d461abbc8956702e42348cd87d051b9f43e6a61","tarball":"https://registry.npmjs.org/@absolutejs/secure-transfer/-/secure-transfer-0.0.2.tgz","fileCount":16,"integrity":"sha512-4HMUQ+M3YdffZiq9KfcpwQhKMm2W8WkQMAhIpafTfXt2NSQnHwHEVU7JwkP1yAGPnPJjopMtjfCnvtebrt/Qxw==","signatures":[{"sig":"MEUCIDNlPwuEifIkTZn5SW9CfBDhYhrJoRNGxks3RG4GMdQGAiEA02PIm0ox7WrnZFrt3D0Kf+0O4Ws/3ZMunOZYE2rLuDk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":78595},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./manifest":{"types":"./dist/manifest.d.ts","import":"./dist/manifest.js","default":"./dist/manifest.js"},"./manifest.json":"./dist/manifest.json"},"gitHead":"ea646df5334667af2c56a6fb53ca1497fbf482ad","scripts":{"test":"bun test tests/","build":"rm -rf dist && bun build src/index.ts src/manifest.ts --outdir dist --root src --sourcemap --target=browser --external @absolutejs/manifest --external @sinclair/typebox && tsc --project tsconfig.build.json && absolute-manifest emit","format":"prettier --write \"./**/*.{ts,json,md}\"","release":"bun run check:package && npm publish --access public","typecheck":"tsc --noEmit","format:check":"prettier --check \"./**/*.{ts,json,md}\"","check:package":"bun run format:check && bun run typecheck && bun run test && bun run build && bun run verify-package","verify-package":"absolute-manifest verify-package"},"_npmUser":{"name":"alexkahndev","email":"alexkahn2019@gmail.com"},"absolutejs":{"manifestContract":2},"repository":{"url":"git+https://github.com/absolutejs/secure-transfer.git","type":"git"},"_npmVersion":"10.9.2","description":"Provider-neutral encrypted, record-oriented large-object transfer for AbsoluteJS.","directories":{},"_nodeVersion":"22.14.0","dependencies":{"@sinclair/typebox":"^0.34.0","@absolutejs/manifest":"^0.9.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"prettier":"^3.9.0","@types/bun":"^1.3.14","typescript":"^5.9.0"},"_npmOperationalInternal":{"tmp":"tmp/secure-transfer_0.0.2_1787791769893_0.5143574524480357","host":"s3://npm-registry-packages-npm-production"}},"0.0.3":{"name":"@absolutejs/secure-transfer","version":"0.0.3","author":{"name":"Alex Kahn"},"license":"Apache-2.0","_id":"@absolutejs/secure-transfer@0.0.3","maintainers":[{"name":"alexkahndev","email":"alexkahn2019@gmail.com"}],"homepage":"https://github.com/absolutejs/secure-transfer","bugs":{"url":"https://github.com/absolutejs/secure-transfer/issues"},"dist":{"shasum":"252884a5e75cbecd341f570db566e34e4c9c7a02","tarball":"https://registry.npmjs.org/@absolutejs/secure-transfer/-/secure-transfer-0.0.3.tgz","fileCount":16,"integrity":"sha512-4amx4DKeghjP+Agh/gLJIVulP7Mf1TqqtJghRF+835SXaUCXspeypGMxuPMoNz3ToP8jtfLxs747cQQJfJUy8A==","signatures":[{"sig":"MEUCIAl6SjEszwMI5l3+ML6EbQXjctaGpdOf5KOVXHgnw54CAiEApZCSYsdzHVO62ImqcQ573GLXCM75f0RqGyjDNwrIMyg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":80785},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./manifest":{"types":"./dist/manifest.d.ts","import":"./dist/manifest.js","default":"./dist/manifest.js"},"./manifest.json":"./dist/manifest.json"},"gitHead":"df1d3c8924175b381908a3e110b86992f111f846","scripts":{"test":"bun test tests/","build":"rm -rf dist && bun build src/index.ts src/manifest.ts --outdir dist --root src --sourcemap --target=browser --external @absolutejs/manifest --external @sinclair/typebox && tsc --project tsconfig.build.json && absolute-manifest emit","format":"prettier --write \"./**/*.{ts,json,md}\"","release":"bun run check:package && npm publish --access public","typecheck":"tsc --noEmit","format:check":"prettier --check \"./**/*.{ts,json,md}\"","check:package":"bun run format:check && bun run typecheck && bun run test && bun run build && bun run verify-package","verify-package":"absolute-manifest verify-package"},"_npmUser":{"name":"alexkahndev","email":"alexkahn2019@gmail.com"},"absolutejs":{"manifestContract":2},"repository":{"url":"git+https://github.com/absolutejs/secure-transfer.git","type":"git"},"_npmVersion":"10.9.2","description":"Provider-neutral encrypted, record-oriented large-object transfer for AbsoluteJS.","directories":{},"_nodeVersion":"22.14.0","dependencies":{"@sinclair/typebox":"^0.34.0","@absolutejs/manifest":"^0.9.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"prettier":"^3.9.0","@types/bun":"^1.3.14","typescript":"^5.9.0"},"_npmOperationalInternal":{"tmp":"tmp/secure-transfer_0.0.3_1787792853763_0.4896613713093658","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@absolutejs/secure-transfer","version":"0.1.0","author":{"name":"Alex Kahn"},"license":"Apache-2.0","_id":"@absolutejs/secure-transfer@0.1.0","maintainers":[{"name":"alexkahndev","email":"alexkahn2019@gmail.com"}],"homepage":"https://github.com/absolutejs/secure-transfer","bugs":{"url":"https://github.com/absolutejs/secure-transfer/issues"},"dist":{"shasum":"06e80d033a745e9ae274ec47b33ab3c64faa589f","tarball":"https://registry.npmjs.org/@absolutejs/secure-transfer/-/secure-transfer-0.1.0.tgz","fileCount":16,"integrity":"sha512-9jgRujuU9AUHVxh8KjPnsG+bGIeBsJHq795oJYAT0Ki1chBglPLTcVlt70P/ukCaYccF3JpbSU2zq1jK3V1ioA==","signatures":[{"sig":"MEUCIQCWTdSCAQg1gxSgm0GnTs2Trwew9AxBsntDvF4t+YBErgIgFpV9Z+pP4fJDUvZ5dzz5fzhtLTVqs9azqEOpSJv1JKg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":121890},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./manifest":{"types":"./dist/manifest.d.ts","import":"./dist/manifest.js","default":"./dist/manifest.js"},"./manifest.json":"./dist/manifest.json"},"gitHead":"03d52f782479eb14864b63c1c6756ed76cb85e4a","scripts":{"test":"bun test tests/","build":"rm -rf dist && bun build src/index.ts src/manifest.ts --outdir dist --root src --sourcemap --target=browser --external @absolutejs/manifest --external @sinclair/typebox && tsc --project tsconfig.build.json && absolute-manifest emit","format":"prettier --write \"./**/*.{ts,json,md}\"","release":"bun run check:package && npm publish --access public","typecheck":"tsc --noEmit","format:check":"prettier --check \"./**/*.{ts,json,md}\"","check:package":"bun run format:check && bun run typecheck && bun run test && bun run build && bun run verify-package","verify-package":"absolute-manifest verify-package"},"_npmUser":{"name":"alexkahndev","email":"alexkahn2019@gmail.com"},"absolutejs":{"manifestContract":2},"repository":{"url":"git+https://github.com/absolutejs/secure-transfer.git","type":"git"},"_npmVersion":"10.9.2","description":"Provider-neutral encrypted, record-oriented large-object transfer for AbsoluteJS.","directories":{},"_nodeVersion":"22.14.0","dependencies":{"@sinclair/typebox":"^0.34.0","@absolutejs/manifest":"^0.9.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"prettier":"^3.9.0","@types/bun":"^1.3.14","typescript":"^5.9.0"},"_npmOperationalInternal":{"tmp":"tmp/secure-transfer_0.1.0_1787793952607_0.6034591857871046","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@absolutejs/secure-transfer","version":"0.1.1","author":{"name":"Alex Kahn"},"license":"Apache-2.0","_id":"@absolutejs/secure-transfer@0.1.1","maintainers":[{"name":"alexkahndev","email":"alexkahn2019@gmail.com"}],"homepage":"https://github.com/absolutejs/secure-transfer","bugs":{"url":"https://github.com/absolutejs/secure-transfer/issues"},"dist":{"shasum":"9c5ee8ec532d134d27602d7686459058658fe1ab","tarball":"https://registry.npmjs.org/@absolutejs/secure-transfer/-/secure-transfer-0.1.1.tgz","fileCount":16,"integrity":"sha512-tZ1Lc1dIhadK5nIAoZDHi/c9+yBi55o9p+2oBmo88KaCTOH8iJTj2ZboLaiQofW238QQWJ/C/uzLQGMJXnqLNQ==","signatures":[{"sig":"MEUCIDLBcKPlo9mif3MmysMFZKHbUGGRsrh+bXZ1WPHxW/UTAiEAupRUb38EY8QFkToapKT7LTii7H/NRRspuc99GFSGAyc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":123837},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./manifest":{"types":"./dist/manifest.d.ts","import":"./dist/manifest.js","default":"./dist/manifest.js"},"./manifest.json":"./dist/manifest.json"},"gitHead":"8797c62a96634db9a0562be69e9a862b18ff0673","scripts":{"test":"bun test tests/","build":"rm -rf dist && bun build src/index.ts src/manifest.ts --outdir dist --root src --sourcemap --target=browser --external @absolutejs/manifest --external @sinclair/typebox && tsc --project tsconfig.build.json && absolute-manifest emit","format":"prettier --write \"./**/*.{ts,json,md}\"","release":"bun run check:package && npm publish --access public","typecheck":"tsc --noEmit","format:check":"prettier --check \"./**/*.{ts,json,md}\"","check:package":"bun run format:check && bun run typecheck && bun run test && bun run build && bun run verify-package","verify-package":"absolute-manifest verify-package"},"_npmUser":{"name":"alexkahndev","email":"alexkahn2019@gmail.com"},"absolutejs":{"manifestContract":2},"repository":{"url":"git+https://github.com/absolutejs/secure-transfer.git","type":"git"},"_npmVersion":"10.9.2","description":"Provider-neutral encrypted, record-oriented large-object transfer for AbsoluteJS.","directories":{},"_nodeVersion":"22.14.0","dependencies":{"@sinclair/typebox":"^0.34.0","@absolutejs/manifest":"^0.9.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"prettier":"^3.9.0","@types/bun":"^1.3.14","typescript":"^5.9.0"},"_npmOperationalInternal":{"tmp":"tmp/secure-transfer_0.1.1_1787794407998_0.46945592291930005","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@absolutejs/secure-transfer","version":"0.1.2","author":{"name":"Alex Kahn"},"license":"Apache-2.0","_id":"@absolutejs/secure-transfer@0.1.2","maintainers":[{"name":"alexkahndev","email":"alexkahn2019@gmail.com"}],"homepage":"https://github.com/absolutejs/secure-transfer","bugs":{"url":"https://github.com/absolutejs/secure-transfer/issues"},"dist":{"shasum":"9f7c32cae5279f13a972a003bc5f5043075b20b6","tarball":"https://registry.npmjs.org/@absolutejs/secure-transfer/-/secure-transfer-0.1.2.tgz","fileCount":16,"integrity":"sha512-7p0opbjF5Lyi+LIKfjdFl1rmZU9lwD0Wc94LEWoo9+1FbcK5X4x4EAjbciUas/dplSHPMKEM2VB89C8kVK8FvQ==","signatures":[{"sig":"MEYCIQDynWn109QLByQVc9/Nylc8woaZKJgtUpeuszjrNJEoAgIhAKMY+3xZe35EnTuH4HuQDBwOHiomTpjxbqBgRXJv5H5H","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":124105},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./manifest":{"types":"./dist/manifest.d.ts","import":"./dist/manifest.js","default":"./dist/manifest.js"},"./manifest.json":"./dist/manifest.json"},"gitHead":"08675d1ec58909e40f18d76fe80d70fb0dfa5820","scripts":{"test":"bun test tests/","build":"rm -rf dist && bun build src/index.ts src/manifest.ts --outdir dist --root src --sourcemap --target=browser --external @absolutejs/manifest --external @sinclair/typebox && tsc --project tsconfig.build.json && absolute-manifest emit","format":"prettier --write \"./**/*.{ts,json,md}\"","release":"bun run check:package && npm publish --access public","typecheck":"tsc --noEmit","format:check":"prettier --check \"./**/*.{ts,json,md}\"","check:package":"bun run format:check && bun run typecheck && bun run test && bun run build && bun run verify-package","verify-package":"absolute-manifest verify-package"},"_npmUser":{"name":"alexkahndev","email":"alexkahn2019@gmail.com"},"absolutejs":{"manifestContract":2},"repository":{"url":"git+https://github.com/absolutejs/secure-transfer.git","type":"git"},"_npmVersion":"10.9.2","description":"Provider-neutral encrypted, record-oriented large-object transfer for AbsoluteJS.","directories":{},"_nodeVersion":"22.14.0","dependencies":{"@sinclair/typebox":"^0.34.0","@absolutejs/manifest":"^0.9.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"prettier":"^3.9.0","@types/bun":"^1.3.14","typescript":"^5.9.0"},"_npmOperationalInternal":{"tmp":"tmp/secure-transfer_0.1.2_1787794939799_0.6772512023211499","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@absolutejs/secure-transfer","version":"0.2.0","author":{"name":"Alex Kahn"},"license":"Apache-2.0","_id":"@absolutejs/secure-transfer@0.2.0","maintainers":[{"name":"alexkahndev","email":"alexkahn2019@gmail.com"}],"homepage":"https://github.com/absolutejs/secure-transfer","bugs":{"url":"https://github.com/absolutejs/secure-transfer/issues"},"dist":{"shasum":"7bd7ae41319527167adc07b3ef0f71b13c04948e","tarball":"https://registry.npmjs.org/@absolutejs/secure-transfer/-/secure-transfer-0.2.0.tgz","fileCount":16,"integrity":"sha512-KsJ5AvwUYdLjO2wlNiKHATDu2i+Q1HBqIIrIFBBsjAU1G1HLXsvusj/MbnfU06+G4iQEZfwMSm8xSwS9wWUJGQ==","signatures":[{"sig":"MEUCIBz4mYzl1tldme/ZlQhqTukYR0TfaFGSkusjCFJ+YystAiEAoxV5eteJushbpeokkp6LJYANYB4iUpEQ2FlBVOS1cLE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":157448},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./manifest":{"types":"./dist/manifest.d.ts","import":"./dist/manifest.js","default":"./dist/manifest.js"},"./manifest.json":"./dist/manifest.json"},"gitHead":"1bd7f04727c524e7d4a662ef7a1dd16769e6b8de","scripts":{"test":"bun test tests/","build":"rm -rf dist && bun build src/index.ts src/manifest.ts --outdir dist --root src --sourcemap --target=browser --external @absolutejs/manifest --external @sinclair/typebox && tsc --project tsconfig.build.json && absolute-manifest emit","format":"prettier --write \"./**/*.{ts,json,md}\"","release":"bun run check:package && npm publish --access public","typecheck":"tsc --noEmit","format:check":"prettier --check \"./**/*.{ts,json,md}\"","check:package":"bun run format:check && bun run typecheck && bun run test && bun run build && bun run verify-package","verify-package":"absolute-manifest verify-package"},"_npmUser":{"name":"alexkahndev","email":"alexkahn2019@gmail.com"},"absolutejs":{"manifestContract":2},"repository":{"url":"git+https://github.com/absolutejs/secure-transfer.git","type":"git"},"_npmVersion":"10.9.2","description":"Provider-neutral encrypted, record-oriented large-object transfer for AbsoluteJS.","directories":{},"_nodeVersion":"22.14.0","dependencies":{"@sinclair/typebox":"^0.34.0","@absolutejs/manifest":"^0.9.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"prettier":"^3.9.0","@types/bun":"^1.3.14","typescript":"^5.9.0"},"_npmOperationalInternal":{"tmp":"tmp/secure-transfer_0.2.0_1787795930200_0.46505256530784145","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@absolutejs/secure-transfer","version":"0.3.0","description":"Provider-neutral encrypted, record-oriented large-object transfer for AbsoluteJS.","type":"module","license":"Apache-2.0","author":{"name":"Alex Kahn"},"repository":{"type":"git","url":"git+https://github.com/absolutejs/secure-transfer.git"},"homepage":"https://github.com/absolutejs/secure-transfer","bugs":{"url":"https://github.com/absolutejs/secure-transfer/issues"},"main":"./dist/index.js","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./manifest":{"types":"./dist/manifest.d.ts","import":"./dist/manifest.js","default":"./dist/manifest.js"},"./manifest.json":"./dist/manifest.json"},"publishConfig":{"access":"public"},"scripts":{"build":"rm -rf dist && bun build src/index.ts src/manifest.ts --outdir dist --root src --sourcemap --target=browser --external @absolutejs/manifest --external @sinclair/typebox && tsc --project tsconfig.build.json && absolute-manifest emit","check:package":"bun run format:check && bun run typecheck && bun run test && bun run build && bun run verify-package","format":"prettier --write \"./**/*.{ts,json,md}\"","format:check":"prettier --check \"./**/*.{ts,json,md}\"","release":"bun run check:package && npm publish --access public","test":"bun test tests/","typecheck":"tsc --noEmit","verify-package":"absolute-manifest verify-package"},"dependencies":{"@absolutejs/manifest":"^0.9.0","@sinclair/typebox":"^0.34.0"},"devDependencies":{"@types/bun":"^1.3.14","prettier":"^3.9.0","typescript":"^5.9.0"},"absolutejs":{"manifestContract":2},"_id":"@absolutejs/secure-transfer@0.3.0","gitHead":"dbb7ef1cd37bafa5a53d66a53df6a884febef8b1","_nodeVersion":"22.14.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-ZeSCFstpS8yS+QYMZ1Y3hASMWwP7JbpbePBvYhD6VdnMCqOy218CN4VlNvU3RJ6mmvgLl+Sy0A08+ksxJGZsjA==","shasum":"10f9e92739f0e87d8b7bed0e4cad19626601c994","tarball":"https://registry.npmjs.org/@absolutejs/secure-transfer/-/secure-transfer-0.3.0.tgz","fileCount":16,"unpackedSize":183858,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDt1QlE/5fLrExx5W+xAsTSy3rY9CizNKLUGz3XU2+hTgIhAO+FAYdACpnXL5VSu83Nk8skQeFAnzwueT0W6gZW6tBb"}]},"_npmUser":{"name":"alexkahndev","email":"alexkahn2019@gmail.com"},"directories":{},"maintainers":[{"name":"alexkahndev","email":"alexkahn2019@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/secure-transfer_0.3.0_1787797229669_0.3105667552967506"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-27T00:44:36.476Z","modified":"2026-08-27T02:20:29.968Z","0.0.1":"2026-08-27T00:44:36.743Z","0.0.2":"2026-08-27T00:49:30.061Z","0.0.3":"2026-08-27T01:07:33.915Z","0.1.0":"2026-08-27T01:25:52.762Z","0.1.1":"2026-08-27T01:33:28.182Z","0.1.2":"2026-08-27T01:42:19.971Z","0.2.0":"2026-08-27T01:58:50.344Z","0.3.0":"2026-08-27T02:20:29.808Z"},"bugs":{"url":"https://github.com/absolutejs/secure-transfer/issues"},"author":{"name":"Alex Kahn"},"license":"Apache-2.0","homepage":"https://github.com/absolutejs/secure-transfer","repository":{"type":"git","url":"git+https://github.com/absolutejs/secure-transfer.git"},"description":"Provider-neutral encrypted, record-oriented large-object transfer for AbsoluteJS.","maintainers":[{"name":"alexkahndev","email":"alexkahn2019@gmail.com"}],"readme":"# `@absolutejs/secure-transfer`\n\nProvider-neutral encrypted large-object transfer for AbsoluteJS. It splits a\nknown-length source into bounded, independently authenticated records, writes\nonly ciphertext to an untrusted store, and downloads into a transactional sink.\n\n```ts\nconst transfer = createSecureTransferClient({\n  cryptoProvider,\n  store,\n  policy: {\n    maximumAttachmentBytes: 1024 ** 4,\n    maximumDescriptorBytes: 16 * 1024,\n    maximumFutureSkewMs: 300_000,\n    maximumMetadataBytes: 4 * 1024,\n    maximumRecordPlaintextBytes: 1024 * 1024,\n    maximumRecords: 1_048_576,\n    maximumTtlMs: 7 * 24 * 60 * 60 * 1000,\n  },\n});\n\nconst descriptor = await transfer.upload({\n  attachmentId: crypto.randomUUID(),\n  body: file.stream(),\n  byteLength: file.size,\n  contentType: file.type,\n  conversationId,\n  expiresAt: Date.now() + 86_400_000,\n  fileName: file.name,\n  senderDeviceId,\n});\n\nawait messaging.send({\n  conversationId,\n  id: crypto.randomUUID(),\n  plaintext: encodeSecureTransferDescriptor(descriptor),\n  purpose: \"secure-transfer.descriptor\",\n  ttlMs: 86_400_000,\n});\n```\n\n## Authenticated byte ranges\n\n`downloadRange()` authenticates every complete encrypted record covering the\nrequested interval, then passes only the selected plaintext bytes to a\ntransactional range sink. The range is `[start, endExclusive)` and must be\nnon-empty and within the descriptor's declared plaintext size.\n\n```ts\nawait transfer.downloadRange(\n  descriptor,\n  { start: 1_048_576, endExclusive: 2_097_152 },\n  rangeSink,\n);\n```\n\nThis proves the authenticity and position of the requested records against the\ndescriptor. It intentionally does not fetch or prove the current availability\nof records outside the range.\n\n## Honest revocation\n\nConfigure a trusted `SecureTransferRevocationStore`, then create the durable\ntombstone before attempting ciphertext cleanup:\n\n```ts\nconst { revocation, ciphertextRemoved } = await transfer.revoke({\n  descriptor,\n  reason: \"member-removed\",\n  revokerDeviceId,\n});\n\nawait messaging.send({\n  conversationId,\n  id: crypto.randomUUID(),\n  plaintext: encodeSecureTransferRevocation(revocation),\n  purpose: \"secure-transfer.revocation\",\n  ttlMs,\n});\n```\n\nRecipients must authenticate the E2EE sender, authorize that device to revoke\nthe attachment, strictly decode the notice, and only then call\n`applyRevocation()`. The notice is bound to the exact descriptor by a SHA-256\nhash. Downloads consult trusted policy state before and throughout retrieval and\nfail closed when that store errors. Keep tombstones at least through the\ndescriptor expiry; `ciphertextRemoved: false` means cleanup must be retried even\nthough cooperating clients already block the transfer.\n\nRevocation is not retroactive cryptographic erasure. A bearer capability,\nciphertext, or plaintext already copied by a recipient cannot be recalled.\nAfter an MLS member removal, use a fresh capability for replacement content and\ndeliver its descriptor only in the new epoch; removal protects future epoch\ntraffic, not secrets the former member already received. This follows the epoch\nand member-removal model in [RFC 9420](https://www.rfc-editor.org/rfc/rfc9420.html).\nWhere a deployment uses cryptographic erase for storage cleanup, follow the key\nsanitization program in\n[NIST SP 800-88 Rev. 2](https://csrc.nist.gov/pubs/sp/800/88/r2/final); that still\ndoes not sanitize independently held recipient copies.\n\n## Post-membership capability replacement\n\nAn MLS removal changes who receives future epoch secrets, but it does not change\nan attachment capability already delivered in an earlier epoch. For retained\nattachments that a removed device must no longer fetch, upload a new encrypted\ncopy with a fresh capability and send the replacement only in the new epoch:\n\n```ts\nconst membership = await messaging.removeMembers({\n  conversationId,\n  deviceIds: [removedDeviceId],\n  ttlMs,\n});\n\nconst replacement = await transfer.prepareReplacement({\n  previousDescriptor,\n  reason: \"membership-change\",\n  replacement: {\n    ...replacementMetadata,\n    body: reopenPlaintextSource(),\n    senderDeviceId,\n  },\n  securityEpoch: membership.epoch,\n});\n\nawait messaging.send({\n  conversationId,\n  expectedSecurityEpoch: membership.epoch,\n  id: crypto.randomUUID(),\n  plaintext: encodeSecureTransferReplacement(replacement),\n  purpose: \"secure-transfer.replacement\",\n  ttlMs,\n});\n\nawait transfer.activateReplacement({\n  authenticatedContext: {\n    conversationId,\n    purpose: \"secure-transfer.replacement\",\n    securityEpoch: membership.epoch,\n    senderId: senderDeviceId,\n  },\n  persistReplacement: saveProtectedDescriptor,\n  previousDescriptor,\n  removeSupersededCiphertext: true,\n  replacement,\n});\n```\n\nThe secure-messaging send persists advanced MLS state and its retryable outbox\nentry before returning, even when delivery is queued. Only then should the\nsender activate supersession and remove old ciphertext. A recipient strictly\ndecodes the same payload and passes the message's authenticated context to\n`activateReplacement()`. Activation verifies the old descriptor hash, fresh\ntransfer ID and capability, attachment, conversation, sender, purpose, and exact\nepoch. Its `persistReplacement` callback runs before the old tombstone is\ninstalled and must be durable, idempotent, and protect the bearer descriptor.\n\nIf activation crashes after descriptor persistence but before supersession,\nretry the same payload. This temporarily leaves the old transfer usable instead\nof stranding the replacement. Expiry sweeps clean abandoned new ciphertext when\na message can never be durably queued. Rate-limit rotations and prioritize only\nattachments that remain useful; membership churn must not become an unbounded\nre-encryption denial of service.\n\n## Resumable uploads\n\nConfigure a `SecureTransferReceiptProtector` and\n`SecureTransferProtectedReceiptStore`, then persist the initial protected receipt\nbefore reading the source:\n\n```ts\nconst { receiptId } = await transfer.beginResumableUpload({\n  attachmentId,\n  byteLength: file.size,\n  conversationId,\n  expiresAt,\n  fileName: file.name,\n  senderDeviceId,\n});\n\nconst descriptor = await transfer.resumeUpload({\n  receiptId,\n  source: (byteOffset) => file.slice(byteOffset).stream(),\n});\n```\n\nReceipts contain the transfer's bearer decryption capability. Core passes only\nprotected opaque bytes to receipt storage and binds protection to `receiptId`.\nUse an authenticated protector backed by a key that is separate from object\nstorage credentials. Never implement the protector as plaintext or reversible\nencoding.\n\nReceipt stores must implement atomic lease acquisition and compare-and-swap\nupdates. Core checkpoints `phase: \"sealing\"` before invoking record encryption.\nIf a crash occurs after ciphertext storage, resume authenticates that ciphertext\nagainst the source before advancing. If encryption might have happened but no\nciphertext is durable, `SecureTransferResumeUnsafeError` requires a new transfer\nand capability rather than risking nonce reuse.\nReceipt adapters should implement\n`SecureTransferProtectedReceiptLifecycleStore`; run `sweepExpiredReceipts()`\nwith its returned cursor until `truncated` is false.\n\nThe descriptor contains the decryption capability and sensitive metadata. It is\nplaintext until the caller protects it with `@absolutejs/secure-messaging` or an\nE2EE envelope. Never place it in object metadata, logs, URLs, push payloads, or a\nnormal chat message.\n\n## Security model\n\n- Storage receives opaque transfer IDs, record indexes, ciphertext sizes, and\n  expiry. It does not receive filenames, media types, conversation IDs, or keys.\n- Every record is bound to the transfer, attachment, conversation, sender,\n  position, total count, expected plaintext size, final-record marker, and expiry.\n- Record creation is create-only. A collision must never overwrite ciphertext.\n- Missing, reordered, substituted, duplicated, truncated, and extended records\n  fail authentication or descriptor validation.\n- Downloads target a staging sink. `commit()` occurs only after every record is\n  authenticated; failure calls `abort()` so partial plaintext is not mistaken for\n  a complete file.\n- Range downloads preserve the same staging rule but authenticate only records\n  intersecting the requested byte interval.\n- Revocation stores are trusted authorization state and should use credentials\n  and retention controls distinct from untrusted ciphertext storage.\n- Upload failure makes a best-effort ciphertext cleanup. Production adapters\n  should implement `SecureTransferLifecycleStore` and run bounded expiry sweeps\n  repeatedly with the returned `cursor` until `truncated` is false so live\n  records at the start of a listing cannot starve crash-orphan cleanup.\n\nThis framing is inspired by [RFC 8188](https://www.rfc-editor.org/rfc/rfc8188.html),\nespecially its authenticated record sequence, truncation handling, and unique\nper-record nonce requirements. It is not the RFC 8188 HTTP wire format.\nThe resumable state machine follows\n[RFC 5116 section 3.1](https://www.rfc-editor.org/rfc/rfc5116.html#section-3.1),\nwhich calls for durable nonce checkpointing before encryption proceeds.\n\nFile names and media types are untrusted display hints. Applications must enforce\nallowlists, size limits, safe download dispositions, and client-side inspection\nafter decryption. Server-side malware scanning cannot inspect end-to-end encrypted\nciphertext without deliberately changing the confidentiality boundary.\n\n## Scope\n\nVersion `0.2.0` provides upload, strict descriptor, receipt, and revocation\nencoding, full and byte-range authenticated download, resumable crash recovery,\ntransactional sinks, honest future-fetch revocation, cleanup, and provider/store\ncontracts. Concrete local and S3/R2 storage adapters live in\n[`secure-transfer-adapters`](https://github.com/absolutejs/secure-transfer-adapters).\nVersion `0.3.0` adds epoch-bound fresh-capability replacement and staged\nsupersession after MLS membership changes.\n\n## License\n\nApache-2.0\n","readmeFilename":"README.md"}