{"_id":"@apwem-bsws/working-p2p","_rev":"2-6c067982e5165c98b85ef386c3bd61c9","name":"@apwem-bsws/working-p2p","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"name":"@apwem-bsws/working-p2p","version":"1.0.0","_id":"@apwem-bsws/working-p2p@1.0.0","maintainers":[{"name":"nolanc","email":"no1an@tutamail.com"}],"dist":{"shasum":"21e4618a058e47ed1756d0eec4a9a7cef2e27c30","tarball":"https://registry.npmjs.org/@apwem-bsws/working-p2p/-/working-p2p-1.0.0.tgz","fileCount":12,"integrity":"sha512-nn/h/Z0WuY23/tJ9/hAQ+6hGwdJhM5SzwYgeVEOugfhbCpj8rg367CTA3FYvY4eHIsfT7IaN2FTOlCDkAbM38w==","signatures":[{"sig":"MEUCIQC320DO+7T1Zm+BZWeaqGRr7dkjNODHuxCkZFlF/BlB+gIgC4ILUojGgIL5mIS1ssk+/TsI0lqbI3e85Hqg/QhuzL8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":223247},"main":"dist/apwem-core.js","type":"module","types":"index.d.ts","scripts":{"test":"npm run test:survival","build":"node build.js","test:survival":"node test/survival.test.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"nolanc","email":"no1an@tutamail.com"},"_npmVersion":"11.14.1","description":"Persistent same-origin peer mesh with checkpointed survival semantics, worker coordination, and optional wasm payload obfuscation.","directories":{},"_nodeVersion":"26.2.0","dependencies":{"libp2p":"^1.0.0","@libp2p/webrtc":"^4.0.0","fake-indexeddb":"^5.0.0","@chainsafe/libp2p-noise":"^14.0.0","workbox-background-sync":"^7.0.0"},"_hasShrinkwrap":false,"devDependencies":{"webpack":"^5.88.0","wasm-pack":"^0.12.0","typescript":"^5.0.0","webpack-cli":"^5.1.4"},"_npmOperationalInternal":{"tmp":"tmp/working-p2p_1.0.0_1779760695938_0.1514155242644355","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@apwem-bsws/working-p2p","version":"1.0.1","type":"module","main":"dist/apwem-core.js","types":"index.d.ts","scripts":{"build":"node build.js","test":"npm run test:survival","test:survival":"node test/survival.test.js","prepublishOnly":"npm run build"},"dependencies":{"@chainsafe/libp2p-noise":"^14.0.0","@libp2p/webrtc":"^4.0.0","fake-indexeddb":"^5.0.0","libp2p":"^1.0.0","workbox-background-sync":"^7.0.0"},"devDependencies":{"typescript":"^5.0.0","wasm-pack":"^0.15.0","webpack":"^5.88.0","webpack-cli":"^5.1.4"},"gitHead":"5d4e43b33def6eedbf9e7285b01720f48558355c","_id":"@apwem-bsws/working-p2p@1.0.1","description":"Persistent same-origin peer mesh with checkpointed survival semantics, worker coordination, and optional wasm payload obfuscation.","_nodeVersion":"26.2.0","_npmVersion":"11.14.1","dist":{"integrity":"sha512-1pFRhffJxF0z64DoDITdMB91jTGN7IvCY5NlY2T7tt+tKT9hy6Ri5sI27Vmm3fvLRUwrid8d5qRzFVd5FVjgMQ==","shasum":"35b85b0bbbc34f59a9d3aff6ba8c92dc22c45fa0","tarball":"https://registry.npmjs.org/@apwem-bsws/working-p2p/-/working-p2p-1.0.1.tgz","fileCount":12,"unpackedSize":223136,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQClQ80PQ/YFvkksqpNXqfgfPJulCdY720LVQRLmL/oEDgIgHNIkv/fyUjDkVZboimdFp1Qt6rKEv7RqTpTyVd5RgIM="}]},"_npmUser":{"name":"nolanc","email":"no1an@tutamail.com"},"directories":{},"maintainers":[{"name":"nolanc","email":"no1an@tutamail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/working-p2p_1.0.1_1779764732915_0.2394294184992236"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-26T01:58:15.848Z","modified":"2026-05-26T03:05:33.182Z","1.0.0":"2026-05-26T01:58:16.081Z","1.0.1":"2026-05-26T03:05:33.045Z"},"description":"Persistent same-origin peer mesh with checkpointed survival semantics, worker coordination, and optional wasm payload obfuscation.","maintainers":[{"name":"nolanc","email":"no1an@tutamail.com"}],"readme":"# @apwem-bsws/working-p2p\n\nPersistent same-origin peer mesh with checkpointed survival semantics, worker coordination, and optional wasm payload obfuscation.\n\n## Installation\n\n```bash\nnpm install @apwem-bsws/working-p2p\n```\n\n## Basic Usage\n\n```ts\nimport { ApwemP2P } from \"@apwem-bsws/working-p2p\";\n\nconst p2p = new ApwemP2P({\n  persistence: \"full\",\n  obfuscation: \"wasm\",\n  bootstrapPeers: [\"https://ipfs.io\"]\n});\n\np2p.on(\"peer:connected\", (peerId) => {\n  console.info(\"connected\", peerId);\n});\n\np2p.on(\"peer:resurrected\", (peerId) => {\n  console.info(\"restored\", peerId);\n});\n\np2p.subscribe(\"chat\", (message, from) => {\n  console.info(\"chat\", from, message);\n});\n\nawait p2p.init();\np2p.send(\"chat\", { text: \"hello\" });\n```\n\n## Background Mode\n\nEnable the maximum background keepalive bundle (silent audio, notification keepalive, wake lock, and ping helpers) from a user action:\n\n```ts\nconst status = await p2p.enableBackgroundMode();\nconsole.info(\"background mode\", status);\n```\n\n## API Reference\n\n### `new ApwemP2P(options)`\n\n`options.persistence`\n- `\"full\"`: checkpoint peers and queued messages\n- `\"light\"`: keep lightweight reconnect state\n- `\"none\"`: in-memory only\n\n`options.obfuscation`\n- `\"wasm\"`: prefer Rust/Wasm, fall back to JS\n- `\"js\"`: JS obfuscator only\n- `\"none\"`: raw payloads\n\n`options.bootstrapPeers`\n- Optional bootstrap hints persisted into checkpoints.\n\n`options.forceRelay`\n- Preserved for API compatibility.\n\n### `await init()`\n\nLoads identity, restores checkpoints, attaches worker channels when available, and announces presence to the mesh.\n\n### `send(topic, data)`\n\nPublishes to connected peers. If no peers are active, the message is queued and replayed after reconnect.\n\n### `subscribe(topic, callback)`\n\nRegisters a topic callback. `callback(message, fromPeerId)` receives the parsed message body and sender id.\n\n### `await forceCheckpoint()`\n\nStores the current checkpoint in IndexedDB and forwards it to worker listeners.\n\n### `getActivePeers()`\n\nReturns the current active peer count.\n\n### `simulateTabKill()`\n\nTesting hook that checkpoints state, broadcasts a freeze signal, and tears down the local runtime.\n\n## Persistence Model\n\nThe package persists:\n\n- stable peer identity keyed by `?apwem-peer=<id>` when present\n- queued outbound messages\n- last known peer list\n- key rotation metadata\n- bootstrap hints\n\nOn restart with the same peer identity, the runtime restores its checkpoint, resumes the mesh handshake, and replays queued messages.\n\n## Troubleshooting\n\n### Messages never deliver\n\n- Confirm both peers share the same path or `?apwem-mesh=<room>` value.\n- Check `getActivePeers()` after `init()`.\n- Use `\"js\"` obfuscation first when debugging wasm loading.\n\n### Wasm assets are missing\n\n- Run `npm run build`.\n- The build falls back to a JS shim when `wasm-pack` is unavailable.\n\n## Testing\n\n```bash\nnpm test\n```\n","readmeFilename":"README.md"}