{"_id":"@bandeira-tech/b3nd-core","_rev":"7-9b03b74cee646aa4d97afcc44efcf979","name":"@bandeira-tech/b3nd-core","dist-tags":{"latest":"0.26.0"},"versions":{"0.10.0":{"name":"@bandeira-tech/b3nd-core","version":"0.10.0","license":"MIT","_id":"@bandeira-tech/b3nd-core@0.10.0","maintainers":[{"name":"r-bandeira-tech","email":"bandeira-tech@pm.me"}],"homepage":"https://github.com/bandeira-tech/b3nd-core#readme","bugs":{"url":"https://github.com/bandeira-tech/b3nd-core/issues"},"dist":{"shasum":"c5670ec31748d7f34e89fe320c11ec836b47ab77","tarball":"https://registry.npmjs.org/@bandeira-tech/b3nd-core/-/b3nd-core-0.10.0.tgz","fileCount":142,"integrity":"sha512-QDpJS+t+aneC91z3aDga760CH+Boh5fJUFQJ36au4TKGdn5953J1M9i6bC1M9WywJo5ZXvsfsU03/6lAnnoRrA==","signatures":[{"sig":"MEUCIAxPan823NgoMhzalDaExE1hrA/S0PGScHqGtYP8csQwAiEAtosLMj3WLMA1Wp4DiwKn3DR+vu3Y/FlqiUfZM03ebic=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":370987},"module":"./esm/mod.js","engines":{"node":">=20"},"exports":{".":{"types":"./esm/mod.d.ts","import":"./esm/mod.js"},"./rig":{"types":"./esm/rig.d.ts","import":"./esm/rig.js"},"./types":{"types":"./esm/types.d.ts","import":"./esm/types.js"},"./binary":{"types":"./esm/binary.d.ts","import":"./esm/binary.js"},"./network":{"types":"./esm/network.d.ts","import":"./esm/network.js"},"./encoding":{"types":"./esm/encoding.d.ts","import":"./esm/encoding.js"},"./identity":{"types":"./esm/identity.d.ts","import":"./esm/identity.js"},"./client-ws":{"types":"./esm/client-ws.d.ts","import":"./esm/client-ws.js"},"./client-http":{"types":"./esm/client-http.d.ts","import":"./esm/client-http.js"},"./client-memory":{"types":"./esm/client-memory.d.ts","import":"./esm/client-memory.js"},"./client-console":{"types":"./esm/client-console.d.ts","import":"./esm/client-console.js"}},"gitHead":"8c180fd57b2a82cf5ea0e06dbe25b2cb119ffe4f","scripts":{},"_npmUser":{"name":"r-bandeira-tech","email":"bandeira-tech@pm.me"},"repository":{"url":"git+https://github.com/bandeira-tech/b3nd-core.git","type":"git"},"_npmVersion":"11.6.2","description":"B3nd Core — framework foundation: types, encoding, clients, rig, network","directories":{},"sideEffects":false,"_nodeVersion":"24.11.1","dependencies":{"canonicalize":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/b3nd-core_0.10.0_1777551332059_0.703965946570861","host":"s3://npm-registry-packages-npm-production"}},"0.11.0":{"name":"@bandeira-tech/b3nd-core","version":"0.11.0","license":"MIT","_id":"@bandeira-tech/b3nd-core@0.11.0","maintainers":[{"name":"r-bandeira-tech","email":"bandeira-tech@pm.me"}],"homepage":"https://github.com/bandeira-tech/b3nd-core#readme","bugs":{"url":"https://github.com/bandeira-tech/b3nd-core/issues"},"dist":{"shasum":"6837b3a643ca10835fd98527d464f5867b78978b","tarball":"https://registry.npmjs.org/@bandeira-tech/b3nd-core/-/b3nd-core-0.11.0.tgz","fileCount":121,"integrity":"sha512-HJF49k5h/bd3D5Bt9alwEIdQPbZPq7uedbYnxhHRpXIpSA1xhRd9qM4STd49Pr6u3B3vHvBzjWB7Z7ZJfIQrew==","signatures":[{"sig":"MEYCIQCWVx87GOGSNukRxlDKHehiuNLO5/rp6hK6bEq2ZGZJRwIhAMdD+8TWmDBz83+F5HaJA9yX2jaPsyhZOE4One1re8hB","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":367967},"module":"./esm/mod.js","engines":{"node":">=20"},"exports":{".":{"types":"./esm/mod.d.ts","import":"./esm/mod.js"},"./rig":{"types":"./esm/rig.d.ts","import":"./esm/rig.js"},"./types":{"types":"./esm/libs/b3nd-core/types.d.ts","import":"./esm/libs/b3nd-core/types.js"},"./binary":{"types":"./esm/libs/b3nd-core/binary.d.ts","import":"./esm/libs/b3nd-core/binary.js"},"./network":{"types":"./esm/libs/b3nd-network/mod.d.ts","import":"./esm/libs/b3nd-network/mod.js"},"./encoding":{"types":"./esm/libs/b3nd-core/encoding.d.ts","import":"./esm/libs/b3nd-core/encoding.js"},"./identity":{"types":"./esm/libs/b3nd-rig/identity.d.ts","import":"./esm/libs/b3nd-rig/identity.js"},"./client-ws":{"types":"./esm/client-ws.d.ts","import":"./esm/client-ws.js"},"./client-http":{"types":"./esm/client-http.d.ts","import":"./esm/client-http.js"},"./client-memory":{"types":"./esm/libs/b3nd-client-memory/store.d.ts","import":"./esm/libs/b3nd-client-memory/store.js"},"./client-console":{"types":"./esm/libs/b3nd-client-console/mod.d.ts","import":"./esm/libs/b3nd-client-console/mod.js"}},"gitHead":"48a55820329e824eb3edd5e1b05d8f5fac4c7336","scripts":{},"_npmUser":{"name":"r-bandeira-tech","email":"bandeira-tech@pm.me"},"repository":{"url":"git+https://github.com/bandeira-tech/b3nd-core.git","type":"git"},"_npmVersion":"11.6.2","description":"B3nd Core — framework foundation: types, encoding, clients, rig, network","directories":{},"sideEffects":false,"_nodeVersion":"24.11.1","dependencies":{"canonicalize":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/b3nd-core_0.11.0_1777553204935_0.8372677261314965","host":"s3://npm-registry-packages-npm-production"}},"0.12.0":{"name":"@bandeira-tech/b3nd-core","version":"0.12.0","license":"MIT","_id":"@bandeira-tech/b3nd-core@0.12.0","maintainers":[{"name":"r-bandeira-tech","email":"bandeira-tech@pm.me"}],"homepage":"https://github.com/bandeira-tech/b3nd-core#readme","bugs":{"url":"https://github.com/bandeira-tech/b3nd-core/issues"},"dist":{"shasum":"d6f8c8b5c1962e55f5b2f4a8e98509d64d553eef","tarball":"https://registry.npmjs.org/@bandeira-tech/b3nd-core/-/b3nd-core-0.12.0.tgz","fileCount":118,"integrity":"sha512-3kRjNau6skj0dny06gRDY1saQWIcm0gCPFVEQPRL0554ywEDcSwiadVuqLn6+rU0u/lIEsuBxgA8odS9wF+ZKQ==","signatures":[{"sig":"MEYCIQCLHYcWIqnGqe9uUlHPkWdX+zHiOfvighaM3pkd7Ja32AIhAJ75yJHbUvnNywRrf8uX2jzqyItFy//vKblX4BiNDiCt","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":363387},"module":"./esm/mod.js","engines":{"node":">=20"},"exports":{".":{"types":"./esm/mod.d.ts","import":"./esm/mod.js"},"./rig":{"types":"./esm/rig.d.ts","import":"./esm/rig.js"},"./types":{"types":"./esm/libs/b3nd-core/types.d.ts","import":"./esm/libs/b3nd-core/types.js"},"./binary":{"types":"./esm/libs/b3nd-core/binary.d.ts","import":"./esm/libs/b3nd-core/binary.js"},"./network":{"types":"./esm/libs/b3nd-network/mod.d.ts","import":"./esm/libs/b3nd-network/mod.js"},"./encoding":{"types":"./esm/libs/b3nd-core/encoding.d.ts","import":"./esm/libs/b3nd-core/encoding.js"},"./identity":{"types":"./esm/libs/b3nd-rig/identity.d.ts","import":"./esm/libs/b3nd-rig/identity.js"},"./client-ws":{"types":"./esm/client-ws.d.ts","import":"./esm/client-ws.js"},"./client-http":{"types":"./esm/client-http.d.ts","import":"./esm/client-http.js"},"./client-memory":{"types":"./esm/libs/b3nd-client-memory/store.d.ts","import":"./esm/libs/b3nd-client-memory/store.js"},"./client-console":{"types":"./esm/libs/b3nd-client-console/mod.d.ts","import":"./esm/libs/b3nd-client-console/mod.js"}},"gitHead":"b5dfd04f50c55b9232801ba899c4ab0905a31e51","scripts":{},"_npmUser":{"name":"r-bandeira-tech","email":"bandeira-tech@pm.me"},"repository":{"url":"git+https://github.com/bandeira-tech/b3nd-core.git","type":"git"},"_npmVersion":"11.6.2","description":"B3nd Core — framework foundation: types, encoding, clients, rig, network","directories":{},"sideEffects":false,"_nodeVersion":"24.11.1","dependencies":{"canonicalize":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/b3nd-core_0.12.0_1777631605334_0.6287651909913363","host":"s3://npm-registry-packages-npm-production"}},"0.14.0":{"name":"@bandeira-tech/b3nd-core","version":"0.14.0","license":"MIT","_id":"@bandeira-tech/b3nd-core@0.14.0","maintainers":[{"name":"r-bandeira-tech","email":"bandeira-tech@pm.me"}],"homepage":"https://github.com/bandeira-tech/b3nd-core#readme","bugs":{"url":"https://github.com/bandeira-tech/b3nd-core/issues"},"dist":{"shasum":"5340a91ea93bad82f79beeea8a9482f87231cd32","tarball":"https://registry.npmjs.org/@bandeira-tech/b3nd-core/-/b3nd-core-0.14.0.tgz","fileCount":130,"integrity":"sha512-rkzB58VO/3NqNj/1APID0JShOr+OQmmgsGgjbrlJ/pQTQhHnWQRs3ii55PwgVwfu5tfsi+lvVecOzCNh5OkTdQ==","signatures":[{"sig":"MEUCIGMe5QdVl6GP55pcihxJnVrXj3dXJ9lUoZDOS3SD2DfKAiEAuHK5yWu/dIHf/T1u5Hp/s0h4Gi+JcdLPXIYcNT00DKw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":375691},"module":"./esm/mod.js","engines":{"node":">=20"},"exports":{".":{"types":"./esm/mod.d.ts","import":"./esm/mod.js"},"./rig":{"types":"./esm/rig.d.ts","import":"./esm/rig.js"},"./hash":{"types":"./esm/hash.d.ts","import":"./esm/hash.js"},"./types":{"types":"./esm/libs/b3nd-core/types.d.ts","import":"./esm/libs/b3nd-core/types.js"},"./binary":{"types":"./esm/libs/b3nd-core/binary.d.ts","import":"./esm/libs/b3nd-core/binary.js"},"./encrypt":{"types":"./esm/encrypt.d.ts","import":"./esm/encrypt.js"},"./network":{"types":"./esm/libs/b3nd-network/mod.d.ts","import":"./esm/libs/b3nd-network/mod.js"},"./encoding":{"types":"./esm/libs/b3nd-core/encoding.d.ts","import":"./esm/libs/b3nd-core/encoding.js"},"./identity":{"types":"./esm/libs/b3nd-rig/identity.d.ts","import":"./esm/libs/b3nd-rig/identity.js"},"./client-ws":{"types":"./esm/client-ws.d.ts","import":"./esm/client-ws.js"},"./client-http":{"types":"./esm/client-http.d.ts","import":"./esm/client-http.js"},"./client-memory":{"types":"./esm/libs/b3nd-client-memory/store.d.ts","import":"./esm/libs/b3nd-client-memory/store.js"},"./client-console":{"types":"./esm/libs/b3nd-client-console/mod.d.ts","import":"./esm/libs/b3nd-client-console/mod.js"}},"gitHead":"a6e639eb41fd362f4d2a5312666bf9868c137dea","scripts":{},"_npmUser":{"name":"r-bandeira-tech","email":"bandeira-tech@pm.me"},"repository":{"url":"git+https://github.com/bandeira-tech/b3nd-core.git","type":"git"},"_npmVersion":"11.6.2","description":"B3nd Core — framework foundation: types, encoding, clients, rig, network, hash, encrypt","directories":{},"sideEffects":false,"_nodeVersion":"24.11.1","dependencies":{"canonicalize":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/b3nd-core_0.14.0_1778073847540_0.6327961311843309","host":"s3://npm-registry-packages-npm-production"}},"0.22.0":{"name":"@bandeira-tech/b3nd-core","version":"0.22.0","license":"MIT","_id":"@bandeira-tech/b3nd-core@0.22.0","maintainers":[{"name":"r-bandeira-tech","email":"bandeira-tech@pm.me"}],"homepage":"https://github.com/bandeira-tech/b3nd-core#readme","bugs":{"url":"https://github.com/bandeira-tech/b3nd-core/issues"},"dist":{"shasum":"da2cbc35111d3a36fb35e7f32d46074cc00e6682","tarball":"https://registry.npmjs.org/@bandeira-tech/b3nd-core/-/b3nd-core-0.22.0.tgz","fileCount":91,"integrity":"sha512-XBpXIGYPnxLel6XykCTNhIzenJEw2cZFsXQBnmAhcSJz8d1FY4mEmtgAMFV4PWRyNuvu1A4N6KnaTYX4fL1xPA==","signatures":[{"sig":"MEUCIQC0Pw9xTd2dedh2Vfql9uLscYUypzhkLubcUUDy3R3tgAIgIqu3Jo/GN6qEVxCLX6u10uDt4bD3jFWzn+pUnSbEQ7A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":277411},"module":"./esm/mod.js","engines":{"node":">=20"},"exports":{".":{"types":"./esm/mod.d.ts","import":"./esm/mod.js"},"./rig":{"types":"./esm/src/rig/mod.d.ts","import":"./esm/src/rig/mod.js"},"./hash":{"types":"./esm/src/hash/hash.d.ts","import":"./esm/src/hash/hash.js"},"./types":{"types":"./esm/src/types/types.d.ts","import":"./esm/src/types/types.js"},"./encrypt":{"types":"./esm/src/encrypt/mod.d.ts","import":"./esm/src/encrypt/mod.js"},"./network":{"types":"./esm/src/network/mod.d.ts","import":"./esm/src/network/mod.js"},"./encoding":{"types":"./esm/src/encoding/encoding.d.ts","import":"./esm/src/encoding/encoding.js"},"./identity":{"types":"./esm/src/rig/identity.d.ts","import":"./esm/src/rig/identity.js"},"./client-console":{"types":"./esm/src/client-console/mod.d.ts","import":"./esm/src/client-console/mod.js"}},"gitHead":"25704ecb9cdc441ad62442b946c0ee455a3fc332","scripts":{},"_npmUser":{"name":"r-bandeira-tech","email":"bandeira-tech@pm.me"},"repository":{"url":"git+https://github.com/bandeira-tech/b3nd-core.git","type":"git"},"_npmVersion":"9.6.3","description":"B3nd Core — framework foundation: types, encoding, clients, rig, network, hash, encrypt","directories":{},"sideEffects":false,"_nodeVersion":"18.15.0","dependencies":{"canonicalize":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/b3nd-core_0.22.0_1781820532859_0.08473649603513977","host":"s3://npm-registry-packages-npm-production"}},"0.25.0":{"name":"@bandeira-tech/b3nd-core","version":"0.25.0","license":"MIT","_id":"@bandeira-tech/b3nd-core@0.25.0","maintainers":[{"name":"r-bandeira-tech","email":"bandeira-tech@pm.me"}],"homepage":"https://github.com/bandeira-tech/b3nd-core#readme","bugs":{"url":"https://github.com/bandeira-tech/b3nd-core/issues"},"dist":{"shasum":"f31b9b44dadab91296fd6225c8dad59d7f844195","tarball":"https://registry.npmjs.org/@bandeira-tech/b3nd-core/-/b3nd-core-0.25.0.tgz","fileCount":91,"integrity":"sha512-Xxj4WIdyzPDbr5WL+YiT3Q+ZI4uqeUGM9r+fk8CfdPkSI5wj9L26niI5yDfh2pZeXIrWnmaf/DBYRkrsmMbvEw==","signatures":[{"sig":"MEYCIQCW14V+4Tfsltd9ZATVQf/3R8qtBpoljJqh3L4wPxXhLAIhAIhqXli568CMwoBEX6Fy0cSdIdXyfUBDAIR9Jwx8Eo6r","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bandeira-tech%2fb3nd-core@0.25.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":283259},"module":"./esm/mod.js","engines":{"node":">=20"},"exports":{".":{"types":"./esm/mod.d.ts","import":"./esm/mod.js"},"./rig":{"types":"./esm/src/rig/mod.d.ts","import":"./esm/src/rig/mod.js"},"./hash":{"types":"./esm/src/hash/hash.d.ts","import":"./esm/src/hash/hash.js"},"./types":{"types":"./esm/src/types/types.d.ts","import":"./esm/src/types/types.js"},"./encrypt":{"types":"./esm/src/encrypt/mod.d.ts","import":"./esm/src/encrypt/mod.js"},"./network":{"types":"./esm/src/network/mod.d.ts","import":"./esm/src/network/mod.js"},"./encoding":{"types":"./esm/src/encoding/encoding.d.ts","import":"./esm/src/encoding/encoding.js"},"./identity":{"types":"./esm/src/rig/identity.d.ts","import":"./esm/src/rig/identity.js"},"./client-console":{"types":"./esm/src/client-console/mod.d.ts","import":"./esm/src/client-console/mod.js"}},"gitHead":"3ba7093e6ad223806d86dff2d0081be2ecc16eb7","scripts":{},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cdd5a971-63b9-4eb3-906d-614661f8f8ec"}},"repository":{"url":"git+https://github.com/bandeira-tech/b3nd-core.git","type":"git"},"_npmVersion":"12.0.1","description":"B3nd Core — framework foundation: types, encoding, clients, rig, network, hash, encrypt","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","dependencies":{"canonicalize":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/b3nd-core_0.25.0_1783937753152_0.7263134544607712","host":"s3://npm-registry-packages-npm-production"}},"0.26.0":{"name":"@bandeira-tech/b3nd-core","version":"0.26.0","description":"B3nd Core — framework foundation: types, encoding, clients, rig, network, hash, encrypt","homepage":"https://github.com/bandeira-tech/b3nd-core#readme","repository":{"type":"git","url":"git+https://github.com/bandeira-tech/b3nd-core.git"},"license":"MIT","bugs":{"url":"https://github.com/bandeira-tech/b3nd-core/issues"},"module":"./esm/mod.js","exports":{".":{"types":"./esm/mod.d.ts","import":"./esm/mod.js"},"./types":{"types":"./esm/src/types/types.d.ts","import":"./esm/src/types/types.js"},"./encoding":{"types":"./esm/src/encoding/encoding.d.ts","import":"./esm/src/encoding/encoding.js"},"./hash":{"types":"./esm/src/hash/hash.d.ts","import":"./esm/src/hash/hash.js"},"./encrypt":{"types":"./esm/src/encrypt/mod.d.ts","import":"./esm/src/encrypt/mod.js"},"./network":{"types":"./esm/src/network/mod.d.ts","import":"./esm/src/network/mod.js"},"./rig":{"types":"./esm/src/rig/mod.d.ts","import":"./esm/src/rig/mod.js"},"./identity":{"types":"./esm/src/rig/identity.d.ts","import":"./esm/src/rig/identity.js"},"./client-console":{"types":"./esm/src/client-console/mod.d.ts","import":"./esm/src/client-console/mod.js"}},"scripts":{},"engines":{"node":">=20"},"sideEffects":false,"publishConfig":{"access":"public"},"dependencies":{"canonicalize":"2.0.0"},"gitHead":"818fea299e9335e1181ed1ad6edfe6dc02c5d1e9","_id":"@bandeira-tech/b3nd-core@0.26.0","_nodeVersion":"22.23.1","_npmVersion":"12.0.1","dist":{"integrity":"sha512-d/JyNGF4XEieiLOX4K1uOb/q+tB/joqsOewfJ2IEWktJI/fWTWI7daP5T2ve5KEJoCzztxD8LXq19FCdDV0xjw==","shasum":"131fcd3dcb32f0f5507422b8cd009decaf5441a4","tarball":"https://registry.npmjs.org/@bandeira-tech/b3nd-core/-/b3nd-core-0.26.0.tgz","fileCount":91,"unpackedSize":283341,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bandeira-tech%2fb3nd-core@0.26.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQD1bhpwRB053iPOc0BrbzxFewzpMmYc3wGfw5t0AhwGhwIhAJcD+s8Y9IYzwnW1Xu/S9wxNjCkWweA5IiO44YPMxyn5"}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cdd5a971-63b9-4eb3-906d-614661f8f8ec"}},"directories":{},"maintainers":[{"name":"r-bandeira-tech","email":"bandeira-tech@pm.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/b3nd-core_0.26.0_1784067505260_0.5898311875851501"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-30T12:15:31.972Z","modified":"2026-07-14T22:18:25.745Z","0.10.0":"2026-04-30T12:15:32.234Z","0.11.0":"2026-04-30T12:46:45.098Z","0.12.0":"2026-05-01T10:33:25.505Z","0.14.0":"2026-05-06T13:24:07.735Z","0.22.0":"2026-06-18T22:08:53.014Z","0.25.0":"2026-07-13T10:15:53.351Z","0.26.0":"2026-07-14T22:18:25.397Z"},"bugs":{"url":"https://github.com/bandeira-tech/b3nd-core/issues"},"license":"MIT","homepage":"https://github.com/bandeira-tech/b3nd-core#readme","repository":{"type":"git","url":"git+https://github.com/bandeira-tech/b3nd-core.git"},"description":"B3nd Core — framework foundation: types, encoding, clients, rig, network, hash, encrypt","maintainers":[{"name":"r-bandeira-tech","email":"bandeira-tech@pm.me"}],"readme":"# B3nd Core\n\nFramework foundation for B3nd. Types, encoding, clients, Rig, Identity, network\nprimitives -- everything needed to run a decentralized network without any\nprotocol-specific logic.\n\n[GitHub](https://github.com/bandeira-tech/b3nd-core)\n\n## The Rig\n\nThe Rig wires clients, validation, and behavior into a single object that\nspeaks the `ProtocolInterfaceNode` (PIN) interface.\n\n```typescript\nimport {\n  connection,\n  FunctionalClient,\n  Rig,\n} from \"@bandeira-tech/b3nd-core\";\n\nconst store = new Map<string, unknown>();\nconst client = new FunctionalClient({\n  receive: (msgs) => {\n    for (const [uri, payload] of msgs) store.set(uri, payload);\n    return Promise.resolve(msgs.map(() => ({ accepted: true })));\n  },\n  read: (urls) =>\n    Promise.resolve(\n      urls.flatMap((u) => (store.has(u) ? [[u, store.get(u)]] : [])),\n    ),\n});\n\nconst rig = new Rig({\n  routes: {\n    receive: [connection(client, [\"**\"])],\n    read: [connection(client, [\"**\"])],\n  },\n});\n\nawait rig.receive([[\"mutable://open/users/alice\", { name: \"Alice\" }]]);\nconst [profile] = await rig.read([\"mutable://open/users/alice\"]);\nprofile?.[1]; // { name: \"Alice\" }\n```\n\n### Locators\n\n`read` and `observe` take locators — opaque addressing strings. The rig\nmatches them against route patterns by segment-glob and hands them to the\nexecuting client unchanged. The framework defines no locator grammar; the\nclient on the other end decides what it accepts (a bare uri, a uri plus\nrequest-time directives, a pattern with wildcards — its choice).\n\n`receive` takes `Output[]` where the first element is a uri — the\ncanonical resource identifier the payload is written under.\n\n### Errors and content\n\nThe framework speaks one shape — `Output[]` — end-to-end. There is no explicit\nfailure channel and no framework opinion on payload content:\n\n- **Transport / programmer errors throw**: network down, no route accepts,\n  malformed locator the executing client rejects — they propagate as exceptions.\n- **Anything else lives in the payload by client convention.** Miss\n  representation, auth refusals, domain errors, binary encoding — chosen and\n  documented by the executing client, not by the framework.\n\n### Observe (INV-style)\n\n`observe` yields `readonly string[]` batches of uris that fired — INV-style.\nDefault emission is one uri per yield; backends with cheap batching can\ncoalesce. Which subscription locator matched is not surfaced (cheap to\nre-derive locally if you need that routing). Read each uri to learn its\ncurrent state.\n\n```typescript\nconst ac = new AbortController();\nfor await (const uris of pin.observe([\"mutable://app/**\"], ac.signal)) {\n  const outputs = await pin.read(uris);\n  for (const [uri, payload] of outputs) console.log(uri, payload);\n}\n```\n\n### Connections\n\nConnections bind clients to locator patterns. The rig routes per operation:\n\n- **receive** — broadcast to every matching connection.\n- **read** — for each locator, the first connection that accepts wins.\n  **No fall-through, no aggregation.** Compose a memcache + shards\n  aggregator as its own client and route to that if you want layered storage.\n- **observe** — locators are grouped by the first matching connection;\n  per-connection streams are merged into one.\n\n```typescript\nconst rig = new Rig({\n  routes: {\n    receive: [connection(primaryClient, [\"mutable://**\", \"hash://**\"])],\n    read: [connection(primaryClient, [\"mutable://**\", \"hash://**\"])],\n    observe: [connection(primaryClient, [\"mutable://**\", \"hash://**\"])],\n  },\n});\n```\n\n#### Pattern syntax\n\nOne grammar across `connection`, `observe`, and `reactions`:\n\n- **literal** segments must match exactly,\n- `*` matches **exactly one non-empty segment** (no `/`),\n- `**` matches **zero or more remaining segments** (only as the last segment).\n\nIf a reaction needs a segment value, extract it from the URI — patterns\nare bool-only, no captures. Patterns compile once: pure literals to `===`,\n`**`-prefix patterns to `String.startsWith`, anything with `*` to a\ncached `RegExp`. `:param` segments are rejected at compile time.\n\n### Programs and Handlers\n\nPrograms are pure functions that classify messages by URI prefix. Handlers\ndecide what each classification code means operationally.\n\n```typescript\nconst rig = new Rig({\n  routes: {/* ... */},\n  programs: {\n    \"store://balance\": balanceProgram,\n  },\n  handlers: {\n    \"balance:valid\": async (msg) => [msg], // persist as-is\n  },\n});\n```\n\n### Identity\n\nEd25519 signing + X25519 encryption, seed-deterministic or generated.\n\n```typescript\nconst id = await Identity.fromSeed(\"my-secret\");\nconst auth = await id.sign({ action: \"transfer\", amount: 100 });\nconst valid = await id.verify(\n  { action: \"transfer\", amount: 100 },\n  auth.signature,\n);\n```\n\n### Hooks, Events, Reactions\n\n```typescript\nconst rig = new Rig({\n  routes: {/* ... */},\n  hooks: {\n    beforeReceive: (ctx) => {/* throw to reject */},\n    beforeRead: (ctx) => {\n      // ctx is { url }; locators are opaque — if you need to inspect\n      // the grammar, bring your own parser. Return `{ ctx: { url } }`\n      // to rewrite. For invasive transforms, wrap the executing client.\n    },\n    afterRead: (ctx, result) => {/* observe */},\n    onError: (ctx) => {/* handle errors */},\n  },\n  on: {\n    \"receive:success\": [(e) => notifyPeers(e)],\n    \"*:error\": [(e) => alertOps(e)],\n  },\n  reactions: {\n    \"mutable://app/users/*\": async (output) => {/* triggered on write */},\n  },\n});\n```\n\n- **Hooks** -- synchronous gates (throw to reject, observe after, catch errors)\n- **Events** -- async fire-and-forget (never block the caller)\n- **Reactions** -- URI-pattern triggers on successful writes\n\n### Network\n\nPeer-to-peer replication with pluggable policies.\n\n```typescript\nimport { flood, network, peer } from \"@bandeira-tech/b3nd-core\";\n\nconst stop = network(localRig, [\n  peer(remoteClient),\n], [flood()]);\n```\n\n## Modules\n\n| Module             | What's in it                                                            |\n| ------------------ | ----------------------------------------------------------------------- |\n| `types`            | `ProtocolInterfaceNode`, `Output`, `B3ndError`, `Errors`, …             |\n| `encoding`         | Base64 / hex primitives                                                 |\n| `hash`             | SHA-256                                                                 |\n| `encrypt`          | Ed25519 signing, X25519 encryption, AES-GCM, PBKDF2                     |\n| `rig`              | Rig, Identity, connections, hooks, events, reactions                    |\n| `identity`         | `Identity` (re-export of `rig/identity`)                                |\n| `network`          | `network()`, `peer()`, flood, path-vector, tell-and-read                |\n| `client-console`   | Console output client (write-only, debug sink)                          |\n\n## Subpath Exports\n\n```typescript\nimport { ... } from \"@bandeira-tech/b3nd-core\";              // everything\nimport type { ... } from \"@bandeira-tech/b3nd-core/types\";    // types only\nimport { ... } from \"@bandeira-tech/b3nd-core/encoding\";      // base64 / hex primitives\nimport { ... } from \"@bandeira-tech/b3nd-core/hash\";          // sha256\nimport { ... } from \"@bandeira-tech/b3nd-core/encrypt\";       // signing, encryption\nimport { ... } from \"@bandeira-tech/b3nd-core/rig\";           // Rig + connections\nimport { ... } from \"@bandeira-tech/b3nd-core/identity\";      // Identity\nimport { ... } from \"@bandeira-tech/b3nd-core/network\";       // network primitives\nimport { ... } from \"@bandeira-tech/b3nd-core/client-console\"; // console client\nimport { RecordingClient } from \"@bandeira-tech/b3nd-core/testing\"; // PIN test double\n```\n\n## Testing\n\n`b3nd-core` ships a first-party PIN test double for use in your own tests:\n\n```typescript\nimport { RecordingClient } from \"@bandeira-tech/b3nd-core/testing\";\nimport type { RecordedCall, RecordedCallOf, RecordingClientFixtures } from \"@bandeira-tech/b3nd-core/testing\";\n```\n\n`RecordingClient` records every `receive`, `read`, `observe`, and `status` call\nso you can assert on interactions without a real transport. Use it to test rigs,\nprograms, and code handlers in-process.\n\n## Development\n\n```bash\ndeno task test        # Run tests\ndeno task check       # Type check\ndeno fmt --check mod.ts src/\ndeno lint mod.ts src/\n```\n\n## Project Structure\n\n```\nmod.ts          # Main entry point + subpath re-exports\nsrc/            # One folder per module (types, rig, network, …)\nscripts/        # Build tooling (build-npm.ts)\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md"}