
Security News
Feross on TBPN: How North Korea Hijacked Axios
Socket CEO Feross Aboukhadijeh breaks down how North Korea hijacked Axios and what it means for the future of software supply chain security.
@sovereignbase/convergent-replicated-struct
Advanced tools
State-based CRDT for fixed-key object structs with per-field overwrite tracking.
State-based CRDT for fixed-key object structs with per-field overwrite tracking.
EventTarget, CustomEvent, structuredClone.read(), values(), entries(), snapshots, deltas, and change payloads are detached with structuredClone.acknowledge() and garbageCollect() APIs for overwrite-history compaction.npm install @sovereignbase/convergent-replicated-struct
# or
pnpm add @sovereignbase/convergent-replicated-struct
# or
yarn add @sovereignbase/convergent-replicated-struct
# or
bun add @sovereignbase/convergent-replicated-struct
# or
deno add jsr:@sovereignbase/convergent-replicated-struct
# or
vlt install jsr:@sovereignbase/convergent-replicated-struct
import { OOStruct } from '@sovereignbase/convergent-replicated-struct'
type TodoStruct = {
title: string
count: number
meta: { done: boolean }
tags: string[]
}
const alice = OOStruct.create<TodoStruct>({
title: '',
count: 0,
meta: { done: false },
tags: [],
})
const bob = OOStruct.create<TodoStruct>({
title: '',
count: 0,
meta: { done: false },
tags: [],
})
alice.addEventListener('delta', (event) => bob.merge(event.detail))
alice.update('title', 'hello world')
alice.update('meta', { done: true })
console.log(bob.read('title')) // "hello world"
console.log(bob.read('meta')) // { done: true }
import {
OOStruct,
type OOStructSnapshot,
} from '@sovereignbase/convergent-replicated-struct'
type DraftStruct = {
title: string
count: number
}
const source = new OOStruct<DraftStruct>({
title: '',
count: 0,
})
let snapshot!: OOStructSnapshot<DraftStruct>
source.addEventListener(
'snapshot',
(event) => {
snapshot = event.detail
},
{ once: true }
)
source.update('title', 'draft')
source.snapshot()
const restored = OOStruct.create<DraftStruct>(
{
title: '',
count: 0,
},
snapshot
)
console.log(restored.entries()) // [['title', 'draft'], ['count', 0]]
import { OOStruct } from '@sovereignbase/convergent-replicated-struct'
const replica = new OOStruct({
name: '',
count: 0,
})
replica.addEventListener('delta', (event) => {
console.log('delta', event.detail)
})
replica.addEventListener('change', (event) => {
console.log('change', event.detail)
})
replica.addEventListener('ack', (event) => {
console.log('ack', event.detail)
})
replica.addEventListener('snapshot', (event) => {
console.log('snapshot', event.detail)
})
import {
OOStruct,
type OOStructAck,
} from '@sovereignbase/convergent-replicated-struct'
type CounterStruct = {
title: string
count: number
}
const left = new OOStruct<CounterStruct>({
title: '',
count: 0,
})
const right = new OOStruct<CounterStruct>({
title: '',
count: 0,
})
const frontiers: Array<OOStructAck<CounterStruct>> = []
left.addEventListener(
'ack',
(event) => {
frontiers.push(event.detail)
},
{ once: true }
)
right.addEventListener(
'ack',
(event) => {
frontiers.push(event.detail)
},
{ once: true }
)
left.acknowledge()
right.acknowledge()
left.garbageCollect(frontiers)
right.garbageCollect(frontiers)
Local API misuse throws OOStructError with stable error codes:
DEFAULTS_NOT_CLONEABLEVALUE_NOT_CLONEABLEVALUE_TYPE_MISMATCHHydration and merge are ingress-tolerant: malformed top-level payloads, unknown keys, malformed field entries, invalid UUIDs, invalid overwrite members, and mismatched runtime kinds are ignored instead of throwing.
structuredClone-compatible.read(), values(), and entries() return detached clones.delta, change, and snapshot event payloads are detached from live state.update() stores a cloned value, so later caller-side mutation does not mutate replica state through shared references.garbageCollect() compacts overwritten identifiers that are below the smallest acknowledgement frontier for a key while preserving the active predecessor link.node --test for unit and integration suites.c8 with 100% statements / branches / functions / lines on built dist/**/*.js.npm run test passes on Node 22.14.0 (win32 x64).How it was run:
node benchmark/bench.js
Environment: Node 22.14.0 (win32 x64)
| Benchmark | Result |
|---|---|
| constructor empty | 44,359 ops/s (2254.3 ms) |
| constructor hydrate x64 | 19,610 ops/s (255.0 ms) |
| constructor hydrate x256 | 8,088 ops/s (247.3 ms) |
| constructor hydrate x1024 | 1,724 ops/s (290.0 ms) |
| create() empty | 49,874 ops/s (2005.1 ms) |
| create() hydrate x256 | 6,886 ops/s (290.4 ms) |
| read primitive | 846,289 ops/s (236.3 ms) |
| read object | 298,983 ops/s (668.9 ms) |
| read array | 278,710 ops/s (717.6 ms) |
| keys() | 32,349,896 ops/s (6.2 ms) |
| values() | 103,489 ops/s (966.3 ms) |
| entries() | 110,300 ops/s (906.6 ms) |
| snapshot() | 65,513 ops/s (305.3 ms) |
| acknowledge() | 536,890 ops/s (93.1 ms) |
| update string | 29,547 ops/s (1692.2 ms) |
| update number | 30,591 ops/s (1634.5 ms) |
| update object | 22,114 ops/s (2261.0 ms) |
| update array | 24,763 ops/s (2019.1 ms) |
| delete(key) | 8,352 ops/s (5986.8 ms) |
| delete() reset all | 6,836 ops/s (2925.5 ms) |
| merge direct successor | 32,541 ops/s (1536.5 ms) |
| merge stale conflict | 30,995 ops/s (645.3 ms) |
| merge hydrate snapshot x256 | 5,748 ops/s (869.9 ms) |
| merge noop duplicate | 7,576 ops/s (6600.1 ms) |
| garbageCollect() x512 history | 3,111 ops/s (1607.0 ms) |
| add/remove listener roundtrip | 49,005 ops/s (4081.2 ms) |
| update with listeners | 25,120 ops/s (1194.3 ms) |
| merge with listeners | 31,649 ops/s (631.9 ms) |
Results vary by machine, runtime version, and payload shape.
Apache-2.0
FAQs
State-based CRDT for fixed-key object structs with per-field overwrite tracking.
We found that @sovereignbase/convergent-replicated-struct demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Socket CEO Feross Aboukhadijeh breaks down how North Korea hijacked Axios and what it means for the future of software supply chain security.

Security News
OpenSSF has issued a high-severity advisory warning open source developers of an active Slack-based campaign using impersonation to deliver malware.

Research
/Security News
Malicious packages published to npm, PyPI, Go Modules, crates.io, and Packagist impersonate developer tooling to fetch staged malware, steal credentials and wallets, and enable remote access.