{"_id":"@mocanvas/sync","_rev":"45-416b020e09c6bdabf3c5663e18d58735","name":"@mocanvas/sync","dist-tags":{"latest":"4.12.3"},"versions":{"1.0.0":{"name":"@mocanvas/sync","version":"1.0.0","keywords":["multiplayer","collaboration","presence","websocket","sync","mocanvas"],"author":{"name":"Symbio Digital"},"license":"MIT","_id":"@mocanvas/sync@1.0.0","maintainers":[{"name":"von.schau","email":"von.schau@gmail.com"}],"homepage":"https://github.com/SYMBIO/mocanvas/tree/main/packages/sync#readme","bugs":{"url":"https://github.com/SYMBIO/mocanvas/issues"},"dist":{"shasum":"992d7410ee4496562bef909235ce9d36c1a94be6","tarball":"https://registry.npmjs.org/@mocanvas/sync/-/sync-1.0.0.tgz","fileCount":7,"integrity":"sha512-wkCZDAuN/2J7QRzBQMBXxt+K6iwHTPaEJ4nSPGtu3YV7uJBX7chPXuOitFkttlBz+a2kIGnHF84lOJw8MeQsQQ==","signatures":[{"sig":"MEUCIAGBcypHRSU2uegVjg2kgv3FqcVQqeRnkpYY+l2vZxLdAiEA+/Ofz+80qMsmoyjmqroEF4gHq1otUsI1G9D8sQ6nK1c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":102416},"main":"./dist/index.js","type":"module","_from":"file:mocanvas-sync-1.0.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsup","relay":"node scripts/relay.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"von.schau","email":"von.schau@gmail.com"},"_resolved":"/private/var/folders/yt/q4m0c8l95zlf2pjc2gv17bp4000101/T/c89835bf2aecbdbc4d1c82e6bca1189e/mocanvas-sync-1.0.0.tgz","_integrity":"sha512-wkCZDAuN/2J7QRzBQMBXxt+K6iwHTPaEJ4nSPGtu3YV7uJBX7chPXuOitFkttlBz+a2kIGnHF84lOJw8MeQsQQ==","repository":{"url":"git+https://github.com/SYMBIO/mocanvas.git","type":"git","directory":"packages/sync"},"_npmVersion":"11.12.1","description":"Multiplayer for a mocanvas store: record diffs over a transport, plus presence and cursors.","directories":{},"sideEffects":false,"_nodeVersion":"25.9.0","dependencies":{"@mocanvas/state":"1.0.0","@mocanvas/store":"1.0.0","@mocanvas/editor":"1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.18.0","react":"^19.1.0","@types/ws":"^8.5.0","@types/react":"^19.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/sync_1.0.0_1788554949491_0.30447738854749073","host":"s3://npm-registry-packages-npm-production"}},"4.0.0":{"name":"@mocanvas/sync","version":"4.0.0","keywords":["multiplayer","collaboration","presence","websocket","sync","mocanvas"],"author":{"name":"Symbio Digital"},"license":"SEE LICENSE IN LICENSE","_id":"@mocanvas/sync@4.0.0","maintainers":[{"name":"von.schau","email":"von.schau@gmail.com"}],"dist":{"shasum":"4313375a191b9533f9ad07a48163c9f3ea4a7c11","tarball":"https://registry.npmjs.org/@mocanvas/sync/-/sync-4.0.0.tgz","fileCount":14,"integrity":"sha512-W0fYbYc0EdIZp853zHlmZKu1rdCS5gjSQUwujeZP358q0ZJC+jROggTF9oOKlnSUhuK3qa9FiKm4GKR/QCXDJw==","signatures":[{"sig":"MEUCID1Q7o0KNq6sm9y6gGQYchYRchrmc55ylYw/0nGBrMu8AiEAyqea8ke/7uC7xF6JLMeAfXBFct64NiM+ly5EUciIstQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":361101},"main":"./dist/index.js","type":"module","_from":"file:mocanvas-sync-4.0.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsup","relay":"node scripts/relay.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"von.schau","email":"von.schau@gmail.com"},"_resolved":"/private/var/folders/yt/q4m0c8l95zlf2pjc2gv17bp4000101/T/05adb0bbe5ee451b204ef2985cde8b5d/mocanvas-sync-4.0.0.tgz","_integrity":"sha512-W0fYbYc0EdIZp853zHlmZKu1rdCS5gjSQUwujeZP358q0ZJC+jROggTF9oOKlnSUhuK3qa9FiKm4GKR/QCXDJw==","_npmVersion":"11.12.1","description":"Multiplayer for a mocanvas store: record diffs over a transport, plus presence and cursors.","directories":{},"sideEffects":false,"_nodeVersion":"25.9.0","dependencies":{"@mocanvas/state":"4.0.0","@mocanvas/store":"4.0.0","@mocanvas/editor":"4.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.18.0","react":"^19.1.0","@types/ws":"^8.5.0","@types/react":"^19.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/sync_4.0.0_1789081400636_0.812539264445417","host":"s3://npm-registry-packages-npm-production"}},"4.0.1":{"name":"@mocanvas/sync","version":"4.0.1","keywords":["multiplayer","collaboration","presence","websocket","sync","mocanvas"],"author":{"name":"Symbio Digital"},"license":"SEE LICENSE IN LICENSE","_id":"@mocanvas/sync@4.0.1","maintainers":[{"name":"von.schau","email":"von.schau@gmail.com"}],"dist":{"shasum":"ad530fe954df4f0a25d2b36001d0ded0ebc5099f","tarball":"https://registry.npmjs.org/@mocanvas/sync/-/sync-4.0.1.tgz","fileCount":14,"integrity":"sha512-p9HrHBxWX4/mojZLXZSPr/ks/1M3EHd9zeRD4RmGVp7TxfWAtlKxnapyuL3M/c1pDTAO+Y35wA83MHWTEN3yVA==","signatures":[{"sig":"MEQCIGdNl3p6HgAspNNeJPEFUGg1gU60LC7mmidO934GyuXUAiBLrqki5QMKZMXnEM8Rszmq/wDmDr4RO+e+B7pwpV+IhA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":361001},"main":"./dist/index.js","type":"module","_from":"file:mocanvas-sync-4.0.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsup","relay":"node scripts/relay.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:51d24bee-9834-492d-b7a6-8cbe5e019237"}},"_resolved":"/tmp/f0ea1ddeffdc3d45316f2f6fa5b6c2c0/mocanvas-sync-4.0.1.tgz","_integrity":"sha512-p9HrHBxWX4/mojZLXZSPr/ks/1M3EHd9zeRD4RmGVp7TxfWAtlKxnapyuL3M/c1pDTAO+Y35wA83MHWTEN3yVA==","_npmVersion":"12.0.2","description":"Multiplayer for a mocanvas store: record diffs over a transport, plus presence and cursors.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@mocanvas/state":"4.0.1","@mocanvas/store":"4.0.1","@mocanvas/editor":"4.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.18.0","react":"^19.1.0","@types/ws":"^8.5.0","@types/react":"^19.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/sync_4.0.1_1789085528039_0.2342179656772687","host":"s3://npm-registry-packages-npm-production"}},"4.0.2":{"name":"@mocanvas/sync","version":"4.0.2","keywords":["multiplayer","collaboration","presence","websocket","sync","mocanvas"],"author":{"name":"Symbio Digital"},"license":"SEE LICENSE IN LICENSE","_id":"@mocanvas/sync@4.0.2","maintainers":[{"name":"von.schau","email":"von.schau@gmail.com"}],"dist":{"shasum":"95862e3b3b55877c06189649738696760a42b664","tarball":"https://registry.npmjs.org/@mocanvas/sync/-/sync-4.0.2.tgz","fileCount":14,"integrity":"sha512-LlFF0WBFWxirY7OXJrXVhHQZTxnCvwdncA6bvCSO18Xbb7ObWvfxOW/SYB+1VvjUJHPvlX3cZtcTnpqGPpu6XQ==","signatures":[{"sig":"MEUCIHNq1WFC47+3FIuI4WluVLJp4WWxQ0ZCQksECo+BNzoSAiEA9wdmL1exmcv9qt3hxBNEAfgLJNPmHY3HhrTy9x+/UXM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":369863},"main":"./dist/index.js","type":"module","_from":"file:mocanvas-sync-4.0.2.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsup","relay":"node scripts/relay.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:51d24bee-9834-492d-b7a6-8cbe5e019237"}},"_resolved":"/tmp/66201086119fa37dd2195b2f6a097a3d/mocanvas-sync-4.0.2.tgz","_integrity":"sha512-LlFF0WBFWxirY7OXJrXVhHQZTxnCvwdncA6bvCSO18Xbb7ObWvfxOW/SYB+1VvjUJHPvlX3cZtcTnpqGPpu6XQ==","_npmVersion":"12.0.2","description":"Multiplayer for a mocanvas store: record diffs over a transport, plus presence and cursors.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@mocanvas/state":"4.0.2","@mocanvas/store":"4.0.2","@mocanvas/editor":"4.0.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.18.0","react":"^19.1.0","@types/ws":"^8.5.0","@types/react":"^19.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/sync_4.0.2_1789161946840_0.8313804094716886","host":"s3://npm-registry-packages-npm-production"}},"4.1.0":{"name":"@mocanvas/sync","version":"4.1.0","keywords":["multiplayer","collaboration","presence","websocket","sync","mocanvas"],"author":{"name":"Symbio Digital"},"license":"SEE LICENSE IN LICENSE","_id":"@mocanvas/sync@4.1.0","maintainers":[{"name":"von.schau","email":"von.schau@gmail.com"}],"dist":{"shasum":"3b2f23f096696fbd62bf86bd6c5ec17d1bd5ee68","tarball":"https://registry.npmjs.org/@mocanvas/sync/-/sync-4.1.0.tgz","fileCount":14,"integrity":"sha512-awmlbauTqvrItIc/jr+28yySuVnAvxz6HklMtJbsjS4PJgM2dXPUJsuV+96Kb6Ujs0k6BLv3UIxUJVs8M7PXtw==","signatures":[{"sig":"MEUCIDXZENto0H721nliIodjY0TuE/wwS6QLRr19pm7Gxgy2AiEAnzs6jPeI1wfEUuld3VZ6Oby4WvCO+fFtE/qYneETgEU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":385056},"main":"./dist/index.js","type":"module","_from":"file:mocanvas-sync-4.1.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsup","relay":"node scripts/relay.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:51d24bee-9834-492d-b7a6-8cbe5e019237"}},"_resolved":"/tmp/307dd9ba9a6c669a8d1fd101d5ff3edc/mocanvas-sync-4.1.0.tgz","_integrity":"sha512-awmlbauTqvrItIc/jr+28yySuVnAvxz6HklMtJbsjS4PJgM2dXPUJsuV+96Kb6Ujs0k6BLv3UIxUJVs8M7PXtw==","_npmVersion":"12.0.2","description":"Multiplayer for a mocanvas store: record diffs over a transport, plus presence and cursors.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@mocanvas/state":"4.1.0","@mocanvas/store":"4.1.0","@mocanvas/editor":"4.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.18.0","react":"^19.1.0","@types/ws":"^8.5.0","react-dom":"^19.1.0","@types/react":"^19.1.0","@types/react-dom":"^19.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/sync_4.1.0_1789172337954_0.39283270525379277","host":"s3://npm-registry-packages-npm-production"}},"4.1.1":{"name":"@mocanvas/sync","version":"4.1.1","keywords":["multiplayer","collaboration","presence","websocket","sync","mocanvas"],"author":{"name":"Symbio Digital"},"license":"SEE LICENSE IN LICENSE","_id":"@mocanvas/sync@4.1.1","maintainers":[{"name":"von.schau","email":"von.schau@gmail.com"}],"dist":{"shasum":"fd92d411925d76af1c40397a432f686dcc7d99dc","tarball":"https://registry.npmjs.org/@mocanvas/sync/-/sync-4.1.1.tgz","fileCount":14,"integrity":"sha512-A0fh1F5FyvUp4lYtJJpkv01orAdMqQAS3HoCjlee6DsvkcNxnS4v/1x3mBaQrdXHVDYyovuf1sgT9x+YQZLgIA==","signatures":[{"sig":"MEUCIHmlG7roTOKZbF7eLwndbCUSA1OZ4FpMlm9DYO1c/br2AiEA5BkXSj/oxZze8V2Jf4F2DDhKMuhEQhWr5Pw8wNGF/EY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":385949},"main":"./dist/index.js","type":"module","_from":"file:mocanvas-sync-4.1.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsup","relay":"node scripts/relay.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:51d24bee-9834-492d-b7a6-8cbe5e019237"}},"_resolved":"/tmp/8ef8b92094cda12c57f39bd2cfa3c7c7/mocanvas-sync-4.1.1.tgz","_integrity":"sha512-A0fh1F5FyvUp4lYtJJpkv01orAdMqQAS3HoCjlee6DsvkcNxnS4v/1x3mBaQrdXHVDYyovuf1sgT9x+YQZLgIA==","_npmVersion":"12.0.2","description":"Multiplayer for a mocanvas store: record diffs over a transport, plus presence and cursors.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@mocanvas/state":"4.1.1","@mocanvas/store":"4.1.1","@mocanvas/editor":"4.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.18.0","react":"^19.1.0","@types/ws":"^8.5.0","react-dom":"^19.1.0","@types/react":"^19.1.0","@types/react-dom":"^19.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/sync_4.1.1_1789174462180_0.18089391859315462","host":"s3://npm-registry-packages-npm-production"}},"4.2.0":{"name":"@mocanvas/sync","version":"4.2.0","keywords":["multiplayer","collaboration","presence","websocket","sync","mocanvas"],"author":{"name":"Symbio Digital"},"license":"SEE LICENSE IN LICENSE","_id":"@mocanvas/sync@4.2.0","maintainers":[{"name":"von.schau","email":"von.schau@gmail.com"}],"dist":{"shasum":"09fc3d940999bd5a5fe12374e3b3d19a909a379f","tarball":"https://registry.npmjs.org/@mocanvas/sync/-/sync-4.2.0.tgz","fileCount":14,"integrity":"sha512-7BDkJjIzLGQuGhLO6SZY+07l1w7uUD9q4rewHP8F45MeJ6uHIYNOpfGEDjnGumVu4LGfhsBrHbJ0XNXYq9g68Q==","signatures":[{"sig":"MEQCIB1mQdn/aDkH/24Zd1g3IctZvr18O0F+OFR//B8HqTIBAiBRX9QfgutBfkzP53PQV5TU4h2ffQZLj6xEESE8VlqHKw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":387846},"main":"./dist/index.js","type":"module","_from":"file:mocanvas-sync-4.2.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsup","relay":"node scripts/relay.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:51d24bee-9834-492d-b7a6-8cbe5e019237"}},"_resolved":"/tmp/2a84613d50a32fe75b228c0aa2d7c07d/mocanvas-sync-4.2.0.tgz","_integrity":"sha512-7BDkJjIzLGQuGhLO6SZY+07l1w7uUD9q4rewHP8F45MeJ6uHIYNOpfGEDjnGumVu4LGfhsBrHbJ0XNXYq9g68Q==","_npmVersion":"12.0.2","description":"Multiplayer for a mocanvas store: record diffs over a transport, plus presence and cursors.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@mocanvas/state":"4.2.0","@mocanvas/store":"4.2.0","@mocanvas/editor":"4.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.18.0","react":"^19.1.0","@types/ws":"^8.5.0","react-dom":"^19.1.0","@types/react":"^19.1.0","@types/react-dom":"^19.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/sync_4.2.0_1789204151493_0.9282445885826558","host":"s3://npm-registry-packages-npm-production"}},"4.3.0":{"name":"@mocanvas/sync","version":"4.3.0","keywords":["multiplayer","collaboration","presence","websocket","sync","mocanvas"],"author":{"name":"Symbio Digital"},"license":"SEE LICENSE IN LICENSE","_id":"@mocanvas/sync@4.3.0","maintainers":[{"name":"von.schau","email":"von.schau@gmail.com"}],"dist":{"shasum":"21aed6d769ecf7b40c73449f07fa039dcad4fa34","tarball":"https://registry.npmjs.org/@mocanvas/sync/-/sync-4.3.0.tgz","fileCount":14,"integrity":"sha512-yw91Dd9m45ycBNwc6jt7CEvutNmGAXvfLsiwkXoOAFd9U7B2/7bt+MLr4O7lsezoeT3FQF0TFlRdbNN4N1yRXA==","signatures":[{"sig":"MEUCIQDCbBrB3ZBrvhy7SWw7HWCr8G7rIJqh2ug3tB7r/L+7xQIgJRcrckEGRC2NHmse6FxaC7TGSQ0QM6hlwrQ8eqLbPWI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":387846},"main":"./dist/index.js","type":"module","_from":"file:mocanvas-sync-4.3.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsup","relay":"node scripts/relay.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:51d24bee-9834-492d-b7a6-8cbe5e019237"}},"_resolved":"/tmp/56f61222f373367fec834d28e938dfe0/mocanvas-sync-4.3.0.tgz","_integrity":"sha512-yw91Dd9m45ycBNwc6jt7CEvutNmGAXvfLsiwkXoOAFd9U7B2/7bt+MLr4O7lsezoeT3FQF0TFlRdbNN4N1yRXA==","_npmVersion":"12.0.2","description":"Multiplayer for a mocanvas store: record diffs over a transport, plus presence and cursors.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@mocanvas/state":"4.3.0","@mocanvas/store":"4.3.0","@mocanvas/editor":"4.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.18.0","react":"^19.1.0","@types/ws":"^8.5.0","react-dom":"^19.1.0","@types/react":"^19.1.0","@types/react-dom":"^19.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/sync_4.3.0_1789251875388_0.17850937232298936","host":"s3://npm-registry-packages-npm-production"}},"4.4.0":{"name":"@mocanvas/sync","version":"4.4.0","keywords":["multiplayer","collaboration","presence","websocket","sync","mocanvas"],"author":{"name":"Symbio Digital"},"license":"SEE LICENSE IN LICENSE","_id":"@mocanvas/sync@4.4.0","maintainers":[{"name":"von.schau","email":"von.schau@gmail.com"}],"dist":{"shasum":"3d2dd47b7c34de7b226a0ef48adb21c8ae687c91","tarball":"https://registry.npmjs.org/@mocanvas/sync/-/sync-4.4.0.tgz","fileCount":14,"integrity":"sha512-/adZdxUr/etPlMQ+QAxwx3KM4CBlvkJVu28+xCOCR/Msuc47k3q37nCAn5EcUqfaMYMI9ifgBgZ3h0RIgpNfUg==","signatures":[{"sig":"MEUCIHmj1eNTOvFn6ErEx73h64fRBkB7kT9q0r4m286NRLXIAiEAo5PcgkxwDU3ULU2rPlH4X9FN7D6KYzMczb5kzakU9X4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":387846},"main":"./dist/index.js","type":"module","_from":"file:mocanvas-sync-4.4.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsup","relay":"node scripts/relay.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:51d24bee-9834-492d-b7a6-8cbe5e019237"}},"_resolved":"/tmp/93389ac5a717fad23a98d3ad396dbc76/mocanvas-sync-4.4.0.tgz","_integrity":"sha512-/adZdxUr/etPlMQ+QAxwx3KM4CBlvkJVu28+xCOCR/Msuc47k3q37nCAn5EcUqfaMYMI9ifgBgZ3h0RIgpNfUg==","_npmVersion":"12.0.2","description":"Multiplayer for a mocanvas store: record diffs over a transport, plus presence and cursors.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@mocanvas/state":"4.4.0","@mocanvas/store":"4.4.0","@mocanvas/editor":"4.4.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.18.0","react":"^19.1.0","@types/ws":"^8.5.0","react-dom":"^19.1.0","@types/react":"^19.1.0","@types/react-dom":"^19.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/sync_4.4.0_1789260114076_0.3225602895670119","host":"s3://npm-registry-packages-npm-production"}},"4.4.1":{"name":"@mocanvas/sync","version":"4.4.1","keywords":["multiplayer","collaboration","presence","websocket","sync","mocanvas"],"author":{"name":"Symbio Digital"},"license":"SEE LICENSE IN LICENSE","_id":"@mocanvas/sync@4.4.1","maintainers":[{"name":"von.schau","email":"von.schau@gmail.com"}],"dist":{"shasum":"2b429ec79cf7296890a5d8ca017157458bfae171","tarball":"https://registry.npmjs.org/@mocanvas/sync/-/sync-4.4.1.tgz","fileCount":14,"integrity":"sha512-IUq6uxMBpq6zjTDl+mOT1zL3QaOvC2kUcfCDHior/BSs/Pgx9fzRT2vD2YpseLLtHiFyKfHQEhv3CpqmgYFF2A==","signatures":[{"sig":"MEUCIQCqHv6n7rlhkO0dFcQJXUK60nLjj4iycGL1bgunY92FfQIgOFO4L+Qp7E0xzSL7Acj+Ppm4ubxHWn7g7Y8b+9HZqeY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":387846},"main":"./dist/index.js","type":"module","_from":"file:mocanvas-sync-4.4.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsup","relay":"node scripts/relay.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:51d24bee-9834-492d-b7a6-8cbe5e019237"}},"_resolved":"/tmp/54098bba6a790d6adca235f632e5c5a4/mocanvas-sync-4.4.1.tgz","_integrity":"sha512-IUq6uxMBpq6zjTDl+mOT1zL3QaOvC2kUcfCDHior/BSs/Pgx9fzRT2vD2YpseLLtHiFyKfHQEhv3CpqmgYFF2A==","_npmVersion":"12.0.2","description":"Multiplayer for a mocanvas store: record diffs over a transport, plus presence and cursors.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@mocanvas/state":"4.4.1","@mocanvas/store":"4.4.1","@mocanvas/editor":"4.4.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.18.0","react":"^19.1.0","@types/ws":"^8.5.0","react-dom":"^19.1.0","@types/react":"^19.1.0","@types/react-dom":"^19.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/sync_4.4.1_1789260546861_0.24588908427922718","host":"s3://npm-registry-packages-npm-production"}},"4.4.2":{"name":"@mocanvas/sync","version":"4.4.2","keywords":["multiplayer","collaboration","presence","websocket","sync","mocanvas"],"author":{"name":"Symbio Digital"},"license":"SEE LICENSE IN LICENSE","_id":"@mocanvas/sync@4.4.2","maintainers":[{"name":"von.schau","email":"von.schau@gmail.com"}],"dist":{"shasum":"180b3e1b042c5beb0e442fc8c5272fd832192a50","tarball":"https://registry.npmjs.org/@mocanvas/sync/-/sync-4.4.2.tgz","fileCount":14,"integrity":"sha512-lqHgZjzhqzsMI0mb0FEDoll7g8nYf9u73nVH5NifG7n5Kn4VnZwKwnCUq3IlEy+oFpjw30Rs+oWcwDqH1Ln3GQ==","signatures":[{"sig":"MEQCICyAq2p4igOzdU4WijcVVXdsXlSJigZd23Nmbsd+vaUeAiBm7rRU0PuHH7i/E5cbtJhgOKedtJgW/CGokL927kJIJw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":387846},"main":"./dist/index.js","type":"module","_from":"file:mocanvas-sync-4.4.2.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsup","relay":"node scripts/relay.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:51d24bee-9834-492d-b7a6-8cbe5e019237"}},"_resolved":"/tmp/40aaa5a45dfc0d5aef07b70fa7617dba/mocanvas-sync-4.4.2.tgz","_integrity":"sha512-lqHgZjzhqzsMI0mb0FEDoll7g8nYf9u73nVH5NifG7n5Kn4VnZwKwnCUq3IlEy+oFpjw30Rs+oWcwDqH1Ln3GQ==","_npmVersion":"12.0.2","description":"Multiplayer for a mocanvas store: record diffs over a transport, plus presence and cursors.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@mocanvas/state":"4.4.2","@mocanvas/store":"4.4.2","@mocanvas/editor":"4.4.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.18.0","react":"^19.1.0","@types/ws":"^8.5.0","react-dom":"^19.1.0","@types/react":"^19.1.0","@types/react-dom":"^19.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/sync_4.4.2_1789262162241_0.4507874463537025","host":"s3://npm-registry-packages-npm-production"}},"4.4.3":{"name":"@mocanvas/sync","version":"4.4.3","keywords":["multiplayer","collaboration","presence","websocket","sync","mocanvas"],"author":{"name":"Symbio Digital"},"license":"SEE LICENSE IN LICENSE","_id":"@mocanvas/sync@4.4.3","maintainers":[{"name":"von.schau","email":"von.schau@gmail.com"}],"dist":{"shasum":"821b519f603e88832d1f3c41bd4649d493290e45","tarball":"https://registry.npmjs.org/@mocanvas/sync/-/sync-4.4.3.tgz","fileCount":14,"integrity":"sha512-UJATdMoG6iWsTy3rTjttEhOHWnR1iCjh/nZJuBlFlr8YHXAdpjNJka0i5b1WDgFFJDp7SIkDNB4fK2YFZy3ddA==","signatures":[{"sig":"MEQCIBPWnIXOUZMWsm34W8NMjwKWs+ATsnK0EZTEh7Wz/MIZAiAIjjurN8U1s96MmGcsbSD/e842NT3Q3wZXFIUD/b1ffw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":387846},"main":"./dist/index.js","type":"module","_from":"file:mocanvas-sync-4.4.3.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsup","relay":"node scripts/relay.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:51d24bee-9834-492d-b7a6-8cbe5e019237"}},"_resolved":"/tmp/c1827971538d63e3bf650235b1c4715b/mocanvas-sync-4.4.3.tgz","_integrity":"sha512-UJATdMoG6iWsTy3rTjttEhOHWnR1iCjh/nZJuBlFlr8YHXAdpjNJka0i5b1WDgFFJDp7SIkDNB4fK2YFZy3ddA==","_npmVersion":"12.0.2","description":"Multiplayer for a mocanvas store: record diffs over a transport, plus presence and cursors.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@mocanvas/state":"4.4.3","@mocanvas/store":"4.4.3","@mocanvas/editor":"4.4.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.18.0","react":"^19.1.0","@types/ws":"^8.5.0","react-dom":"^19.1.0","@types/react":"^19.1.0","@types/react-dom":"^19.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/sync_4.4.3_1789291791094_0.9120847539254229","host":"s3://npm-registry-packages-npm-production"}},"4.5.0":{"name":"@mocanvas/sync","version":"4.5.0","keywords":["multiplayer","collaboration","presence","websocket","sync","mocanvas"],"author":{"name":"Symbio Digital"},"license":"SEE LICENSE IN LICENSE","_id":"@mocanvas/sync@4.5.0","maintainers":[{"name":"von.schau","email":"von.schau@gmail.com"}],"dist":{"shasum":"d63a4e592175cc6a2b698b82cb0c93eb1c3898ff","tarball":"https://registry.npmjs.org/@mocanvas/sync/-/sync-4.5.0.tgz","fileCount":14,"integrity":"sha512-dett/715BXPgyxUUTLPru/xFczzY5OLhJRlZ5zuw0pqKDDSe6A2HB9F/T/TuqCjOPRg1R91i+rfJwrdJ0q5TrA==","signatures":[{"sig":"MEUCIAg3FBUTvrpQAqejtTcnYN8QCCys+JXZtAL3HtFa2bEgAiEA3PU0sIiA81byaceQXgF6HD9i5Bnee2TvoMYcqWd6/u0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":387846},"main":"./dist/index.js","type":"module","_from":"file:mocanvas-sync-4.5.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsup","relay":"node scripts/relay.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:51d24bee-9834-492d-b7a6-8cbe5e019237"}},"_resolved":"/tmp/d3c577eaec70f194c9dc735d4c229aca/mocanvas-sync-4.5.0.tgz","_integrity":"sha512-dett/715BXPgyxUUTLPru/xFczzY5OLhJRlZ5zuw0pqKDDSe6A2HB9F/T/TuqCjOPRg1R91i+rfJwrdJ0q5TrA==","_npmVersion":"12.0.2","description":"Multiplayer for a mocanvas store: record diffs over a transport, plus presence and cursors.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@mocanvas/state":"4.5.0","@mocanvas/store":"4.5.0","@mocanvas/editor":"4.5.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.18.0","react":"^19.1.0","@types/ws":"^8.5.0","react-dom":"^19.1.0","@types/react":"^19.1.0","@types/react-dom":"^19.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/sync_4.5.0_1789310708242_0.31242873674016125","host":"s3://npm-registry-packages-npm-production"}},"4.5.1":{"name":"@mocanvas/sync","version":"4.5.1","keywords":["multiplayer","collaboration","presence","websocket","sync","mocanvas"],"author":{"name":"Symbio Digital"},"license":"SEE LICENSE IN LICENSE","_id":"@mocanvas/sync@4.5.1","maintainers":[{"name":"von.schau","email":"von.schau@gmail.com"}],"dist":{"shasum":"404099488ce51510895a63925d4917c437fdb5e3","tarball":"https://registry.npmjs.org/@mocanvas/sync/-/sync-4.5.1.tgz","fileCount":14,"integrity":"sha512-XXsrpmqT4E7nA+SGp/g6oixgGdMHZAvu7FA86mTZ4QB5JakhDQO7m0FiQ4XMaIQwqOG7qafKyI7P5KlRnaXkpQ==","signatures":[{"sig":"MEUCIEgBbYHYSrmBCZPhmGtw6ykfY4nvSQDBswAzFC2PhadpAiEAv3IGodgNk+OVXAgngkKSRfdyghlnG6Mn2TCFm13MTlU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":387846},"main":"./dist/index.js","type":"module","_from":"file:mocanvas-sync-4.5.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsup","relay":"node scripts/relay.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:51d24bee-9834-492d-b7a6-8cbe5e019237"}},"_resolved":"/tmp/052aafc07edeb1e40cf7babdb378f95d/mocanvas-sync-4.5.1.tgz","_integrity":"sha512-XXsrpmqT4E7nA+SGp/g6oixgGdMHZAvu7FA86mTZ4QB5JakhDQO7m0FiQ4XMaIQwqOG7qafKyI7P5KlRnaXkpQ==","_npmVersion":"12.0.2","description":"Multiplayer for a mocanvas store: record diffs over a transport, plus presence and cursors.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@mocanvas/state":"4.5.1","@mocanvas/store":"4.5.1","@mocanvas/editor":"4.5.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.18.0","react":"^19.1.0","@types/ws":"^8.5.0","react-dom":"^19.1.0","@types/react":"^19.1.0","@types/react-dom":"^19.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/sync_4.5.1_1789318304978_0.9069011192043004","host":"s3://npm-registry-packages-npm-production"}},"4.5.2":{"name":"@mocanvas/sync","version":"4.5.2","keywords":["multiplayer","collaboration","presence","websocket","sync","mocanvas"],"author":{"name":"Symbio Digital"},"license":"SEE LICENSE IN LICENSE","_id":"@mocanvas/sync@4.5.2","maintainers":[{"name":"von.schau","email":"von.schau@gmail.com"}],"dist":{"shasum":"ba48b22691f06d3d351f3edfe3284497c4234abf","tarball":"https://registry.npmjs.org/@mocanvas/sync/-/sync-4.5.2.tgz","fileCount":14,"integrity":"sha512-hxtCsIQT+EXSh3LxyDXTXSn01Nd1jrvztREw3zxZE9+HRLiTq8xRQLi022OBHTj2cmNp+MTDcVOHBUxNtHdWtA==","signatures":[{"sig":"MEUCIBU2a41YYiLudHHzBFQxhTgujvf03N9QeIjolZaqJ7NhAiEA92NvAGBESL+zohQqc/QP4t1tmyvtsIpa4djoRu/h+4Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":387846},"main":"./dist/index.js","type":"module","_from":"file:mocanvas-sync-4.5.2.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsup","relay":"node scripts/relay.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:51d24bee-9834-492d-b7a6-8cbe5e019237"}},"_resolved":"/tmp/fee2dbe467d735d6fd57f989b29bbd3e/mocanvas-sync-4.5.2.tgz","_integrity":"sha512-hxtCsIQT+EXSh3LxyDXTXSn01Nd1jrvztREw3zxZE9+HRLiTq8xRQLi022OBHTj2cmNp+MTDcVOHBUxNtHdWtA==","_npmVersion":"12.0.2","description":"Multiplayer for a mocanvas store: record diffs over a transport, plus presence and cursors.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@mocanvas/state":"4.5.2","@mocanvas/store":"4.5.2","@mocanvas/editor":"4.5.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.18.0","react":"^19.1.0","@types/ws":"^8.5.0","react-dom":"^19.1.0","@types/react":"^19.1.0","@types/react-dom":"^19.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/sync_4.5.2_1789344020521_0.9022150459185856","host":"s3://npm-registry-packages-npm-production"}},"4.6.0":{"name":"@mocanvas/sync","version":"4.6.0","keywords":["multiplayer","collaboration","presence","websocket","sync","mocanvas"],"author":{"name":"Symbio Digital"},"license":"SEE LICENSE IN LICENSE","_id":"@mocanvas/sync@4.6.0","maintainers":[{"name":"von.schau","email":"von.schau@gmail.com"}],"dist":{"shasum":"e9f470b9f41f547df6460bfa8b03f70898a87730","tarball":"https://registry.npmjs.org/@mocanvas/sync/-/sync-4.6.0.tgz","fileCount":14,"integrity":"sha512-hk0wkSY8M9adHILjjqWs33yh1ngYTKhOsuVj8oxYsooI1wOV/bhp7bAqkjhrbtE7tDAsiMC4/DsV8koreBtnYA==","signatures":[{"sig":"MEYCIQCgy0sTGhK5Wyf8oBRxQDLe1PgJ5ZsZiKIsCWPnQOzTtgIhAI3cSgw1OZ7zNHiXZWR+TowinbejYECxcblaZ/UBgtmc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":387846},"main":"./dist/index.js","type":"module","_from":"file:mocanvas-sync-4.6.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsup","relay":"node scripts/relay.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:51d24bee-9834-492d-b7a6-8cbe5e019237"}},"_resolved":"/tmp/dacc921555bb8aa8664f77943c975db1/mocanvas-sync-4.6.0.tgz","_integrity":"sha512-hk0wkSY8M9adHILjjqWs33yh1ngYTKhOsuVj8oxYsooI1wOV/bhp7bAqkjhrbtE7tDAsiMC4/DsV8koreBtnYA==","_npmVersion":"12.0.2","description":"Multiplayer for a mocanvas store: record diffs over a transport, plus presence and cursors.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@mocanvas/state":"4.6.0","@mocanvas/store":"4.6.0","@mocanvas/editor":"4.6.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.18.0","react":"^19.1.0","@types/ws":"^8.5.0","react-dom":"^19.1.0","@types/react":"^19.1.0","@types/react-dom":"^19.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/sync_4.6.0_1789386953876_0.8054303584800413","host":"s3://npm-registry-packages-npm-production"}},"4.6.1":{"name":"@mocanvas/sync","version":"4.6.1","keywords":["multiplayer","collaboration","presence","websocket","sync","mocanvas"],"author":{"name":"Symbio Digital"},"license":"SEE LICENSE IN LICENSE","_id":"@mocanvas/sync@4.6.1","maintainers":[{"name":"von.schau","email":"von.schau@gmail.com"}],"dist":{"shasum":"cd193cab569dfcc405d8e16593bc9faa8aa08fa3","tarball":"https://registry.npmjs.org/@mocanvas/sync/-/sync-4.6.1.tgz","fileCount":14,"integrity":"sha512-k3BHbYn586Q+qkDKwEhpFwJoMI4n+qs2fMyi5G9EroVjM+aD0+PAgAKkb8CTlx73y4kQWgd2PRt20P6+GUxjzg==","signatures":[{"sig":"MEYCIQDBtYoo66dMHxVzGdc4qFn78bPDSoFHekz/5WfSidSKAQIhALqY7gstbUXoV8nkWCJ0soJQ2vuRtXDzqBmhh5tfcU8P","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":387846},"main":"./dist/index.js","type":"module","_from":"file:mocanvas-sync-4.6.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsup","relay":"node scripts/relay.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:51d24bee-9834-492d-b7a6-8cbe5e019237"}},"_resolved":"/tmp/caeb1ec23c9a805ecb6459efa700ce67/mocanvas-sync-4.6.1.tgz","_integrity":"sha512-k3BHbYn586Q+qkDKwEhpFwJoMI4n+qs2fMyi5G9EroVjM+aD0+PAgAKkb8CTlx73y4kQWgd2PRt20P6+GUxjzg==","_npmVersion":"12.0.2","description":"Multiplayer for a mocanvas store: record diffs over a transport, plus presence and cursors.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@mocanvas/state":"4.6.1","@mocanvas/store":"4.6.1","@mocanvas/editor":"4.6.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.18.0","react":"^19.1.0","@types/ws":"^8.5.0","react-dom":"^19.1.0","@types/react":"^19.1.0","@types/react-dom":"^19.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/sync_4.6.1_1789387936431_0.803285619401179","host":"s3://npm-registry-packages-npm-production"}},"4.7.0":{"name":"@mocanvas/sync","version":"4.7.0","keywords":["multiplayer","collaboration","presence","websocket","sync","mocanvas"],"author":{"name":"Symbio Digital"},"license":"SEE LICENSE IN LICENSE","_id":"@mocanvas/sync@4.7.0","maintainers":[{"name":"von.schau","email":"von.schau@gmail.com"}],"dist":{"shasum":"732c709e3d0d396ef723edda29a3fda7fa3b67ce","tarball":"https://registry.npmjs.org/@mocanvas/sync/-/sync-4.7.0.tgz","fileCount":14,"integrity":"sha512-OLi2m1dYoQP/65otYobxzuAF6NraSbqga1wuau//BEOKG7ruj8w0IDtR1PRThJQ90SsmQHcL7JR0GYyGmT5rRw==","signatures":[{"sig":"MEYCIQC+I0pcmJRhuMOsDj6NAexvvp8qs4D0Ju8KyQIe4pt2fgIhANz7ubTtJ9OHq9HGrWzOYksMlTNe3FrRGlrv2gL4kb+c","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":387846},"main":"./dist/index.js","type":"module","_from":"file:mocanvas-sync-4.7.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsup","relay":"node scripts/relay.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:51d24bee-9834-492d-b7a6-8cbe5e019237"}},"_resolved":"/tmp/68a8b1bd2f70b8685762878fc471622a/mocanvas-sync-4.7.0.tgz","_integrity":"sha512-OLi2m1dYoQP/65otYobxzuAF6NraSbqga1wuau//BEOKG7ruj8w0IDtR1PRThJQ90SsmQHcL7JR0GYyGmT5rRw==","_npmVersion":"12.0.2","description":"Multiplayer for a mocanvas store: record diffs over a transport, plus presence and cursors.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@mocanvas/state":"4.7.0","@mocanvas/store":"4.7.0","@mocanvas/editor":"4.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.18.0","react":"^19.1.0","@types/ws":"^8.5.0","react-dom":"^19.1.0","@types/react":"^19.1.0","@types/react-dom":"^19.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/sync_4.7.0_1789403165929_0.7581303059649711","host":"s3://npm-registry-packages-npm-production"}},"4.7.1":{"name":"@mocanvas/sync","version":"4.7.1","keywords":["multiplayer","collaboration","presence","websocket","sync","mocanvas"],"author":{"name":"Symbio Digital"},"license":"SEE LICENSE IN LICENSE","_id":"@mocanvas/sync@4.7.1","maintainers":[{"name":"von.schau","email":"von.schau@gmail.com"}],"dist":{"shasum":"4372bab35d0c56a6afaed3a1aa21bddfb1d7fe84","tarball":"https://registry.npmjs.org/@mocanvas/sync/-/sync-4.7.1.tgz","fileCount":14,"integrity":"sha512-FhH1ZOkkaxBKj03eHHSWi1gK2EHyd971NftgDE/UFdlk7EhUEpLpEa7nojSmpsHk9quBWMoVK8lJFGwrRWpevg==","signatures":[{"sig":"MEUCIQDVWiRGvt0JFN2RevNtuo7tQ3QNTncCTtJTaTfzaUdqpQIgFjbD5+XOZiEYXlCfq6ofFp536snQQvzd0vRa4lYMtz0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":387846},"main":"./dist/index.js","type":"module","_from":"file:mocanvas-sync-4.7.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsup","relay":"node scripts/relay.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:51d24bee-9834-492d-b7a6-8cbe5e019237"}},"_resolved":"/tmp/a2deefa9cd0946d6170fd8b49943153b/mocanvas-sync-4.7.1.tgz","_integrity":"sha512-FhH1ZOkkaxBKj03eHHSWi1gK2EHyd971NftgDE/UFdlk7EhUEpLpEa7nojSmpsHk9quBWMoVK8lJFGwrRWpevg==","_npmVersion":"12.0.2","description":"Multiplayer for a mocanvas store: record diffs over a transport, plus presence and cursors.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@mocanvas/state":"4.7.1","@mocanvas/store":"4.7.1","@mocanvas/editor":"4.7.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.18.0","react":"^19.1.0","@types/ws":"^8.5.0","react-dom":"^19.1.0","@types/react":"^19.1.0","@types/react-dom":"^19.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/sync_4.7.1_1789411560012_0.2500141947792436","host":"s3://npm-registry-packages-npm-production"}},"4.8.0":{"name":"@mocanvas/sync","version":"4.8.0","keywords":["multiplayer","collaboration","presence","websocket","sync","mocanvas"],"author":{"name":"Symbio Digital"},"license":"SEE LICENSE IN LICENSE","_id":"@mocanvas/sync@4.8.0","maintainers":[{"name":"von.schau","email":"von.schau@gmail.com"}],"dist":{"shasum":"820d79059b3374478279819d5c0111f2981c7a49","tarball":"https://registry.npmjs.org/@mocanvas/sync/-/sync-4.8.0.tgz","fileCount":14,"integrity":"sha512-RnF8QG5EHh+IIyob4VHfoK0pGAU/6U3FP7xsJjE7dvqdJkKpSYVKSDXJuEY3LdOSaXzSPgZDLDUyoE5cATvS5g==","signatures":[{"sig":"MEUCIGKSizPV/QiniLefM7fILkc2AVjeRNxmLCcC3TV8IvUWAiEAjbbzO1eW4Kg0LNi7bL+7TPCQfx3f3/KMgHQzkYA9/Xs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":387846},"main":"./dist/index.js","type":"module","_from":"file:mocanvas-sync-4.8.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsup","relay":"node scripts/relay.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:51d24bee-9834-492d-b7a6-8cbe5e019237"}},"_resolved":"/tmp/d61dd417a2415d213afb188715d2f4c1/mocanvas-sync-4.8.0.tgz","_integrity":"sha512-RnF8QG5EHh+IIyob4VHfoK0pGAU/6U3FP7xsJjE7dvqdJkKpSYVKSDXJuEY3LdOSaXzSPgZDLDUyoE5cATvS5g==","_npmVersion":"12.0.2","description":"Multiplayer for a mocanvas store: record diffs over a transport, plus presence and cursors.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@mocanvas/state":"4.8.0","@mocanvas/store":"4.8.0","@mocanvas/editor":"4.8.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.18.0","react":"^19.1.0","@types/ws":"^8.5.0","react-dom":"^19.1.0","@types/react":"^19.1.0","@types/react-dom":"^19.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/sync_4.8.0_1789414614558_0.30632552371656674","host":"s3://npm-registry-packages-npm-production"}},"4.8.1":{"name":"@mocanvas/sync","version":"4.8.1","keywords":["multiplayer","collaboration","presence","websocket","sync","mocanvas"],"author":{"name":"Symbio Digital"},"license":"SEE LICENSE IN LICENSE","_id":"@mocanvas/sync@4.8.1","maintainers":[{"name":"von.schau","email":"von.schau@gmail.com"}],"dist":{"shasum":"4e177678c47ccdf46121d0f1527613fd5fb630b4","tarball":"https://registry.npmjs.org/@mocanvas/sync/-/sync-4.8.1.tgz","fileCount":14,"integrity":"sha512-2VZvUpwqakmAJ8w7BxGgabrIt6w5jgoTKRy8p9uB3UaZFH1shWWyfFyaWsN4WdArSX+fqaYS7YkVSSpemp23zA==","signatures":[{"sig":"MEUCIQCipoDvJkbw3+3Ta2HIIsM8ghZsZ0F/b9+u+P0HHwwCiQIgXILwm0mRoHXhDgD4T/vw+YUtQN5RHR2k8SinbPkaarY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":387846},"main":"./dist/index.js","type":"module","_from":"file:mocanvas-sync-4.8.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsup","relay":"node scripts/relay.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:51d24bee-9834-492d-b7a6-8cbe5e019237"}},"_resolved":"/tmp/e47c40f5f202eb935dd96191eaf49917/mocanvas-sync-4.8.1.tgz","_integrity":"sha512-2VZvUpwqakmAJ8w7BxGgabrIt6w5jgoTKRy8p9uB3UaZFH1shWWyfFyaWsN4WdArSX+fqaYS7YkVSSpemp23zA==","_npmVersion":"12.0.2","description":"Multiplayer for a mocanvas store: record diffs over a transport, plus presence and cursors.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@mocanvas/state":"4.8.1","@mocanvas/store":"4.8.1","@mocanvas/editor":"4.8.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.18.0","react":"^19.1.0","@types/ws":"^8.5.0","react-dom":"^19.1.0","@types/react":"^19.1.0","@types/react-dom":"^19.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/sync_4.8.1_1789416428235_0.4049645620733593","host":"s3://npm-registry-packages-npm-production"}},"4.8.2":{"name":"@mocanvas/sync","version":"4.8.2","keywords":["multiplayer","collaboration","presence","websocket","sync","mocanvas"],"author":{"name":"Symbio Digital"},"license":"SEE LICENSE IN LICENSE","_id":"@mocanvas/sync@4.8.2","maintainers":[{"name":"von.schau","email":"von.schau@gmail.com"}],"dist":{"shasum":"3f9de06013c0f788cc4a9de2d9bf934ab670c6c5","tarball":"https://registry.npmjs.org/@mocanvas/sync/-/sync-4.8.2.tgz","fileCount":14,"integrity":"sha512-ZVy6xBz3898e9T4QQtUEvtO/OCtp0Q8BtYCC5PxclElEMXGrY3dp779RWDsaa7Y5Uyn2y4P7fOsRKG4C6Xg7dQ==","signatures":[{"sig":"MEUCICdlwuHrhrPSwnac25V1mnRhg/BafPbz0wxXHON0E1WfAiEA5Q67LuWSevrxYJe/jfpt+RzwfPQJnAA/pC3HZ2XCfKk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":387846},"main":"./dist/index.js","type":"module","_from":"file:mocanvas-sync-4.8.2.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsup","relay":"node scripts/relay.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:51d24bee-9834-492d-b7a6-8cbe5e019237"}},"_resolved":"/tmp/9e0c418f7f7cff982e85ac13e3f17bfa/mocanvas-sync-4.8.2.tgz","_integrity":"sha512-ZVy6xBz3898e9T4QQtUEvtO/OCtp0Q8BtYCC5PxclElEMXGrY3dp779RWDsaa7Y5Uyn2y4P7fOsRKG4C6Xg7dQ==","_npmVersion":"12.0.2","description":"Multiplayer for a mocanvas store: record diffs over a transport, plus presence and cursors.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@mocanvas/state":"4.8.2","@mocanvas/store":"4.8.2","@mocanvas/editor":"4.8.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.18.0","react":"^19.1.0","@types/ws":"^8.5.0","react-dom":"^19.1.0","@types/react":"^19.1.0","@types/react-dom":"^19.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/sync_4.8.2_1789417397947_0.2556106001064329","host":"s3://npm-registry-packages-npm-production"}},"4.8.3":{"name":"@mocanvas/sync","version":"4.8.3","keywords":["multiplayer","collaboration","presence","websocket","sync","mocanvas"],"author":{"name":"Symbio Digital"},"license":"SEE LICENSE IN LICENSE","_id":"@mocanvas/sync@4.8.3","maintainers":[{"name":"von.schau","email":"von.schau@gmail.com"}],"homepage":"https://mocanvas.symbio.agency","bugs":{"url":"https://github.com/SYMBIO/mocanvas/issues"},"dist":{"shasum":"b3fb6da2ddf6c740b376135e8299c8e2b359a552","tarball":"https://registry.npmjs.org/@mocanvas/sync/-/sync-4.8.3.tgz","fileCount":14,"integrity":"sha512-44I6nJqC9fZUPvzk+nb/ztedaFsiYnuRLAObzHrTB0F6H3cQT235sXu5Tfcn3yoj1eGjhsRfCaOYYo5rK6GdEg==","signatures":[{"sig":"MEUCIQDlBngPfrIAhTWMB5vS3SEtQAo9/lYLRMRLcutojUFCwgIgFaLWEkRNDHCAZdKNRAC6a3AtwGIOTxYJx0XknXyWRUQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@mocanvas%2fsync@4.8.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":388098},"main":"./dist/index.js","type":"module","_from":"file:mocanvas-sync-4.8.3.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsup","relay":"node scripts/relay.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:51d24bee-9834-492d-b7a6-8cbe5e019237"}},"_resolved":"/tmp/8e154156daf6071081fd2a5599e05cc4/mocanvas-sync-4.8.3.tgz","_integrity":"sha512-44I6nJqC9fZUPvzk+nb/ztedaFsiYnuRLAObzHrTB0F6H3cQT235sXu5Tfcn3yoj1eGjhsRfCaOYYo5rK6GdEg==","repository":{"url":"git+https://github.com/SYMBIO/mocanvas.git","type":"git","directory":"packages/sync"},"_npmVersion":"12.0.2","description":"Multiplayer for a mocanvas store: record diffs over a transport, plus presence and cursors.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@mocanvas/state":"4.8.3","@mocanvas/store":"4.8.3","@mocanvas/editor":"4.8.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.18.0","react":"^19.1.0","@types/ws":"^8.5.0","react-dom":"^19.1.0","@types/react":"^19.1.0","@types/react-dom":"^19.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/sync_4.8.3_1789427852442_0.011846542140566019","host":"s3://npm-registry-packages-npm-production"}},"4.8.5":{"name":"@mocanvas/sync","version":"4.8.5","keywords":["multiplayer","collaboration","presence","websocket","sync","mocanvas"],"author":{"name":"Symbio Digital"},"license":"SEE LICENSE IN LICENSE","_id":"@mocanvas/sync@4.8.5","maintainers":[{"name":"von.schau","email":"von.schau@gmail.com"}],"homepage":"https://mocanvas.symbio.agency","bugs":{"url":"https://github.com/SYMBIO/mocanvas/issues"},"dist":{"shasum":"6c0e426348c7acbb68264a0b6e52294c3890b389","tarball":"https://registry.npmjs.org/@mocanvas/sync/-/sync-4.8.5.tgz","fileCount":14,"integrity":"sha512-u6vf0lQxhmkC99PTta13O3DxVlyC2jKmkDialR5Bi12L6SipvbGNCQhYzmzRkcIo2qZQRMOUEYTm9ZKfPT9IMQ==","signatures":[{"sig":"MEYCIQCreOx9aBZ3kSGp5EL3O1a1KlYNHiYbBbVekw83KEBgHAIhANXYfFCpyNB75wYn3zqSuUt3IYjCGcVCqANlWDkZwlqJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@mocanvas%2fsync@4.8.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":388490},"main":"./dist/index.js","type":"module","_from":"file:mocanvas-sync-4.8.5.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsup","relay":"node scripts/relay.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:51d24bee-9834-492d-b7a6-8cbe5e019237"}},"_resolved":"/tmp/11edc37b55022b0acf86bce0f5648aae/mocanvas-sync-4.8.5.tgz","_integrity":"sha512-u6vf0lQxhmkC99PTta13O3DxVlyC2jKmkDialR5Bi12L6SipvbGNCQhYzmzRkcIo2qZQRMOUEYTm9ZKfPT9IMQ==","repository":{"url":"git+https://github.com/SYMBIO/mocanvas.git","type":"git","directory":"packages/sync"},"_npmVersion":"12.0.2","description":"Multiplayer for a mocanvas store: record diffs over a transport, plus presence and cursors.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@mocanvas/state":"4.8.5","@mocanvas/store":"4.8.5","@mocanvas/editor":"4.8.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.18.0","react":"^19.1.0","@types/ws":"^8.5.0","react-dom":"^19.1.0","@types/react":"^19.1.0","@types/react-dom":"^19.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/sync_4.8.5_1789429043177_0.7647921438645455","host":"s3://npm-registry-packages-npm-production"}},"4.8.6":{"name":"@mocanvas/sync","version":"4.8.6","keywords":["multiplayer","collaboration","presence","websocket","sync","mocanvas"],"author":{"name":"Symbio Digital"},"license":"SEE LICENSE IN LICENSE","_id":"@mocanvas/sync@4.8.6","maintainers":[{"name":"von.schau","email":"von.schau@gmail.com"}],"homepage":"https://mocanvas.symbio.agency","bugs":{"url":"https://github.com/SYMBIO/mocanvas/issues"},"dist":{"shasum":"6ae451b1104c90cddfd207b220c4c9473fe6dac7","tarball":"https://registry.npmjs.org/@mocanvas/sync/-/sync-4.8.6.tgz","fileCount":14,"integrity":"sha512-HJl8fFRHgij08g9TzpgwJhXOnLe0CoH9iA2kSuZyachTW1OpaA0Hu1KlocPRgplaQybx2mO1kLBkPrWN5Oa0AA==","signatures":[{"sig":"MEUCID4UwXyMW29ok7qa0XElBESV8ugSMCmeeFHEdXWmmSbKAiEA+FlQA/jKZ91VAqFQhs9xqiG2aNO10gxPCevfQBeQdcg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@mocanvas%2fsync@4.8.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":388490},"main":"./dist/index.js","type":"module","_from":"file:mocanvas-sync-4.8.6.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsup","relay":"node scripts/relay.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:51d24bee-9834-492d-b7a6-8cbe5e019237"}},"_resolved":"/tmp/4bae965e11b495ab6a0226b06effd8d0/mocanvas-sync-4.8.6.tgz","_integrity":"sha512-HJl8fFRHgij08g9TzpgwJhXOnLe0CoH9iA2kSuZyachTW1OpaA0Hu1KlocPRgplaQybx2mO1kLBkPrWN5Oa0AA==","repository":{"url":"git+https://github.com/SYMBIO/mocanvas.git","type":"git","directory":"packages/sync"},"_npmVersion":"12.0.2","description":"Multiplayer for a mocanvas store: record diffs over a transport, plus presence and cursors.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@mocanvas/state":"4.8.6","@mocanvas/store":"4.8.6","@mocanvas/editor":"4.8.6"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.18.0","react":"^19.1.0","@types/ws":"^8.5.0","react-dom":"^19.1.0","@types/react":"^19.1.0","@types/react-dom":"^19.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/sync_4.8.6_1789485914998_0.8250506110395159","host":"s3://npm-registry-packages-npm-production"}},"4.8.7":{"name":"@mocanvas/sync","version":"4.8.7","keywords":["multiplayer","collaboration","presence","websocket","sync","mocanvas"],"author":{"name":"Symbio Digital"},"license":"SEE LICENSE IN LICENSE","_id":"@mocanvas/sync@4.8.7","maintainers":[{"name":"von.schau","email":"von.schau@gmail.com"}],"homepage":"https://mocanvas.symbio.agency","bugs":{"url":"https://github.com/SYMBIO/mocanvas/issues"},"dist":{"shasum":"8accf37eba66a2750630641c82e5f98b6f640966","tarball":"https://registry.npmjs.org/@mocanvas/sync/-/sync-4.8.7.tgz","fileCount":14,"integrity":"sha512-EHfxVdn9RpccQn4PT8GUvPTAgdnERO/iEeT8dU4cf6ZV+Tg2burVvOfHltq2vySP05QTRKpqVApl9I8m4taIcw==","signatures":[{"sig":"MEQCIFyXHvnt9+vs/Wp/H+o/L+5e1IGDrdjTMg32BsLNzGdLAiAUXzAmasu0RrJ7dbWFrKh4TSnMAVBfa864IewsmTRFdg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@mocanvas%2fsync@4.8.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":388490},"main":"./dist/index.js","type":"module","_from":"file:mocanvas-sync-4.8.7.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsup","relay":"node scripts/relay.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:51d24bee-9834-492d-b7a6-8cbe5e019237"}},"_resolved":"/tmp/24b77b2f09eace5b36266d96bedb5737/mocanvas-sync-4.8.7.tgz","_integrity":"sha512-EHfxVdn9RpccQn4PT8GUvPTAgdnERO/iEeT8dU4cf6ZV+Tg2burVvOfHltq2vySP05QTRKpqVApl9I8m4taIcw==","repository":{"url":"git+https://github.com/SYMBIO/mocanvas.git","type":"git","directory":"packages/sync"},"_npmVersion":"12.0.2","description":"Multiplayer for a mocanvas store: record diffs over a transport, plus presence and cursors.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@mocanvas/state":"4.8.7","@mocanvas/store":"4.8.7","@mocanvas/editor":"4.8.7"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.18.0","react":"^19.1.0","@types/ws":"^8.5.0","react-dom":"^19.1.0","@types/react":"^19.1.0","@types/react-dom":"^19.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/sync_4.8.7_1789498756821_0.7509486583769178","host":"s3://npm-registry-packages-npm-production"}},"4.8.8":{"name":"@mocanvas/sync","version":"4.8.8","keywords":["multiplayer","collaboration","presence","websocket","sync","mocanvas"],"author":{"name":"Symbio Digital"},"license":"SEE LICENSE IN LICENSE","_id":"@mocanvas/sync@4.8.8","maintainers":[{"name":"von.schau","email":"von.schau@gmail.com"}],"homepage":"https://mocanvas.symbio.agency","bugs":{"url":"https://github.com/SYMBIO/mocanvas/issues"},"dist":{"shasum":"b651c1caadac3c516751142b535bf9e1ff990190","tarball":"https://registry.npmjs.org/@mocanvas/sync/-/sync-4.8.8.tgz","fileCount":14,"integrity":"sha512-pXqFdik377pHDMT9rQ8PZwsIdjn6o4U3yhwxxjUit78ZKonpbcqmhmcTDOu9TGVzEDOl1eyU98wz53N2YXSuCQ==","signatures":[{"sig":"MEUCIQCp/CtHNdZ2uqAPHYbiGvKn5F4Ex0xS9exdjw+lg6buuQIgILdjo6XgjNTcVLj3dzW6xOkSNjXXhPyON2jOPsC644U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@mocanvas%2fsync@4.8.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":388490},"main":"./dist/index.js","type":"module","_from":"file:mocanvas-sync-4.8.8.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsup","relay":"node scripts/relay.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:51d24bee-9834-492d-b7a6-8cbe5e019237"}},"_resolved":"/tmp/057e8004b40a84cfacc103dc400c00e4/mocanvas-sync-4.8.8.tgz","_integrity":"sha512-pXqFdik377pHDMT9rQ8PZwsIdjn6o4U3yhwxxjUit78ZKonpbcqmhmcTDOu9TGVzEDOl1eyU98wz53N2YXSuCQ==","repository":{"url":"git+https://github.com/SYMBIO/mocanvas.git","type":"git","directory":"packages/sync"},"_npmVersion":"12.0.2","description":"Multiplayer for a mocanvas store: record diffs over a transport, plus presence and cursors.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@mocanvas/state":"4.8.8","@mocanvas/store":"4.8.8","@mocanvas/editor":"4.8.8"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.18.0","react":"^19.1.0","@types/ws":"^8.5.0","react-dom":"^19.1.0","@types/react":"^19.1.0","@types/react-dom":"^19.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/sync_4.8.8_1789502010934_0.19588992347374412","host":"s3://npm-registry-packages-npm-production"}},"4.8.9":{"name":"@mocanvas/sync","version":"4.8.9","keywords":["multiplayer","collaboration","presence","websocket","sync","mocanvas"],"author":{"name":"Symbio Digital"},"license":"SEE LICENSE IN LICENSE","_id":"@mocanvas/sync@4.8.9","maintainers":[{"name":"von.schau","email":"von.schau@gmail.com"}],"homepage":"https://mocanvas.symbio.agency","bugs":{"url":"https://github.com/SYMBIO/mocanvas/issues"},"dist":{"shasum":"2dffc1bcde0c558c487284b455bf44674720a4ae","tarball":"https://registry.npmjs.org/@mocanvas/sync/-/sync-4.8.9.tgz","fileCount":14,"integrity":"sha512-O4Z1B3SY/o8ehqWqvFrczA+xIn/QYE2dhdwdllZd5j9nd+EIs7LIVL7ouikpMLA1VFPb8IdBh/QKU7qDXfby5Q==","signatures":[{"sig":"MEUCIQDtJ7dHWpqeyQb8k1OQSTC+5lC9AiRaocQmwh9YdqZ/tQIgFxNoiEPMCRercut46msEEYBzVMaQHKzR3Aq4Q2EXmQw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@mocanvas%2fsync@4.8.9","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":388490},"main":"./dist/index.js","type":"module","_from":"file:mocanvas-sync-4.8.9.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsup","relay":"node scripts/relay.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:51d24bee-9834-492d-b7a6-8cbe5e019237"}},"_resolved":"/tmp/586be722ff0540c8d0378209759b7d3e/mocanvas-sync-4.8.9.tgz","_integrity":"sha512-O4Z1B3SY/o8ehqWqvFrczA+xIn/QYE2dhdwdllZd5j9nd+EIs7LIVL7ouikpMLA1VFPb8IdBh/QKU7qDXfby5Q==","repository":{"url":"git+https://github.com/SYMBIO/mocanvas.git","type":"git","directory":"packages/sync"},"_npmVersion":"12.0.2","description":"Multiplayer for a mocanvas store: record diffs over a transport, plus presence and cursors.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@mocanvas/state":"4.8.9","@mocanvas/store":"4.8.9","@mocanvas/editor":"4.8.9"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.18.0","react":"^19.1.0","@types/ws":"^8.5.0","react-dom":"^19.1.0","@types/react":"^19.1.0","@types/react-dom":"^19.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/sync_4.8.9_1789503889333_0.8012287317794462","host":"s3://npm-registry-packages-npm-production"}},"4.8.10":{"name":"@mocanvas/sync","version":"4.8.10","keywords":["multiplayer","collaboration","presence","websocket","sync","mocanvas"],"author":{"name":"Symbio Digital"},"license":"SEE LICENSE IN LICENSE","_id":"@mocanvas/sync@4.8.10","maintainers":[{"name":"von.schau","email":"von.schau@gmail.com"}],"homepage":"https://mocanvas.symbio.agency","bugs":{"url":"https://github.com/SYMBIO/mocanvas/issues"},"dist":{"shasum":"365b448928609983bce3028a3f73f720f17fafe0","tarball":"https://registry.npmjs.org/@mocanvas/sync/-/sync-4.8.10.tgz","fileCount":14,"integrity":"sha512-ZCsdbYksa+Z2xEnKJ254SvTcmY8sDx2XR74rBZivcplQmP0YghIxEHMojnSFLTm5pY5Qxccsa06hsOdRD7J3NQ==","signatures":[{"sig":"MEUCIQDL8hc96+keCZHc904htQMCOmBwsvFRTIVgoGNwDdQulQIgF6vE2DeTNLcsGPsbk63GrGNscFjlnnRl2Kd7Iijvup8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@mocanvas%2fsync@4.8.10","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":388494},"main":"./dist/index.js","type":"module","_from":"file:mocanvas-sync-4.8.10.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsup","relay":"node scripts/relay.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:51d24bee-9834-492d-b7a6-8cbe5e019237"}},"_resolved":"/tmp/7c247b1c41795276bcd0cf32f20ce9ec/mocanvas-sync-4.8.10.tgz","_integrity":"sha512-ZCsdbYksa+Z2xEnKJ254SvTcmY8sDx2XR74rBZivcplQmP0YghIxEHMojnSFLTm5pY5Qxccsa06hsOdRD7J3NQ==","repository":{"url":"git+https://github.com/SYMBIO/mocanvas.git","type":"git","directory":"packages/sync"},"_npmVersion":"12.0.2","description":"Multiplayer for a mocanvas store: record diffs over a transport, plus presence and cursors.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@mocanvas/state":"4.8.10","@mocanvas/store":"4.8.10","@mocanvas/editor":"4.8.10"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.18.0","react":"^19.1.0","@types/ws":"^8.5.0","react-dom":"^19.1.0","@types/react":"^19.1.0","@types/react-dom":"^19.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/sync_4.8.10_1789506652918_0.8775724472069737","host":"s3://npm-registry-packages-npm-production"}},"4.9.0":{"name":"@mocanvas/sync","version":"4.9.0","keywords":["multiplayer","collaboration","presence","websocket","sync","mocanvas"],"author":{"name":"Symbio Digital"},"license":"SEE LICENSE IN LICENSE","_id":"@mocanvas/sync@4.9.0","maintainers":[{"name":"von.schau","email":"von.schau@gmail.com"}],"homepage":"https://mocanvas.symbio.agency","bugs":{"url":"https://github.com/SYMBIO/mocanvas/issues"},"dist":{"shasum":"70462f250ce3148b3c9089845a592516eba4c20c","tarball":"https://registry.npmjs.org/@mocanvas/sync/-/sync-4.9.0.tgz","fileCount":14,"integrity":"sha512-0nqVwlMBHMFv65fuAZGoloa9XVbHf8ubBXi5oYk1zHaZrM4odEdDtk43sUWK7ealxLztX0R/xG863wPaEB6VrQ==","signatures":[{"sig":"MEUCIAx9htFgOYHqOjJ+H+RoE/yRD6nRrvxBV3Sl6L2nqYGkAiEA/EdDmG4spF0Zk7CsjGxpghRdstdBP8Eycw6FF1puPeM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@mocanvas%2fsync@4.9.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":392748},"main":"./dist/index.js","type":"module","_from":"file:mocanvas-sync-4.9.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsup","relay":"node scripts/relay.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:51d24bee-9834-492d-b7a6-8cbe5e019237"}},"_resolved":"/tmp/e828177595ce779c9578f5f28f9120cd/mocanvas-sync-4.9.0.tgz","_integrity":"sha512-0nqVwlMBHMFv65fuAZGoloa9XVbHf8ubBXi5oYk1zHaZrM4odEdDtk43sUWK7ealxLztX0R/xG863wPaEB6VrQ==","repository":{"url":"git+https://github.com/SYMBIO/mocanvas.git","type":"git","directory":"packages/sync"},"_npmVersion":"12.0.2","description":"Multiplayer for a mocanvas store: record diffs over a transport, plus presence and cursors.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@mocanvas/state":"4.9.0","@mocanvas/store":"4.9.0","@mocanvas/editor":"4.9.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.18.0","react":"^19.1.0","@types/ws":"^8.5.0","react-dom":"^19.1.0","@types/react":"^19.1.0","@types/react-dom":"^19.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/sync_4.9.0_1789506810317_0.5309176256609425","host":"s3://npm-registry-packages-npm-production"}},"4.9.1":{"name":"@mocanvas/sync","version":"4.9.1","keywords":["multiplayer","collaboration","presence","websocket","sync","mocanvas"],"author":{"name":"Symbio Digital"},"license":"SEE LICENSE IN LICENSE","_id":"@mocanvas/sync@4.9.1","maintainers":[{"name":"von.schau","email":"von.schau@gmail.com"}],"homepage":"https://mocanvas.symbio.agency","bugs":{"url":"https://github.com/SYMBIO/mocanvas/issues"},"dist":{"shasum":"33de6a15201b0d7fbd42c14cba6b6ef7bc1c96b0","tarball":"https://registry.npmjs.org/@mocanvas/sync/-/sync-4.9.1.tgz","fileCount":14,"integrity":"sha512-eIkpYMsZR4rXK9aC9exUzO6Pe4r05TPj7wZWlfl82+Cv/FEGMWKea0pdHZq983WUEXwOBryXgiwnmzmOILTQwQ==","signatures":[{"sig":"MEQCIFBGBNaT3o5PkB5h4bI2c0xSO1ulKudV6nAsT76fVU7AAiBFcL6BGPBIJIo27wK2Pn1+BB5Drs406u9VcdtJ4tpfAw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@mocanvas%2fsync@4.9.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":392748},"main":"./dist/index.js","type":"module","_from":"file:mocanvas-sync-4.9.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsup","relay":"node scripts/relay.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:51d24bee-9834-492d-b7a6-8cbe5e019237"}},"_resolved":"/tmp/32f86eb00156eb8a301c231f929a5e5a/mocanvas-sync-4.9.1.tgz","_integrity":"sha512-eIkpYMsZR4rXK9aC9exUzO6Pe4r05TPj7wZWlfl82+Cv/FEGMWKea0pdHZq983WUEXwOBryXgiwnmzmOILTQwQ==","repository":{"url":"git+https://github.com/SYMBIO/mocanvas.git","type":"git","directory":"packages/sync"},"_npmVersion":"12.0.2","description":"Multiplayer for a mocanvas store: record diffs over a transport, plus presence and cursors.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@mocanvas/state":"4.9.1","@mocanvas/store":"4.9.1","@mocanvas/editor":"4.9.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.18.0","react":"^19.1.0","@types/ws":"^8.5.0","react-dom":"^19.1.0","@types/react":"^19.1.0","@types/react-dom":"^19.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/sync_4.9.1_1789508629128_0.4311155295213338","host":"s3://npm-registry-packages-npm-production"}},"4.9.2":{"name":"@mocanvas/sync","version":"4.9.2","keywords":["multiplayer","collaboration","presence","websocket","sync","mocanvas"],"author":{"name":"Symbio Digital"},"license":"SEE LICENSE IN LICENSE","_id":"@mocanvas/sync@4.9.2","maintainers":[{"name":"von.schau","email":"von.schau@gmail.com"}],"homepage":"https://mocanvas.symbio.agency","bugs":{"url":"https://github.com/SYMBIO/mocanvas/issues"},"dist":{"shasum":"589ffb5eb52764021ebad5bdd139d9e366da8842","tarball":"https://registry.npmjs.org/@mocanvas/sync/-/sync-4.9.2.tgz","fileCount":14,"integrity":"sha512-YYAJNxKERYCcwR/cd0BFsMwxBYAPyEI2dvZPgAz4l7buUGintDMpEPpKcQWoOQP+PMrEJO6yid3U2csaQNR30g==","signatures":[{"sig":"MEYCIQD0/4uzIC1dQk5pHKa0gCSXa4wbdyBvcymTa3qxeA+6XAIhAN3tblEmx5m6GDvQBEaMmEVWxgTlTGy7R6A/EI6lj7ma","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@mocanvas%2fsync@4.9.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":392748},"main":"./dist/index.js","type":"module","_from":"file:mocanvas-sync-4.9.2.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsup","relay":"node scripts/relay.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:51d24bee-9834-492d-b7a6-8cbe5e019237"}},"_resolved":"/tmp/78a348738a6db07664d326df72e23687/mocanvas-sync-4.9.2.tgz","_integrity":"sha512-YYAJNxKERYCcwR/cd0BFsMwxBYAPyEI2dvZPgAz4l7buUGintDMpEPpKcQWoOQP+PMrEJO6yid3U2csaQNR30g==","repository":{"url":"git+https://github.com/SYMBIO/mocanvas.git","type":"git","directory":"packages/sync"},"_npmVersion":"12.0.2","description":"Multiplayer for a mocanvas store: record diffs over a transport, plus presence and cursors.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@mocanvas/state":"4.9.2","@mocanvas/store":"4.9.2","@mocanvas/editor":"4.9.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.18.0","react":"^19.1.0","@types/ws":"^8.5.0","react-dom":"^19.1.0","@types/react":"^19.1.0","@types/react-dom":"^19.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/sync_4.9.2_1789538232582_0.5355976839250416","host":"s3://npm-registry-packages-npm-production"}},"4.9.3":{"name":"@mocanvas/sync","version":"4.9.3","keywords":["multiplayer","collaboration","presence","websocket","sync","mocanvas"],"author":{"name":"Symbio Digital"},"license":"SEE LICENSE IN LICENSE","_id":"@mocanvas/sync@4.9.3","maintainers":[{"name":"von.schau","email":"von.schau@gmail.com"}],"homepage":"https://mocanvas.symbio.agency","bugs":{"url":"https://github.com/SYMBIO/mocanvas/issues"},"dist":{"shasum":"745b910ecc3483f48ca5abbe264ed43cab62a640","tarball":"https://registry.npmjs.org/@mocanvas/sync/-/sync-4.9.3.tgz","fileCount":14,"integrity":"sha512-2PBmtAXxTXTaWpJyFykoOJ3AICtsBdpTaFXlwVacJBqUKnZQ3a0wd1oyrE/+1rropy/tLmp+XPL+qRIPQ3ixag==","signatures":[{"sig":"MEYCIQDfnlpGEx0DdHkQR3xsKVUZ6yq8L9gD4wI4rnYB+Rdy/gIhANnab7fHtG0qHW57oTZGmCMUFNUhJzDshU9ioZrpfbAx","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@mocanvas%2fsync@4.9.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":392748},"main":"./dist/index.js","type":"module","_from":"file:mocanvas-sync-4.9.3.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsup","relay":"node scripts/relay.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:51d24bee-9834-492d-b7a6-8cbe5e019237"}},"_resolved":"/tmp/fcfe3896433e068c0294f37393bb07ff/mocanvas-sync-4.9.3.tgz","_integrity":"sha512-2PBmtAXxTXTaWpJyFykoOJ3AICtsBdpTaFXlwVacJBqUKnZQ3a0wd1oyrE/+1rropy/tLmp+XPL+qRIPQ3ixag==","repository":{"url":"git+https://github.com/SYMBIO/mocanvas.git","type":"git","directory":"packages/sync"},"_npmVersion":"12.0.2","description":"Multiplayer for a mocanvas store: record diffs over a transport, plus presence and cursors.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@mocanvas/state":"4.9.3","@mocanvas/store":"4.9.3","@mocanvas/editor":"4.9.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.18.0","react":"^19.1.0","@types/ws":"^8.5.0","react-dom":"^19.1.0","@types/react":"^19.1.0","@types/react-dom":"^19.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/sync_4.9.3_1789539074054_0.5542450661212368","host":"s3://npm-registry-packages-npm-production"}},"4.10.0":{"name":"@mocanvas/sync","version":"4.10.0","keywords":["multiplayer","collaboration","presence","websocket","sync","mocanvas"],"author":{"name":"Symbio Digital"},"license":"SEE LICENSE IN LICENSE","_id":"@mocanvas/sync@4.10.0","maintainers":[{"name":"von.schau","email":"von.schau@gmail.com"}],"homepage":"https://mocanvas.symbio.agency","bugs":{"url":"https://github.com/SYMBIO/mocanvas/issues"},"dist":{"shasum":"da0cc8620c14c67e99008bdf3ba22764c87988b6","tarball":"https://registry.npmjs.org/@mocanvas/sync/-/sync-4.10.0.tgz","fileCount":14,"integrity":"sha512-jlyAhSkfW/PE7ijypB0E0SDy3el6azup6wRq89bwuaAz0NVXXVmrYZFHAYMaYFnvn28yYaQZXBKFEgGMVGwOrw==","signatures":[{"sig":"MEUCIQCpiU02BY1fuVUv7rcsp9iPi8+O6jYmE2ZQi6F6L9vbRgIgE2mQNvkIexqKh6nffXPuTq/AityGXfGrOFxbzipyBU0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@mocanvas%2fsync@4.10.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":392752},"main":"./dist/index.js","type":"module","_from":"file:mocanvas-sync-4.10.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsup","relay":"node scripts/relay.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:51d24bee-9834-492d-b7a6-8cbe5e019237"}},"_resolved":"/tmp/2463d07b03af5727f6e681e81e69415f/mocanvas-sync-4.10.0.tgz","_integrity":"sha512-jlyAhSkfW/PE7ijypB0E0SDy3el6azup6wRq89bwuaAz0NVXXVmrYZFHAYMaYFnvn28yYaQZXBKFEgGMVGwOrw==","repository":{"url":"git+https://github.com/SYMBIO/mocanvas.git","type":"git","directory":"packages/sync"},"_npmVersion":"12.0.2","description":"Multiplayer for a mocanvas store: record diffs over a transport, plus presence and cursors.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@mocanvas/state":"4.10.0","@mocanvas/store":"4.10.0","@mocanvas/editor":"4.10.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.18.0","react":"^19.1.0","@types/ws":"^8.5.0","react-dom":"^19.1.0","@types/react":"^19.1.0","@types/react-dom":"^19.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/sync_4.10.0_1789638172620_0.5554728018529513","host":"s3://npm-registry-packages-npm-production"}},"4.10.1":{"name":"@mocanvas/sync","version":"4.10.1","keywords":["multiplayer","collaboration","presence","websocket","sync","mocanvas"],"author":{"name":"Symbio Digital"},"license":"SEE LICENSE IN LICENSE","_id":"@mocanvas/sync@4.10.1","maintainers":[{"name":"von.schau","email":"von.schau@gmail.com"}],"homepage":"https://mocanvas.symbio.agency","bugs":{"url":"https://github.com/SYMBIO/mocanvas/issues"},"dist":{"shasum":"1e7b901cb48adbb91d40f094d45f01e014572d02","tarball":"https://registry.npmjs.org/@mocanvas/sync/-/sync-4.10.1.tgz","fileCount":14,"integrity":"sha512-HXT1qB2uT5dXjBSp6R2tR3iwy31q77VybPl2qXwV1MT/9ut8I2F1UKNJiXrcCBMavq/q2rzIDqyYQLyZRWzmWQ==","signatures":[{"sig":"MEYCIQCzVj8BxqwSfV55tYrI2QfVE8/y5afQRNN/xdCfx8engQIhAPlUZ3DxTyu0BmlwFZvRxXBzobJc+Fa3whRK0DsXORLo","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIDkntVqHG+1ThWXWRhebTzN+7/hPV/PuRJoihZoRUs5bAiEAzIzYJixts2odw8yEgFzA/K4x3xYH8B22oJN+1xbD+WU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@mocanvas%2fsync@4.10.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":392752},"main":"./dist/index.js","type":"module","_from":"file:mocanvas-sync-4.10.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsup","relay":"node scripts/relay.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:51d24bee-9834-492d-b7a6-8cbe5e019237"}},"_resolved":"/tmp/4b6f0976a9c84ed3a03fdb7f52d9c45c/mocanvas-sync-4.10.1.tgz","_integrity":"sha512-HXT1qB2uT5dXjBSp6R2tR3iwy31q77VybPl2qXwV1MT/9ut8I2F1UKNJiXrcCBMavq/q2rzIDqyYQLyZRWzmWQ==","repository":{"url":"git+https://github.com/SYMBIO/mocanvas.git","type":"git","directory":"packages/sync"},"_npmVersion":"12.1.0","description":"Multiplayer for a mocanvas store: record diffs over a transport, plus presence and cursors.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@mocanvas/state":"4.10.1","@mocanvas/store":"4.10.1","@mocanvas/editor":"4.10.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.18.0","react":"^19.1.0","@types/ws":"^8.5.0","react-dom":"^19.1.0","@types/react":"^19.1.0","@types/react-dom":"^19.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/sync_4.10.1_1790168284082_0.7962988932071362","host":"s3://npm-registry-packages-npm-production"}},"4.11.0":{"name":"@mocanvas/sync","version":"4.11.0","keywords":["multiplayer","collaboration","presence","websocket","sync","mocanvas"],"author":{"name":"Symbio Digital"},"license":"SEE LICENSE IN LICENSE","_id":"@mocanvas/sync@4.11.0","maintainers":[{"name":"von.schau","email":"von.schau@gmail.com"}],"homepage":"https://mocanvas.symbio.agency","bugs":{"url":"https://github.com/SYMBIO/mocanvas/issues"},"dist":{"shasum":"7d47087fa86afd15634d83606570deee9a8b94e2","tarball":"https://registry.npmjs.org/@mocanvas/sync/-/sync-4.11.0.tgz","fileCount":14,"integrity":"sha512-gt9DWrcS8CoFD/fF+0jPeY+R9UKIceJ32V7qvEJ50cmKx1sBN+uJp/IBKMMxEUHsW76kZ3OW3EZ053ZaSh7QaQ==","signatures":[{"sig":"MEYCIQCaSdT2MRTcF1vqTZv5PSOi7gpO6a0VST9I7vGyPd9w+wIhAPPivrOhHppvvLroantBci9bOHy5VXc7BtwlA0Y6ng2W","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIE6zBz/ZnTJ2r5nkev59YE2tR/PF3LaXAsugXV9D6xFHAiEA4/F6LD87fXf22rQk8oyx9uf9YyiepjaYjAviIrOuK7s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@mocanvas%2fsync@4.11.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":392752},"main":"./dist/index.js","type":"module","_from":"file:mocanvas-sync-4.11.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsup","relay":"node scripts/relay.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:51d24bee-9834-492d-b7a6-8cbe5e019237"}},"_resolved":"/tmp/ed6e1d668adaaa36f13eaf6e373e56b8/mocanvas-sync-4.11.0.tgz","_integrity":"sha512-gt9DWrcS8CoFD/fF+0jPeY+R9UKIceJ32V7qvEJ50cmKx1sBN+uJp/IBKMMxEUHsW76kZ3OW3EZ053ZaSh7QaQ==","repository":{"url":"git+https://github.com/SYMBIO/mocanvas.git","type":"git","directory":"packages/sync"},"_npmVersion":"12.1.0","description":"Multiplayer for a mocanvas store: record diffs over a transport, plus presence and cursors.","directories":{},"sideEffects":false,"_nodeVersion":"24.21.0","dependencies":{"@mocanvas/state":"4.11.0","@mocanvas/store":"4.11.0","@mocanvas/editor":"4.11.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.18.0","react":"^19.1.0","@types/ws":"^8.5.0","react-dom":"^19.1.0","@types/react":"^19.1.0","@types/react-dom":"^19.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/sync_4.11.0_1790168793106_0.4671211344421622","host":"s3://npm-registry-packages-npm-production"}},"4.11.1":{"name":"@mocanvas/sync","version":"4.11.1","keywords":["multiplayer","collaboration","presence","websocket","sync","mocanvas"],"author":{"name":"Symbio Digital"},"license":"SEE LICENSE IN LICENSE","_id":"@mocanvas/sync@4.11.1","maintainers":[{"name":"von.schau","email":"von.schau@gmail.com"}],"homepage":"https://mocanvas.symbio.agency","bugs":{"url":"https://github.com/SYMBIO/mocanvas/issues"},"dist":{"shasum":"a27ab225b031ccb23d2eb1949bbf4a2972cfef23","tarball":"https://registry.npmjs.org/@mocanvas/sync/-/sync-4.11.1.tgz","fileCount":14,"integrity":"sha512-TmZs6FWxhzqhSsS0hPyf/skDRZ+G7rc3RpuS43mU0dUJkGD2nGQWhnSrMSgr/G8We7bO09t4GBfgdsKn7JocYQ==","signatures":[{"sig":"MEQCIBw20o6lZD894MKnq1o9uw8msLh/WI5jz/j64VlOcSHtAiAtCfb10ji3k6rTVMytoBpopOjIkFSFvBVgKftQBKIXKw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIG2SmARqU2Ulr178PNeWvqFVrIS8yg8PC2z/AH5i4EURAiEA4yusMS+oDyIrRBDHTFd0foWh2nr8vFyUfoACS0Bnrvw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@mocanvas%2fsync@4.11.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":392752},"main":"./dist/index.js","type":"module","_from":"file:mocanvas-sync-4.11.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsup","relay":"node scripts/relay.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:51d24bee-9834-492d-b7a6-8cbe5e019237"}},"_resolved":"/tmp/e7962f82b7a49fae5f21bae26e33bfde/mocanvas-sync-4.11.1.tgz","_integrity":"sha512-TmZs6FWxhzqhSsS0hPyf/skDRZ+G7rc3RpuS43mU0dUJkGD2nGQWhnSrMSgr/G8We7bO09t4GBfgdsKn7JocYQ==","repository":{"url":"git+https://github.com/SYMBIO/mocanvas.git","type":"git","directory":"packages/sync"},"_npmVersion":"12.1.0","description":"Multiplayer for a mocanvas store: record diffs over a transport, plus presence and cursors.","directories":{},"sideEffects":false,"_nodeVersion":"24.21.0","dependencies":{"@mocanvas/state":"4.11.1","@mocanvas/store":"4.11.1","@mocanvas/editor":"4.11.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.18.0","react":"^19.1.0","@types/ws":"^8.5.0","react-dom":"^19.1.0","@types/react":"^19.1.0","@types/react-dom":"^19.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/sync_4.11.1_1790181196909_0.9726485245316216","host":"s3://npm-registry-packages-npm-production"}},"4.11.2":{"name":"@mocanvas/sync","version":"4.11.2","keywords":["multiplayer","collaboration","presence","websocket","sync","mocanvas"],"author":{"name":"Symbio Digital"},"license":"SEE LICENSE IN LICENSE","_id":"@mocanvas/sync@4.11.2","maintainers":[{"name":"von.schau","email":"von.schau@gmail.com"}],"homepage":"https://mocanvas.symbio.agency","bugs":{"url":"https://github.com/SYMBIO/mocanvas/issues"},"dist":{"shasum":"c3c7516081859247a0688fa72427eef5af38c716","tarball":"https://registry.npmjs.org/@mocanvas/sync/-/sync-4.11.2.tgz","fileCount":14,"integrity":"sha512-sG1EckbmeYnwrd0OLd9LXsyo2vJkjtS1Ffwug+S7PlDs3I9XL6gPqA4AnxNa31NZ8T32Q1cTE4NgrLZBxFEPbw==","signatures":[{"sig":"MEYCIQDTI/sj7Di/x+Z64Qi05/uqO+wo3tpLpKBNBCnLuhkS6gIhAKPzXMAzRVaRSEJWyfyVLg3Q25sbQ79nfkjzXG1AoZfv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCICvRM7/wjOk9DvHfTkqumsI0JajA4kJEctNG71iyl83tAiEA41YWMfI1m9gouCi8Mz2WK/v9cF7+V4VY+8YZNiIkp3k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@mocanvas%2fsync@4.11.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":392752},"main":"./dist/index.js","type":"module","_from":"file:mocanvas-sync-4.11.2.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsup","relay":"node scripts/relay.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:51d24bee-9834-492d-b7a6-8cbe5e019237"}},"_resolved":"/tmp/249e61df0bc85223081f37063eaf867a/mocanvas-sync-4.11.2.tgz","_integrity":"sha512-sG1EckbmeYnwrd0OLd9LXsyo2vJkjtS1Ffwug+S7PlDs3I9XL6gPqA4AnxNa31NZ8T32Q1cTE4NgrLZBxFEPbw==","repository":{"url":"git+https://github.com/SYMBIO/mocanvas.git","type":"git","directory":"packages/sync"},"_npmVersion":"12.1.0","description":"Multiplayer for a mocanvas store: record diffs over a transport, plus presence and cursors.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@mocanvas/state":"4.11.2","@mocanvas/store":"4.11.2","@mocanvas/editor":"4.11.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.18.0","react":"^19.1.0","@types/ws":"^8.5.0","react-dom":"^19.1.0","@types/react":"^19.1.0","@types/react-dom":"^19.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/sync_4.11.2_1790182316263_0.26325190260828313","host":"s3://npm-registry-packages-npm-production"}},"4.12.0":{"name":"@mocanvas/sync","version":"4.12.0","keywords":["multiplayer","collaboration","presence","websocket","sync","mocanvas"],"author":{"name":"Symbio Digital"},"license":"SEE LICENSE IN LICENSE","_id":"@mocanvas/sync@4.12.0","maintainers":[{"name":"von.schau","email":"von.schau@gmail.com"}],"homepage":"https://mocanvas.symbio.agency","bugs":{"url":"https://github.com/SYMBIO/mocanvas/issues"},"dist":{"shasum":"12ce096731f5ac9136e3648b4400719ed4a09b60","tarball":"https://registry.npmjs.org/@mocanvas/sync/-/sync-4.12.0.tgz","fileCount":14,"integrity":"sha512-9YJ2zKT+Vbcfg6QQjOvwATJthfchKVWqh3Wy26URwF8qx0MbtqBDTl7SEDKM8vx1ofEDPi7WnVBUJz4RWUBDZw==","signatures":[{"sig":"MEUCIF9xaWssREJXzGCOxRKDXtAG6yLR4DB0ayXyB4CJVzZxAiEA2O8YP7Z4QP9xYUHkmYcyZRsK1LX3StHg3yL3v5nVMU4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDdlHrIleLzLZFlOxcQCcHQU9PKQ1ol7FOliQJI13UHzQIhANljJYxOQ84UKKp9ifVMEN/WbAD/aMHQDqscBgONJUuA","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@mocanvas%2fsync@4.12.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":392752},"main":"./dist/index.js","type":"module","_from":"file:mocanvas-sync-4.12.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsup","relay":"node scripts/relay.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:51d24bee-9834-492d-b7a6-8cbe5e019237"}},"_resolved":"/tmp/c3882e42bdc226e03fa0aaf6f5278786/mocanvas-sync-4.12.0.tgz","_integrity":"sha512-9YJ2zKT+Vbcfg6QQjOvwATJthfchKVWqh3Wy26URwF8qx0MbtqBDTl7SEDKM8vx1ofEDPi7WnVBUJz4RWUBDZw==","repository":{"url":"git+https://github.com/SYMBIO/mocanvas.git","type":"git","directory":"packages/sync"},"_npmVersion":"12.1.0","description":"Multiplayer for a mocanvas store: record diffs over a transport, plus presence and cursors.","directories":{},"sideEffects":false,"_nodeVersion":"24.21.0","dependencies":{"@mocanvas/state":"4.12.0","@mocanvas/store":"4.12.0","@mocanvas/editor":"4.12.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.18.0","react":"^19.1.0","@types/ws":"^8.5.0","react-dom":"^19.1.0","@types/react":"^19.1.0","@types/react-dom":"^19.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/sync_4.12.0_1790351232148_0.7201469683365929","host":"s3://npm-registry-packages-npm-production"}},"4.12.1":{"name":"@mocanvas/sync","version":"4.12.1","keywords":["multiplayer","collaboration","presence","websocket","sync","mocanvas"],"author":{"name":"Symbio Digital"},"license":"SEE LICENSE IN LICENSE","_id":"@mocanvas/sync@4.12.1","maintainers":[{"name":"von.schau","email":"von.schau@gmail.com"}],"homepage":"https://mocanvas.symbio.agency","bugs":{"url":"https://github.com/SYMBIO/mocanvas/issues"},"dist":{"shasum":"549f2862ccfbe8ec7114c21c85240887fa4c620c","tarball":"https://registry.npmjs.org/@mocanvas/sync/-/sync-4.12.1.tgz","fileCount":14,"integrity":"sha512-BvHUoq6tsHz0RsdGYGHaEgDUNjHxzC6ZKNJCApgfZuQXy6kFd41ggk+/QpTbfsC/zCjWsImvrVb18MepXiXs5g==","signatures":[{"sig":"MEQCIDIho2QQI114fFrv8y6YInrG+wiZxyNveNPQ7oMNPo3PAiAJYzllGIEbiQ1TOzypV4Mm68OQqAcpVKl/cKvoh6hpJA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQC2LiUFwDJwZYAw4djWWK9p0ePSJB/5Q7tU0o06RQkiRgIgTH/1Jrc/FHPJur/FKFHCD8pjd9GYA3rVpSLTGSbfnVY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@mocanvas%2fsync@4.12.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":392752},"main":"./dist/index.js","type":"module","_from":"file:mocanvas-sync-4.12.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsup","relay":"node scripts/relay.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:51d24bee-9834-492d-b7a6-8cbe5e019237"}},"_resolved":"/tmp/1d962d40f903b8224476ce703ff04b26/mocanvas-sync-4.12.1.tgz","_integrity":"sha512-BvHUoq6tsHz0RsdGYGHaEgDUNjHxzC6ZKNJCApgfZuQXy6kFd41ggk+/QpTbfsC/zCjWsImvrVb18MepXiXs5g==","repository":{"url":"git+https://github.com/SYMBIO/mocanvas.git","type":"git","directory":"packages/sync"},"_npmVersion":"12.1.0","description":"Multiplayer for a mocanvas store: record diffs over a transport, plus presence and cursors.","directories":{},"sideEffects":false,"_nodeVersion":"24.21.0","dependencies":{"@mocanvas/state":"4.12.1","@mocanvas/store":"4.12.1","@mocanvas/editor":"4.12.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.18.0","react":"^19.1.0","@types/ws":"^8.5.0","react-dom":"^19.1.0","@types/react":"^19.1.0","@types/react-dom":"^19.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/sync_4.12.1_1790352666817_0.6436511441219148","host":"s3://npm-registry-packages-npm-production"}},"4.12.2":{"name":"@mocanvas/sync","version":"4.12.2","keywords":["multiplayer","collaboration","presence","websocket","sync","mocanvas"],"author":{"name":"Symbio Digital"},"license":"SEE LICENSE IN LICENSE","_id":"@mocanvas/sync@4.12.2","maintainers":[{"name":"von.schau","email":"von.schau@gmail.com"}],"homepage":"https://mocanvas.symbio.agency","bugs":{"url":"https://github.com/SYMBIO/mocanvas/issues"},"dist":{"shasum":"ccc935d84b17f43930224097f92db72cf157053f","tarball":"https://registry.npmjs.org/@mocanvas/sync/-/sync-4.12.2.tgz","fileCount":14,"integrity":"sha512-EpjEEIkwYdwoZVeunpIRGTSD17zV5kv9u8DxXZl6XOXQnF6dfUDzoppME0KS7itr62Lba4ICl9d1kZBnDj4nQw==","signatures":[{"sig":"MEQCIF3lGD+ioeWTccOjQVwXzGlTWHEWin7upKDPr1OL3c98AiBMXJFGmagD6u4HUlcs/MQewhVEeyF8+PBV0U2DKSliig==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCqU6vLz/1OS5eVgfipjYUcsq08eAbzjilS6py9LTMmxgIhAO7dLb6lIZMB3ZwSIlYisuaUZDPf6lnxQr0DVO6LB1/v","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@mocanvas%2fsync@4.12.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":392752},"main":"./dist/index.js","type":"module","_from":"file:mocanvas-sync-4.12.2.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsup","relay":"node scripts/relay.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:51d24bee-9834-492d-b7a6-8cbe5e019237"}},"_resolved":"/tmp/feeeb2ac64dd75d86e44bae45f2cbc9a/mocanvas-sync-4.12.2.tgz","_integrity":"sha512-EpjEEIkwYdwoZVeunpIRGTSD17zV5kv9u8DxXZl6XOXQnF6dfUDzoppME0KS7itr62Lba4ICl9d1kZBnDj4nQw==","repository":{"url":"git+https://github.com/SYMBIO/mocanvas.git","type":"git","directory":"packages/sync"},"_npmVersion":"12.1.0","description":"Multiplayer for a mocanvas store: record diffs over a transport, plus presence and cursors.","directories":{},"sideEffects":false,"_nodeVersion":"24.21.0","dependencies":{"@mocanvas/state":"4.12.2","@mocanvas/store":"4.12.2","@mocanvas/editor":"4.12.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.18.0","react":"^19.1.0","@types/ws":"^8.5.0","react-dom":"^19.1.0","@types/react":"^19.1.0","@types/react-dom":"^19.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/sync_4.12.2_1790354493450_0.032077469563007055","host":"s3://npm-registry-packages-npm-production"}},"4.12.3":{"_id":"@mocanvas/sync@4.12.3","bugs":{"url":"https://github.com/SYMBIO/mocanvas/issues"},"dist":{"shasum":"bf4c62d02d1914e3ab1f81195d3ba5178a395583","tarball":"https://registry.npmjs.org/@mocanvas/sync/-/sync-4.12.3.tgz","fileCount":14,"integrity":"sha512-b1csrrkvmFkLBzimdTIM1opAHjKGo6ZvB48S6+VLTEUFaYcXn59N74hrMLsZDJF73uVlK9s5dxhtdPwBCZzQRA==","signatures":[{"sig":"MEQCIHIpncqThnMJoKN/NzJTy3LPzRz6c7PpMpp+e9XeG4DuAiBKABfmGWxaPalK441gh8TpBOjXghp7Xv4hB03r4ZlUew==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDP6p2Vk8rJaOWjuV/NP+Hu4/YW+TMPcZEtSuGV9W4eLQIgF+3gA4fJMcolGS8LD98eRrAGOIYpWWlFHd99lxiS/yw="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@mocanvas%2fsync@4.12.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":392752},"main":"./dist/index.js","name":"@mocanvas/sync","type":"module","_from":"file:mocanvas-sync-4.12.3.tgz","types":"./dist/index.d.ts","author":{"name":"Symbio Digital"},"engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"license":"SEE LICENSE IN LICENSE","scripts":{"test":"vitest run","build":"tsup","relay":"node scripts/relay.mjs","typecheck":"tsc --noEmit"},"version":"4.12.3","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:51d24bee-9834-492d-b7a6-8cbe5e019237"}},"homepage":"https://mocanvas.symbio.agency","keywords":["multiplayer","collaboration","presence","websocket","sync","mocanvas"],"_resolved":"/tmp/ce80b7558e502ca07d2ee517ca4f3f65/mocanvas-sync-4.12.3.tgz","_integrity":"sha512-b1csrrkvmFkLBzimdTIM1opAHjKGo6ZvB48S6+VLTEUFaYcXn59N74hrMLsZDJF73uVlK9s5dxhtdPwBCZzQRA==","repository":{"url":"git+https://github.com/SYMBIO/mocanvas.git","type":"git","directory":"packages/sync"},"_npmVersion":"12.1.0","description":"Multiplayer for a mocanvas store: record diffs over a transport, plus presence and cursors.","directories":{},"maintainers":[{"name":"von.schau","email":"von.schau@gmail.com"}],"sideEffects":false,"_nodeVersion":"24.21.0","dependencies":{"@mocanvas/state":"4.12.3","@mocanvas/store":"4.12.3","@mocanvas/editor":"4.12.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.18.0","react":"^19.1.0","@types/ws":"^8.5.0","react-dom":"^19.1.0","@types/react":"^19.1.0","@types/react-dom":"^19.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sync_4.12.3_1790355797195_0.5156193550692605"}}},"time":{"created":"2026-09-04T20:49:09.249Z","modified":"2026-09-25T17:03:17.720Z","1.0.0":"2026-09-04T20:49:09.657Z","3.1.1":"2026-09-10T22:27:28.878Z","4.0.0":"2026-09-10T23:03:20.762Z","4.0.1":"2026-09-11T00:12:08.205Z","4.0.2":"2026-09-11T21:25:47.050Z","4.1.0":"2026-09-12T00:18:58.089Z","4.1.1":"2026-09-12T00:54:22.339Z","4.2.0":"2026-09-12T09:09:11.647Z","4.3.0":"2026-09-12T22:24:35.548Z","4.4.0":"2026-09-13T00:41:54.227Z","4.4.1":"2026-09-13T00:49:07.012Z","4.4.2":"2026-09-13T01:16:02.382Z","4.4.3":"2026-09-13T09:29:51.237Z","4.5.0":"2026-09-13T14:45:08.375Z","4.5.1":"2026-09-13T16:51:45.110Z","4.5.2":"2026-09-14T00:00:20.717Z","4.6.0":"2026-09-14T11:55:54.002Z","4.6.1":"2026-09-14T12:12:16.592Z","4.7.0":"2026-09-14T16:26:06.041Z","4.7.1":"2026-09-14T18:46:00.155Z","4.8.0":"2026-09-14T19:36:54.743Z","4.8.1":"2026-09-14T20:07:08.374Z","4.8.2":"2026-09-14T20:23:18.088Z","4.8.3":"2026-09-14T23:17:32.613Z","4.8.5":"2026-09-14T23:37:23.323Z","4.8.6":"2026-09-15T15:25:15.101Z","4.8.7":"2026-09-15T18:59:16.999Z","4.8.8":"2026-09-15T19:53:31.112Z","4.8.9":"2026-09-15T20:24:49.458Z","4.8.10":"2026-09-15T21:10:53.073Z","4.9.0":"2026-09-15T21:13:30.466Z","4.9.1":"2026-09-15T21:43:49.308Z","4.9.2":"2026-09-16T05:57:12.743Z","4.9.3":"2026-09-16T06:11:14.451Z","4.10.0":"2026-09-17T09:42:52.760Z","4.10.1":"2026-09-23T12:58:04.177Z","4.11.0":"2026-09-23T13:06:33.219Z","4.11.1":"2026-09-23T16:33:17.033Z","4.11.2":"2026-09-23T16:51:56.511Z","4.12.0":"2026-09-25T15:47:12.264Z","4.12.1":"2026-09-25T16:11:06.902Z","4.12.2":"2026-09-25T16:41:33.540Z","4.12.3":"2026-09-25T17:03:17.358Z"},"bugs":{"url":"https://github.com/SYMBIO/mocanvas/issues"},"author":{"name":"Symbio Digital"},"license":"SEE LICENSE IN LICENSE","homepage":"https://mocanvas.symbio.agency","keywords":["multiplayer","collaboration","presence","websocket","sync","mocanvas"],"repository":{"url":"git+https://github.com/SYMBIO/mocanvas.git","type":"git","directory":"packages/sync"},"description":"Multiplayer for a mocanvas store: record diffs over a transport, plus presence and cursors.","maintainers":[{"name":"von.schau","email":"von.schau@gmail.com"}],"readme":"# @mocanvas/sync\n\nMultiplayer for a mocanvas store: document changes travel as record diffs,\ncursors and selections travel as presence records. Conflicting edits are merged\nfield by field by a small CRDT (`src/crdt.ts`), so two people editing different\nproperties of one shape both keep their work and every replica converges.\n\nPart of mocanvas; the canvas itself is `@mocanvas/mocanvas`.\n\n## Install\n\n```bash\nnpm install @mocanvas/sync react\n```\n\n`react` (>= 18) is a peer dependency, used by `useSync` and\n`<CollaboratorCursors />`.\n\n## Quick start\n\n```ts\nimport { createSyncClient, createBroadcastChannelTransport } from \"@mocanvas/sync\"\n\nconst client = createSyncClient({\n  store: editor.store,\n  roomId: \"my-doc\",\n  transport: createBroadcastChannelTransport(\"my-doc\"),\n  presence: { editor },\n})\nclient.connect()\n```\n\n`getStatus()` returns a signal holding `\"offline\" | \"connecting\" | \"online\"`,\nso it can be read from a reactor or with `useValue`. `dispose()` disconnects\nand closes the transport.\n\n## Integration\n\nThree lines in an app that already renders `<Mocanvas>`:\n\n```tsx\nconst { status } = useSync(editor, { roomId, transport: () => createBroadcastChannelTransport(roomId) })\n// ...inside <Mocanvas onMount={setEditor}>:\n{editor ? <CollaboratorCursors editor={editor} /> : null}\n```\n\n`CollaboratorCursors` draws every other person's pointer, name chip and\nselection outlines in screen space. It positions itself absolutely, so it goes\nanywhere inside the canvas container.\n\nThat is the whole integration: nothing above pins a page, and nothing names a\nperson. Two things make it work, and both are worth knowing because both used\nto have to be worked around by hand.\n\n### The page both replicas start on\n\nA blank document's first page has a **fixed id** — `DEFAULT_PAGE_ID`, i.e.\n`page:page` — so two `<Mocanvas />`s that each built their own store start on\nthe *same* page. Shapes drawn in one tab land on the page the other is looking\nat, and `getCollaboratorsOnCurrentPage()` has something to return. (Creating\nthe same record id on two peers is a field-by-field merge, and the two bodies\nare identical, so there is nothing to settle.) Pages created *after* that get\nrandom ids, so two people genuinely on different pages of one document stay\nindependent.\n\nWhen a replica does end up alone on its page — someone moved to another page,\nor two apps built their documents separately — the client says so once, in\ndevelopment:\n\n> mocanvas/sync: this replica is on page `page:…`, and none of the 1 peer(s) in\n> room \"…\" is — they are on `page:…`. Their cursors and their shapes will not be\n> visible here.\n\nEverything is still `online` in that state, every message still arrives, and\nnothing is drawn. It is the failure with the least evidence, which is why it\ngets a sentence instead of silence.\n\n### A tab is not a person\n\nPresence is per **editor instance**, not per user. `editor.user.getId()` is per\n*browser* — the same in every tab, and the same on a phone and a laptop signed\nin as one person — so a person with three tabs open would otherwise discard\ntheir own other tabs as themselves. The identity that decides is\n`editor.getInstancePresenceId()`: every editor mints one, this package\npublishes the tab's presence record under it, and `editor.getCollaborators()`\ndrops that one record and no other.\n\nSo two tabs of one browser are two collaborators — which is the entire point of\n`createBroadcastChannelTransport` — and an app does not have to invent a fake\nper-tab identity to make its own demo work.\n\n## Protocol\n\nEvery message is one JSON object on the wire.\n\n| message    | fields                       | meaning                                              |\n| ---------- | ---------------------------- | ---------------------------------------------------- |\n| `hello`    | `clientId`, `version`        | I joined. Established peers answer with a `snapshot`. |\n| `snapshot` | `records`, `state`           | Every document record, plus the sender's CRDT stamps. |\n| `diff`     | `clientId`, `seq`, `diff`    | One squashed store diff, stamped field by field.      |\n| `presence` | `clientId`, `record`         | The sender's `instance_presence` record.              |\n| `bye`      | `clientId`                   | I am leaving; drop my presence.                       |\n\n`encodeMessage` stamps `version: PROTOCOL_VERSION` (currently 3) onto every\nmessage. `decodeMessage` returns `null` for anything malformed and a synthetic\n`{ type: \"unsupported\", version }` for a message from another protocol version,\nso a peer on a different build is reported through `onError` rather than\nhalf-parsed. Nothing on the wire can crash this client.\n\n- Outgoing diffs come from `store.listen(cb, { source: \"user\", scope: \"document\" })`,\n  so nothing applied from a peer is ever echoed back and nothing in `session`\n  or `presence` scope is persisted into the document stream. Each one is\n  stamped by the CRDT before it goes out, whether or not the transport is up.\n- Incoming messages are merged field by field and only the fields that won are\n  applied, inside `store.mergeRemoteChanges(() => store.applyDiff(winning))`,\n  which marks them `source: \"remote\"`: they do not enter the local undo stack\n  and do not re-broadcast.\n- A replica with **no stamps at all** — a tab that has just loaded and has not\n  been edited — takes the first `snapshot` it is offered whole, records and\n  stamps together, and sends nothing before that. One stamp is enough to make\n  it merge instead: a replica with work of its own never has that work replaced\n  by a peer's body.\n- Local changes are stamped by the store listener, which is wired up when the\n  client is built and stays wired until `dispose()`. An edit made before\n  `connect()`, or after `disconnect()`, is therefore stamped **when it happens**\n  and goes out on the next connection. It is not silently unstamped work that\n  would lose to every stamped write in the room.\n- On a reconnect the client re-sends `hello` and its own snapshot, so work done\n  while the transport was down flows both ways.\n- If the store rewrites a merged record — a validator clamping a value, a side\n  effect touching another record — that rewrite is stamped as a local write and\n  broadcast. Otherwise it would exist on one replica only, since changes made\n  inside `mergeRemoteChanges` are reported as `remote` and never leave.\n- Presence records are derived from the editor's camera,\n  `inputs.currentPagePoint` and selection, throttled to at most 30 Hz, and\n  re-sent on a heartbeat. A collaborator is dropped on `bye` or after 10s of\n  silence. The record is keyed on the sending editor's instance id (see\n  \"A tab is not a person\" above), so one person's tabs do not overwrite each\n  other's presence.\n- A `hello` makes every established peer **re-announce** its presence, even\n  when its own record has not changed — what changed is who is listening. A\n  peer that has been sitting still since before you joined is therefore visible\n  immediately rather than at its next heartbeat.\n\n## Conflict policy: a CRDT over the record fields\n\nEvery leaf field of every record is its own last-writer-wins register. A local\nchange carries one Lamport stamp — `{ lamport, client }` — and a field is\noverwritten only when the incoming stamp is greater than the one already held\nfor that exact path. Equal `lamport` values are broken by comparing the client\nids, so the comparison is a total order and both sides of a race reach the same\nanswer from the same pair. Paths are dotted: `x`, `props.w`, `meta.notes.title`.\n\nA stamp covers a **subtree**, not just a leaf. Writing `meta` — setting it, or\ndeleting the key — dominates `meta.a`: a claim loses to any stamp at or above\nits own path, and a write that drops a subtree keeps the descendants stamped\nlater than itself. Comparing `meta` and `meta.a` as unrelated registers is how\n\"delete the key\" racing \"edit the key's child\" ends up different on each side.\n\nThe result is that merging is **idempotent** — the same message twice changes\nnothing the second time — and **commutative**: two messages in either order\nreach the same state, because the outcome per path is the maximum stamp and a\nmaximum does not care about arrival order. Replicas converge no matter how the\ntransport reorders or duplicates messages. `src/fuzz.test.ts` is the evidence:\na seeded generator builds random schedules of creates, nested edits, deletes,\nre-creates, reordered, duplicated and dropped messages, disconnects, reconnects\nand snapshot joins over an in-memory network, then quiesces and demands that\nevery replica's document be byte-identical under a key-sorted serialisation.\n\nWhat that means in practice:\n\n- Two people dragging **different** shapes: fine, as before.\n- Two people editing **different fields of the same shape** — one moves it while\n  the other recolours it — now keep both edits. This is the case the old\n  per-record policy lost.\n- Two people editing the **same** field pick the same winner on every replica.\n  The loser's value is gone; there is no merging inside a single value.\n- **Creating** the same record id on two peers merges field by field, exactly\n  like an edit.\n- **Deleting** leaves a stamped tombstone rather than a hole, so an older edit\n  arriving late cannot resurrect the record. A delete beats a concurrent edit\n  only when its stamp is the greater one; an edit with a greater stamp keeps\n  the record alive.\n- **A record kept alive by an edit that outranks a delete comes back whole.**\n  The tombstone takes the provenance of every field it outranks, so the fields\n  written *before* the delete have nothing left to settle them and each replica\n  would otherwise keep whatever leftover it happened to hold. The replica that\n  keeps the record re-claims its whole body under a fresh stamp and sends it,\n  and that body — not a leftover — is what every replica ends up with.\n- Peers that were offline while others edited keep their work: on reconnect the\n  two sides exchange state and merge both ways. That holds for a client that\n  was `disconnect()`ed as much as for one whose socket dropped.\n\n### What is one register, and what that costs\n\n- **Arrays are opaque.** `props.points`, `selectedShapeIds` and every other\n  array is one register holding the whole array, not one register per element.\n  Two concurrent edits to one array pick a winner instead of merging. Splitting\n  an array into per-element registers needs element identity, which the record\n  data does not carry, and would produce interleaved nonsense — a half-merged\n  draw stroke is worse than one of the two strokes.\n- **The fractional `index` is one register too.** A concurrent reorder of the\n  same shape therefore lands on one of the two orders deterministically rather\n  than merging them. Two people reordering *different* shapes is fine: those\n  are different records.\n- **An object is recursed into**, so `meta.a` and `meta.b` are separate\n  registers, but an empty object is itself a leaf. Two replicas that each add a\n  different key to one object agree on the keys and their values; the order the\n  keys sit in the JSON may differ, and object key order is not part of the value.\n  Tests compare documents key-sorted for that reason, and only for that reason.\n- **A record body is one register of its own.** A put carries `base`: the stamp\n  its whole record was the sender's current view as of. A receiver that has no\n  stamp at all for some path — because it never saw the record created, only an\n  edit to one of its fields — takes that path from the body carrying the\n  greatest `base`, so two such receivers cannot settle on different bodies.\n\n### Tombstones are bounded\n\nA tombstone for a record that is gone is kept for one hour, and at most 5000 of\nthem are kept at once (`tombstoneMaxAgeMs`, `tombstoneLimit` on\n`createSyncClient`); the oldest go first. Once a tombstone has been collected,\nan edit older than it has nothing left to lose against and **resurrects the\nrecord**. The bound is therefore a statement about how long a peer may be\npartitioned: within it, deletes are safe against arbitrarily late messages;\npast it, a straggler's edit can bring a deleted record back. Live records keep\ntheir field stamps for as long as the document holds them.\n\n### What it is not, and what it does not promise\n\nThere is still no operational transform, no server-authoritative log, and no\ncharacter-level text merge: concurrent edits to one text field pick a winner\nrather than interleaving. The store remains the source of truth — the CRDT owns\nstamps, never values — so nothing here needs Yjs or Automerge, and adding one\nwould mean replacing the store rather than sitting under it.\n\nFour limits are real, and none of them is a bug to be fixed later:\n\n- **Two writes to one field cannot both survive.** The register holds one value\n  and the greater stamp takes it. Same for the interior of an array or a string:\n  there is no identity inside a value to merge along.\n- **A message that is never delivered is not merged.** A put carries stamps for\n  the paths it claims, not for the whole record, so a replica that missed a\n  record's creation and then sees an edit to one field adopts the rest of that\n  body without provenance. It is repaired by the next snapshot exchange, which\n  every `hello`, `connect` and reconnect triggers, from any peer that does hold\n  those stamps. Between the loss and that exchange, it can be stale.\n- **A replica that has never connected starts its clock at zero.** Its offline\n  edits are stamped when they happen, so they are real writes and its own new\n  records always survive; but an edit to a field the room has already written\n  several times can sort below what is there. A replica that has been in the\n  room and comes back has observed the room's clock and does not have this\n  problem, which is the case the offline requirement is about.\n- **A side effect that is not a function of its inputs cannot converge.** Store\n  rewrites are stamped and broadcast (see the protocol notes above), so one that\n  rewrites the same way everywhere settles in a single round: peers apply a\n  value they already hold and produce nothing further. One that rewrites\n  differently on each replica has no fixed point, here or in any other design.\n\n## Transports\n\n```ts\ncreateBroadcastChannelTransport(roomId)              // tabs of one browser, no server\ncreateWebSocketTransport(url, { reconnect: true })   // a relay; exponential backoff with jitter\ncreateMemoryTransportPair()                          // two peers in one process (tests)\ncreateMemoryHub()                                    // n peers in one process (tests)\n```\n\nA `Transport` is `{ send, onMessage, onOpen?, onClose?, close }` and owns its\nown serialization and reconnection. Anything implementing that interface works\n— a WebRTC data channel, a shared worker, a mock.\n\n## Running the relay\n\nThe relay forwards messages between the sockets in a room and keeps no state,\nso restarting it is harmless: peers re-share the document with\n`hello`/`snapshot`. The room is the URL path.\n\n```sh\npnpm --filter @mocanvas/sync relay        # ws://localhost:5858/<room>\nPORT=9000 pnpm --filter @mocanvas/sync relay\n```\n\n```ts\ncreateWebSocketTransport(`ws://localhost:5858/${roomId}`, { reconnect: true })\n```\n\nThe relay script ships in the package but `ws` does not — it is a\ndevDependency here, because the relay is a development tool and not part of\nthe client. Install `ws` yourself to run it outside this repository.\n\n## Tests\n\n```sh\npnpm --filter @mocanvas/sync test\n```\n\n## License\n\n**Source-available, not open source.** Free to use for:\n\n- personal, non-commercial projects;\n- non-profit organisations;\n- development, evaluation, testing and staging — including inside a for-profit\n  company, so you can try it and build against it before committing;\n- teaching and academic research.\n\n**Shipping it in a commercial product, service or website needs a written\nagreement with us.** That includes anything sold, anything that earns revenue\ndirectly or through advertising, and internal tools running a for-profit\nbusiness.\n\nTo arrange one, or if you are unsure which side of the line you are on, write to\n**mocanvas@symbio.agency** — we would rather answer the question than have you\nguess.\n\nThe full terms are in `LICENSE`, shipped in this package.\n","readmeFilename":"README.md"}