@earendil-works/chord 1.3.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +54 -0
- package/README.md +129 -10
- package/dist/cell.d.ts +7 -7
- package/dist/cell.d.ts.map +1 -1
- package/dist/cell.js.map +1 -1
- package/dist/context/index.d.ts +8 -0
- package/dist/context/index.d.ts.map +1 -1
- package/dist/context/index.js +15 -0
- package/dist/context/index.js.map +1 -1
- package/dist/contract.d.ts +51 -52
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js +19 -24
- package/dist/contract.js.map +1 -1
- package/dist/delta/apply-immutable-trusted.js +3 -4
- package/dist/delta/apply-immutable-trusted.js.map +1 -1
- package/dist/delta/diff.d.ts.map +1 -1
- package/dist/delta/diff.js +5 -3
- package/dist/delta/diff.js.map +1 -1
- package/dist/delta/index.d.ts +9 -1
- package/dist/delta/index.d.ts.map +1 -1
- package/dist/delta/index.js +15 -11
- package/dist/delta/index.js.map +1 -1
- package/dist/delta/pending.d.ts +36 -0
- package/dist/delta/pending.d.ts.map +1 -0
- package/dist/delta/pending.js +143 -0
- package/dist/delta/pending.js.map +1 -0
- package/dist/delta/tracker.d.ts +12 -0
- package/dist/delta/tracker.d.ts.map +1 -1
- package/dist/delta/tracker.js +109 -39
- package/dist/delta/tracker.js.map +1 -1
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +9 -7
- package/dist/host.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/next/contracts/accepts.d.ts +81 -0
- package/dist/next/contracts/accepts.d.ts.map +1 -0
- package/dist/next/contracts/accepts.js +123 -0
- package/dist/next/contracts/accepts.js.map +1 -0
- package/dist/next/contracts/contract.d.ts +121 -0
- package/dist/next/contracts/contract.d.ts.map +1 -0
- package/dist/next/contracts/contract.js +50 -0
- package/dist/next/contracts/contract.js.map +1 -0
- package/dist/next/contracts/declare.d.ts +107 -0
- package/dist/next/contracts/declare.d.ts.map +1 -0
- package/dist/next/contracts/declare.js +136 -0
- package/dist/next/contracts/declare.js.map +1 -0
- package/dist/next/contracts/evolve.d.ts +92 -0
- package/dist/next/contracts/evolve.d.ts.map +1 -0
- package/dist/next/contracts/evolve.js +179 -0
- package/dist/next/contracts/evolve.js.map +1 -0
- package/dist/next/contracts/fingerprint.d.ts +16 -0
- package/dist/next/contracts/fingerprint.d.ts.map +1 -0
- package/dist/next/contracts/fingerprint.js +50 -0
- package/dist/next/contracts/fingerprint.js.map +1 -0
- package/dist/next/contracts/history.d.ts +71 -0
- package/dist/next/contracts/history.d.ts.map +1 -0
- package/dist/next/contracts/history.js +3 -0
- package/dist/next/contracts/history.js.map +1 -0
- package/dist/next/contracts/host-kind.d.ts +40 -0
- package/dist/next/contracts/host-kind.d.ts.map +1 -0
- package/dist/next/contracts/host-kind.js +37 -0
- package/dist/next/contracts/host-kind.js.map +1 -0
- package/dist/next/contracts/index.d.ts +7 -0
- package/dist/next/contracts/index.d.ts.map +1 -0
- package/dist/next/contracts/index.js +6 -0
- package/dist/next/contracts/index.js.map +1 -0
- package/dist/next/contracts/internal.d.ts +10 -0
- package/dist/next/contracts/internal.d.ts.map +1 -0
- package/dist/next/contracts/internal.js +9 -0
- package/dist/next/contracts/internal.js.map +1 -0
- package/dist/next/contracts/names.d.ts +3 -0
- package/dist/next/contracts/names.d.ts.map +1 -0
- package/dist/next/contracts/names.js +13 -0
- package/dist/next/contracts/names.js.map +1 -0
- package/dist/next/contracts/params.d.ts +28 -0
- package/dist/next/contracts/params.d.ts.map +1 -0
- package/dist/next/contracts/params.js +50 -0
- package/dist/next/contracts/params.js.map +1 -0
- package/dist/next/contracts/schema.d.ts +102 -0
- package/dist/next/contracts/schema.d.ts.map +1 -0
- package/dist/next/contracts/schema.js +103 -0
- package/dist/next/contracts/schema.js.map +1 -0
- package/dist/next/contracts/snapshot.d.ts +16 -0
- package/dist/next/contracts/snapshot.d.ts.map +1 -0
- package/dist/next/contracts/snapshot.js +167 -0
- package/dist/next/contracts/snapshot.js.map +1 -0
- package/dist/next/data/args.d.ts +50 -0
- package/dist/next/data/args.d.ts.map +1 -0
- package/dist/next/data/args.js +83 -0
- package/dist/next/data/args.js.map +1 -0
- package/dist/next/data/errors.d.ts +73 -0
- package/dist/next/data/errors.d.ts.map +1 -0
- package/dist/next/data/errors.js +107 -0
- package/dist/next/data/errors.js.map +1 -0
- package/dist/next/data/failure.d.ts +26 -0
- package/dist/next/data/failure.d.ts.map +1 -0
- package/dist/next/data/failure.js +72 -0
- package/dist/next/data/failure.js.map +1 -0
- package/dist/next/data/index.d.ts +4 -0
- package/dist/next/data/index.d.ts.map +1 -0
- package/dist/next/data/index.js +4 -0
- package/dist/next/data/index.js.map +1 -0
- package/dist/next/data/internal.d.ts +7 -0
- package/dist/next/data/internal.d.ts.map +1 -0
- package/dist/next/data/internal.js +8 -0
- package/dist/next/data/internal.js.map +1 -0
- package/dist/next/data/params.d.ts +20 -0
- package/dist/next/data/params.d.ts.map +1 -0
- package/dist/next/data/params.js +31 -0
- package/dist/next/data/params.js.map +1 -0
- package/dist/next/data/principal.d.ts +17 -0
- package/dist/next/data/principal.d.ts.map +1 -0
- package/dist/next/data/principal.js +41 -0
- package/dist/next/data/principal.js.map +1 -0
- package/dist/next/data/validator.d.ts +12 -0
- package/dist/next/data/validator.d.ts.map +1 -0
- package/dist/next/data/validator.js +34 -0
- package/dist/next/data/validator.js.map +1 -0
- package/dist/next/documents/address-source.d.ts +20 -0
- package/dist/next/documents/address-source.d.ts.map +1 -0
- package/dist/next/documents/address-source.js +44 -0
- package/dist/next/documents/address-source.js.map +1 -0
- package/dist/next/documents/definition.d.ts +84 -0
- package/dist/next/documents/definition.d.ts.map +1 -0
- package/dist/next/documents/definition.js +73 -0
- package/dist/next/documents/definition.js.map +1 -0
- package/dist/next/documents/documents.d.ts +106 -0
- package/dist/next/documents/documents.d.ts.map +1 -0
- package/dist/next/documents/documents.js +224 -0
- package/dist/next/documents/documents.js.map +1 -0
- package/dist/next/documents/fence.d.ts +9 -0
- package/dist/next/documents/fence.d.ts.map +1 -0
- package/dist/next/documents/fence.js +15 -0
- package/dist/next/documents/fence.js.map +1 -0
- package/dist/next/documents/handles.d.ts +76 -0
- package/dist/next/documents/handles.d.ts.map +1 -0
- package/dist/next/documents/handles.js +66 -0
- package/dist/next/documents/handles.js.map +1 -0
- package/dist/next/documents/index.d.ts +4 -0
- package/dist/next/documents/index.d.ts.map +1 -0
- package/dist/next/documents/index.js +3 -0
- package/dist/next/documents/index.js.map +1 -0
- package/dist/next/documents/internal.d.ts +9 -0
- package/dist/next/documents/internal.d.ts.map +1 -0
- package/dist/next/documents/internal.js +9 -0
- package/dist/next/documents/internal.js.map +1 -0
- package/dist/next/documents/keyed-slot.d.ts +103 -0
- package/dist/next/documents/keyed-slot.d.ts.map +1 -0
- package/dist/next/documents/keyed-slot.js +395 -0
- package/dist/next/documents/keyed-slot.js.map +1 -0
- package/dist/next/documents/line.d.ts +7 -0
- package/dist/next/documents/line.d.ts.map +1 -0
- package/dist/next/documents/line.js +14 -0
- package/dist/next/documents/line.js.map +1 -0
- package/dist/next/documents/persistence.d.ts +104 -0
- package/dist/next/documents/persistence.d.ts.map +1 -0
- package/dist/next/documents/persistence.js +128 -0
- package/dist/next/documents/persistence.js.map +1 -0
- package/dist/next/documents/residency.d.ts +31 -0
- package/dist/next/documents/residency.d.ts.map +1 -0
- package/dist/next/documents/residency.js +93 -0
- package/dist/next/documents/residency.js.map +1 -0
- package/dist/next/documents/slot.d.ts +109 -0
- package/dist/next/documents/slot.d.ts.map +1 -0
- package/dist/next/documents/slot.js +181 -0
- package/dist/next/documents/slot.js.map +1 -0
- package/dist/next/documents/transaction.d.ts +133 -0
- package/dist/next/documents/transaction.d.ts.map +1 -0
- package/dist/next/documents/transaction.js +409 -0
- package/dist/next/documents/transaction.js.map +1 -0
- package/dist/next/host/activity.d.ts +31 -0
- package/dist/next/host/activity.d.ts.map +1 -0
- package/dist/next/host/activity.js +40 -0
- package/dist/next/host/activity.js.map +1 -0
- package/dist/next/host/adapted.d.ts +49 -0
- package/dist/next/host/adapted.d.ts.map +1 -0
- package/dist/next/host/adapted.js +214 -0
- package/dist/next/host/adapted.js.map +1 -0
- package/dist/next/host/attempt.d.ts +278 -0
- package/dist/next/host/attempt.d.ts.map +1 -0
- package/dist/next/host/attempt.js +1072 -0
- package/dist/next/host/attempt.js.map +1 -0
- package/dist/next/host/backoff.d.ts +29 -0
- package/dist/next/host/backoff.d.ts.map +1 -0
- package/dist/next/host/backoff.js +69 -0
- package/dist/next/host/backoff.js.map +1 -0
- package/dist/next/host/ctx.d.ts +47 -0
- package/dist/next/host/ctx.d.ts.map +1 -0
- package/dist/next/host/ctx.js +108 -0
- package/dist/next/host/ctx.js.map +1 -0
- package/dist/next/host/deadline.d.ts +12 -0
- package/dist/next/host/deadline.d.ts.map +1 -0
- package/dist/next/host/deadline.js +40 -0
- package/dist/next/host/deadline.js.map +1 -0
- package/dist/next/host/dependencies.d.ts +65 -0
- package/dist/next/host/dependencies.d.ts.map +1 -0
- package/dist/next/host/dependencies.js +115 -0
- package/dist/next/host/dependencies.js.map +1 -0
- package/dist/next/host/destination.d.ts +48 -0
- package/dist/next/host/destination.d.ts.map +1 -0
- package/dist/next/host/destination.js +101 -0
- package/dist/next/host/destination.js.map +1 -0
- package/dist/next/host/facet.d.ts +79 -0
- package/dist/next/host/facet.d.ts.map +1 -0
- package/dist/next/host/facet.js +55 -0
- package/dist/next/host/facet.js.map +1 -0
- package/dist/next/host/follow.d.ts +52 -0
- package/dist/next/host/follow.d.ts.map +1 -0
- package/dist/next/host/follow.js +207 -0
- package/dist/next/host/follow.js.map +1 -0
- package/dist/next/host/host.d.ts +495 -0
- package/dist/next/host/host.d.ts.map +1 -0
- package/dist/next/host/host.js +1075 -0
- package/dist/next/host/host.js.map +1 -0
- package/dist/next/host/index.d.ts +17 -0
- package/dist/next/host/index.d.ts.map +1 -0
- package/dist/next/host/index.js +6 -0
- package/dist/next/host/index.js.map +1 -0
- package/dist/next/host/internal.d.ts +10 -0
- package/dist/next/host/internal.d.ts.map +1 -0
- package/dist/next/host/internal.js +8 -0
- package/dist/next/host/internal.js.map +1 -0
- package/dist/next/host/members.d.ts +50 -0
- package/dist/next/host/members.d.ts.map +1 -0
- package/dist/next/host/members.js +107 -0
- package/dist/next/host/members.js.map +1 -0
- package/dist/next/host/native.d.ts +55 -0
- package/dist/next/host/native.d.ts.map +1 -0
- package/dist/next/host/native.js +92 -0
- package/dist/next/host/native.js.map +1 -0
- package/dist/next/host/object.d.ts +290 -0
- package/dist/next/host/object.d.ts.map +1 -0
- package/dist/next/host/object.js +1127 -0
- package/dist/next/host/object.js.map +1 -0
- package/dist/next/host/parked.d.ts +23 -0
- package/dist/next/host/parked.d.ts.map +1 -0
- package/dist/next/host/parked.js +79 -0
- package/dist/next/host/parked.js.map +1 -0
- package/dist/next/host/presence.d.ts +34 -0
- package/dist/next/host/presence.d.ts.map +1 -0
- package/dist/next/host/presence.js +117 -0
- package/dist/next/host/presence.js.map +1 -0
- package/dist/next/host/ref-state.d.ts +53 -0
- package/dist/next/host/ref-state.d.ts.map +1 -0
- package/dist/next/host/ref-state.js +83 -0
- package/dist/next/host/ref-state.js.map +1 -0
- package/dist/next/host/reference-keys.d.ts +36 -0
- package/dist/next/host/reference-keys.d.ts.map +1 -0
- package/dist/next/host/reference-keys.js +168 -0
- package/dist/next/host/reference-keys.js.map +1 -0
- package/dist/next/host/reference-source.d.ts +65 -0
- package/dist/next/host/reference-source.d.ts.map +1 -0
- package/dist/next/host/reference-source.js +285 -0
- package/dist/next/host/reference-source.js.map +1 -0
- package/dist/next/host/reference.d.ts +308 -0
- package/dist/next/host/reference.d.ts.map +1 -0
- package/dist/next/host/reference.js +775 -0
- package/dist/next/host/reference.js.map +1 -0
- package/dist/next/host/retry-on.d.ts +28 -0
- package/dist/next/host/retry-on.d.ts.map +1 -0
- package/dist/next/host/retry-on.js +52 -0
- package/dist/next/host/retry-on.js.map +1 -0
- package/dist/next/host/revocation.d.ts +16 -0
- package/dist/next/host/revocation.d.ts.map +1 -0
- package/dist/next/host/revocation.js +27 -0
- package/dist/next/host/revocation.js.map +1 -0
- package/dist/next/host/root.d.ts +27 -0
- package/dist/next/host/root.d.ts.map +1 -0
- package/dist/next/host/root.js +68 -0
- package/dist/next/host/root.js.map +1 -0
- package/dist/next/host/route.d.ts +64 -0
- package/dist/next/host/route.d.ts.map +1 -0
- package/dist/next/host/route.js +190 -0
- package/dist/next/host/route.js.map +1 -0
- package/dist/next/host/routines.d.ts +76 -0
- package/dist/next/host/routines.d.ts.map +1 -0
- package/dist/next/host/routines.js +350 -0
- package/dist/next/host/routines.js.map +1 -0
- package/dist/next/host/sleep.d.ts +9 -0
- package/dist/next/host/sleep.d.ts.map +1 -0
- package/dist/next/host/sleep.js +40 -0
- package/dist/next/host/sleep.js.map +1 -0
- package/dist/next/host/staging.d.ts +94 -0
- package/dist/next/host/staging.d.ts.map +1 -0
- package/dist/next/host/staging.js +302 -0
- package/dist/next/host/staging.js.map +1 -0
- package/dist/next/host/unbound.d.ts +30 -0
- package/dist/next/host/unbound.d.ts.map +1 -0
- package/dist/next/host/unbound.js +67 -0
- package/dist/next/host/unbound.js.map +1 -0
- package/dist/next/host/uuid.d.ts +3 -0
- package/dist/next/host/uuid.d.ts.map +1 -0
- package/dist/next/host/uuid.js +38 -0
- package/dist/next/host/uuid.js.map +1 -0
- package/dist/next/index.d.ts +28 -0
- package/dist/next/index.d.ts.map +1 -0
- package/dist/next/index.js +18 -0
- package/dist/next/index.js.map +1 -0
- package/dist/next/jobs/definition.d.ts +96 -0
- package/dist/next/jobs/definition.d.ts.map +1 -0
- package/dist/next/jobs/definition.js +83 -0
- package/dist/next/jobs/definition.js.map +1 -0
- package/dist/next/jobs/index.d.ts +5 -0
- package/dist/next/jobs/index.d.ts.map +1 -0
- package/dist/next/jobs/index.js +3 -0
- package/dist/next/jobs/index.js.map +1 -0
- package/dist/next/jobs/internal.d.ts +3 -0
- package/dist/next/jobs/internal.d.ts.map +1 -0
- package/dist/next/jobs/internal.js +4 -0
- package/dist/next/jobs/internal.js.map +1 -0
- package/dist/next/jobs/job.d.ts +152 -0
- package/dist/next/jobs/job.d.ts.map +1 -0
- package/dist/next/jobs/job.js +320 -0
- package/dist/next/jobs/job.js.map +1 -0
- package/dist/next/jobs/persisted.d.ts +38 -0
- package/dist/next/jobs/persisted.d.ts.map +1 -0
- package/dist/next/jobs/persisted.js +95 -0
- package/dist/next/jobs/persisted.js.map +1 -0
- package/dist/next/jobs/records.d.ts +231 -0
- package/dist/next/jobs/records.d.ts.map +1 -0
- package/dist/next/jobs/records.js +869 -0
- package/dist/next/jobs/records.js.map +1 -0
- package/dist/next/jobs/run-states.d.ts +69 -0
- package/dist/next/jobs/run-states.d.ts.map +1 -0
- package/dist/next/jobs/run-states.js +228 -0
- package/dist/next/jobs/run-states.js.map +1 -0
- package/dist/next/jobs/run.d.ts +113 -0
- package/dist/next/jobs/run.d.ts.map +1 -0
- package/dist/next/jobs/run.js +200 -0
- package/dist/next/jobs/run.js.map +1 -0
- package/dist/next/jobs/running.d.ts +44 -0
- package/dist/next/jobs/running.d.ts.map +1 -0
- package/dist/next/jobs/running.js +117 -0
- package/dist/next/jobs/running.js.map +1 -0
- package/dist/next/jobs/stored.d.ts +63 -0
- package/dist/next/jobs/stored.d.ts.map +1 -0
- package/dist/next/jobs/stored.js +55 -0
- package/dist/next/jobs/stored.js.map +1 -0
- package/dist/next/link/binary.d.ts +4 -0
- package/dist/next/link/binary.d.ts.map +1 -0
- package/dist/next/link/binary.js +534 -0
- package/dist/next/link/binary.js.map +1 -0
- package/dist/next/link/channel.d.ts +63 -0
- package/dist/next/link/channel.d.ts.map +1 -0
- package/dist/next/link/channel.js +202 -0
- package/dist/next/link/channel.js.map +1 -0
- package/dist/next/link/errors.d.ts +7 -0
- package/dist/next/link/errors.d.ts.map +1 -0
- package/dist/next/link/errors.js +21 -0
- package/dist/next/link/errors.js.map +1 -0
- package/dist/next/link/index.d.ts +8 -0
- package/dist/next/link/index.d.ts.map +1 -0
- package/dist/next/link/index.js +8 -0
- package/dist/next/link/index.js.map +1 -0
- package/dist/next/link/internal.d.ts +9 -0
- package/dist/next/link/internal.d.ts.map +1 -0
- package/dist/next/link/internal.js +10 -0
- package/dist/next/link/internal.js.map +1 -0
- package/dist/next/link/ipc.d.ts +22 -0
- package/dist/next/link/ipc.d.ts.map +1 -0
- package/dist/next/link/ipc.js +64 -0
- package/dist/next/link/ipc.js.map +1 -0
- package/dist/next/link/link.d.ts +34 -0
- package/dist/next/link/link.d.ts.map +1 -0
- package/dist/next/link/link.js +87 -0
- package/dist/next/link/link.js.map +1 -0
- package/dist/next/link/message.d.ts +249 -0
- package/dist/next/link/message.d.ts.map +1 -0
- package/dist/next/link/message.js +123 -0
- package/dist/next/link/message.js.map +1 -0
- package/dist/next/link/part.d.ts +80 -0
- package/dist/next/link/part.d.ts.map +1 -0
- package/dist/next/link/part.js +164 -0
- package/dist/next/link/part.js.map +1 -0
- package/dist/next/link/text.d.ts +6 -0
- package/dist/next/link/text.d.ts.map +1 -0
- package/dist/next/link/text.js +335 -0
- package/dist/next/link/text.js.map +1 -0
- package/dist/next/link/values.d.ts +40 -0
- package/dist/next/link/values.d.ts.map +1 -0
- package/dist/next/link/values.js +117 -0
- package/dist/next/link/values.js.map +1 -0
- package/dist/next/link/websocket.d.ts +26 -0
- package/dist/next/link/websocket.d.ts.map +1 -0
- package/dist/next/link/websocket.js +91 -0
- package/dist/next/link/websocket.js.map +1 -0
- package/dist/next/registries/contribution.d.ts +50 -0
- package/dist/next/registries/contribution.d.ts.map +1 -0
- package/dist/next/registries/contribution.js +129 -0
- package/dist/next/registries/contribution.js.map +1 -0
- package/dist/next/registries/entries.d.ts +18 -0
- package/dist/next/registries/entries.d.ts.map +1 -0
- package/dist/next/registries/entries.js +42 -0
- package/dist/next/registries/entries.js.map +1 -0
- package/dist/next/registries/index.d.ts +3 -0
- package/dist/next/registries/index.d.ts.map +1 -0
- package/dist/next/registries/index.js +5 -0
- package/dist/next/registries/index.js.map +1 -0
- package/dist/next/registries/internal.d.ts +4 -0
- package/dist/next/registries/internal.d.ts.map +1 -0
- package/dist/next/registries/internal.js +5 -0
- package/dist/next/registries/internal.js.map +1 -0
- package/dist/next/registries/record.d.ts +94 -0
- package/dist/next/registries/record.d.ts.map +1 -0
- package/dist/next/registries/record.js +253 -0
- package/dist/next/registries/record.js.map +1 -0
- package/dist/next/registries/registry.d.ts +74 -0
- package/dist/next/registries/registry.d.ts.map +1 -0
- package/dist/next/registries/registry.js +14 -0
- package/dist/next/registries/registry.js.map +1 -0
- package/dist/next/registries/value.d.ts +48 -0
- package/dist/next/registries/value.d.ts.map +1 -0
- package/dist/next/registries/value.js +199 -0
- package/dist/next/registries/value.js.map +1 -0
- package/dist/next/remote/calls.d.ts +25 -0
- package/dist/next/remote/calls.d.ts.map +1 -0
- package/dist/next/remote/calls.js +62 -0
- package/dist/next/remote/calls.js.map +1 -0
- package/dist/next/remote/consumer.d.ts +42 -0
- package/dist/next/remote/consumer.d.ts.map +1 -0
- package/dist/next/remote/consumer.js +343 -0
- package/dist/next/remote/consumer.js.map +1 -0
- package/dist/next/remote/hold.d.ts +130 -0
- package/dist/next/remote/hold.d.ts.map +1 -0
- package/dist/next/remote/hold.js +537 -0
- package/dist/next/remote/hold.js.map +1 -0
- package/dist/next/remote/host-link.d.ts +77 -0
- package/dist/next/remote/host-link.d.ts.map +1 -0
- package/dist/next/remote/host-link.js +182 -0
- package/dist/next/remote/host-link.js.map +1 -0
- package/dist/next/remote/internal.d.ts +6 -0
- package/dist/next/remote/internal.d.ts.map +1 -0
- package/dist/next/remote/internal.js +6 -0
- package/dist/next/remote/internal.js.map +1 -0
- package/dist/next/remote/path.d.ts +46 -0
- package/dist/next/remote/path.d.ts.map +1 -0
- package/dist/next/remote/path.js +73 -0
- package/dist/next/remote/path.js.map +1 -0
- package/dist/next/remote/provider.d.ts +76 -0
- package/dist/next/remote/provider.d.ts.map +1 -0
- package/dist/next/remote/provider.js +506 -0
- package/dist/next/remote/provider.js.map +1 -0
- package/dist/next/remote/relay.d.ts +58 -0
- package/dist/next/remote/relay.d.ts.map +1 -0
- package/dist/next/remote/relay.js +117 -0
- package/dist/next/remote/relay.js.map +1 -0
- package/dist/next/remote/remote-object.d.ts +133 -0
- package/dist/next/remote/remote-object.d.ts.map +1 -0
- package/dist/next/remote/remote-object.js +411 -0
- package/dist/next/remote/remote-object.js.map +1 -0
- package/dist/next/remote/replica.d.ts +59 -0
- package/dist/next/remote/replica.d.ts.map +1 -0
- package/dist/next/remote/replica.js +125 -0
- package/dist/next/remote/replica.js.map +1 -0
- package/dist/next/state/batch.d.ts +64 -0
- package/dist/next/state/batch.d.ts.map +1 -0
- package/dist/next/state/batch.js +163 -0
- package/dist/next/state/batch.js.map +1 -0
- package/dist/next/state/derive.d.ts +52 -0
- package/dist/next/state/derive.d.ts.map +1 -0
- package/dist/next/state/derive.js +182 -0
- package/dist/next/state/derive.js.map +1 -0
- package/dist/next/state/index.d.ts +6 -0
- package/dist/next/state/index.d.ts.map +1 -0
- package/dist/next/state/index.js +4 -0
- package/dist/next/state/index.js.map +1 -0
- package/dist/next/state/internal.d.ts +6 -0
- package/dist/next/state/internal.d.ts.map +1 -0
- package/dist/next/state/internal.js +8 -0
- package/dist/next/state/internal.js.map +1 -0
- package/dist/next/state/native-source.d.ts +106 -0
- package/dist/next/state/native-source.d.ts.map +1 -0
- package/dist/next/state/native-source.js +240 -0
- package/dist/next/state/native-source.js.map +1 -0
- package/dist/next/state/watchable.d.ts +114 -0
- package/dist/next/state/watchable.d.ts.map +1 -0
- package/dist/next/state/watchable.js +156 -0
- package/dist/next/state/watchable.js.map +1 -0
- package/dist/next/state/writable.d.ts +32 -0
- package/dist/next/state/writable.d.ts.map +1 -0
- package/dist/next/state/writable.js +49 -0
- package/dist/next/state/writable.js.map +1 -0
- package/dist/next/store/adapter.d.ts +67 -0
- package/dist/next/store/adapter.d.ts.map +1 -0
- package/dist/next/store/adapter.js +118 -0
- package/dist/next/store/adapter.js.map +1 -0
- package/dist/next/store/allocator.d.ts +17 -0
- package/dist/next/store/allocator.d.ts.map +1 -0
- package/dist/next/store/allocator.js +30 -0
- package/dist/next/store/allocator.js.map +1 -0
- package/dist/next/store/applier.d.ts +8 -0
- package/dist/next/store/applier.d.ts.map +1 -0
- package/dist/next/store/applier.js +375 -0
- package/dist/next/store/applier.js.map +1 -0
- package/dist/next/store/apply-batch.d.ts +12 -0
- package/dist/next/store/apply-batch.d.ts.map +1 -0
- package/dist/next/store/apply-batch.js +83 -0
- package/dist/next/store/apply-batch.js.map +1 -0
- package/dist/next/store/archive.d.ts +32 -0
- package/dist/next/store/archive.d.ts.map +1 -0
- package/dist/next/store/archive.js +129 -0
- package/dist/next/store/archive.js.map +1 -0
- package/dist/next/store/backend.d.ts +10 -0
- package/dist/next/store/backend.d.ts.map +1 -0
- package/dist/next/store/backend.js +15 -0
- package/dist/next/store/backend.js.map +1 -0
- package/dist/next/store/catalog.d.ts +24 -0
- package/dist/next/store/catalog.d.ts.map +1 -0
- package/dist/next/store/catalog.js +17 -0
- package/dist/next/store/catalog.js.map +1 -0
- package/dist/next/store/claims.d.ts +23 -0
- package/dist/next/store/claims.d.ts.map +1 -0
- package/dist/next/store/claims.js +65 -0
- package/dist/next/store/claims.js.map +1 -0
- package/dist/next/store/columns.d.ts +77 -0
- package/dist/next/store/columns.d.ts.map +1 -0
- package/dist/next/store/columns.js +77 -0
- package/dist/next/store/columns.js.map +1 -0
- package/dist/next/store/engine.d.ts +176 -0
- package/dist/next/store/engine.d.ts.map +1 -0
- package/dist/next/store/engine.js +283 -0
- package/dist/next/store/engine.js.map +1 -0
- package/dist/next/store/evaluate.d.ts +17 -0
- package/dist/next/store/evaluate.d.ts.map +1 -0
- package/dist/next/store/evaluate.js +128 -0
- package/dist/next/store/evaluate.js.map +1 -0
- package/dist/next/store/export.d.ts +17 -0
- package/dist/next/store/export.d.ts.map +1 -0
- package/dist/next/store/export.js +200 -0
- package/dist/next/store/export.js.map +1 -0
- package/dist/next/store/expression.d.ts +150 -0
- package/dist/next/store/expression.d.ts.map +1 -0
- package/dist/next/store/expression.js +268 -0
- package/dist/next/store/expression.js.map +1 -0
- package/dist/next/store/import.d.ts +10 -0
- package/dist/next/store/import.d.ts.map +1 -0
- package/dist/next/store/import.js +276 -0
- package/dist/next/store/import.js.map +1 -0
- package/dist/next/store/index.d.ts +16 -0
- package/dist/next/store/index.d.ts.map +1 -0
- package/dist/next/store/index.js +13 -0
- package/dist/next/store/index.js.map +1 -0
- package/dist/next/store/json-column.d.ts +33 -0
- package/dist/next/store/json-column.d.ts.map +1 -0
- package/dist/next/store/json-column.js +61 -0
- package/dist/next/store/json-column.js.map +1 -0
- package/dist/next/store/jsonl.d.ts +9 -0
- package/dist/next/store/jsonl.d.ts.map +1 -0
- package/dist/next/store/jsonl.js +61 -0
- package/dist/next/store/jsonl.js.map +1 -0
- package/dist/next/store/outbox.d.ts +26 -0
- package/dist/next/store/outbox.d.ts.map +1 -0
- package/dist/next/store/outbox.js +80 -0
- package/dist/next/store/outbox.js.map +1 -0
- package/dist/next/store/query.d.ts +39 -0
- package/dist/next/store/query.d.ts.map +1 -0
- package/dist/next/store/query.js +97 -0
- package/dist/next/store/query.js.map +1 -0
- package/dist/next/store/refusal.d.ts +15 -0
- package/dist/next/store/refusal.d.ts.map +1 -0
- package/dist/next/store/refusal.js +36 -0
- package/dist/next/store/refusal.js.map +1 -0
- package/dist/next/store/rows.d.ts +80 -0
- package/dist/next/store/rows.d.ts.map +1 -0
- package/dist/next/store/rows.js +183 -0
- package/dist/next/store/rows.js.map +1 -0
- package/dist/next/store/schema.d.ts +25 -0
- package/dist/next/store/schema.d.ts.map +1 -0
- package/dist/next/store/schema.js +115 -0
- package/dist/next/store/schema.js.map +1 -0
- package/dist/next/store/sql.d.ts +73 -0
- package/dist/next/store/sql.d.ts.map +1 -0
- package/dist/next/store/sql.js +234 -0
- package/dist/next/store/sql.js.map +1 -0
- package/dist/next/store/step.d.ts +48 -0
- package/dist/next/store/step.d.ts.map +1 -0
- package/dist/next/store/step.js +50 -0
- package/dist/next/store/step.js.map +1 -0
- package/dist/next/store/store.d.ts +161 -0
- package/dist/next/store/store.d.ts.map +1 -0
- package/dist/next/store/store.js +627 -0
- package/dist/next/store/store.js.map +1 -0
- package/dist/next/store/table-changes.d.ts +29 -0
- package/dist/next/store/table-changes.d.ts.map +1 -0
- package/dist/next/store/table-changes.js +102 -0
- package/dist/next/store/table-changes.js.map +1 -0
- package/dist/next/store/table-evolve.d.ts +74 -0
- package/dist/next/store/table-evolve.d.ts.map +1 -0
- package/dist/next/store/table-evolve.js +201 -0
- package/dist/next/store/table-evolve.js.map +1 -0
- package/dist/next/store/table-handle.d.ts +67 -0
- package/dist/next/store/table-handle.d.ts.map +1 -0
- package/dist/next/store/table-handle.js +101 -0
- package/dist/next/store/table-handle.js.map +1 -0
- package/dist/next/store/table-history.d.ts +75 -0
- package/dist/next/store/table-history.d.ts.map +1 -0
- package/dist/next/store/table-history.js +42 -0
- package/dist/next/store/table-history.js.map +1 -0
- package/dist/next/store/table-migration.d.ts +16 -0
- package/dist/next/store/table-migration.d.ts.map +1 -0
- package/dist/next/store/table-migration.js +202 -0
- package/dist/next/store/table-migration.js.map +1 -0
- package/dist/next/store/table-writes.d.ts +125 -0
- package/dist/next/store/table-writes.d.ts.map +1 -0
- package/dist/next/store/table-writes.js +165 -0
- package/dist/next/store/table-writes.js.map +1 -0
- package/dist/next/store/table.d.ts +80 -0
- package/dist/next/store/table.d.ts.map +1 -0
- package/dist/next/store/table.js +103 -0
- package/dist/next/store/table.js.map +1 -0
- package/dist/next/store/text.d.ts +14 -0
- package/dist/next/store/text.d.ts.map +1 -0
- package/dist/next/store/text.js +51 -0
- package/dist/next/store/text.js.map +1 -0
- package/dist/next/store/writes.d.ts +5 -0
- package/dist/next/store/writes.d.ts.map +1 -0
- package/dist/next/store/writes.js +4 -0
- package/dist/next/store/writes.js.map +1 -0
- package/dist/next-node/compression.d.ts +7 -0
- package/dist/next-node/compression.d.ts.map +1 -0
- package/dist/next-node/compression.js +24 -0
- package/dist/next-node/compression.js.map +1 -0
- package/dist/next-node/http/admission.d.ts +63 -0
- package/dist/next-node/http/admission.d.ts.map +1 -0
- package/dist/next-node/http/admission.js +134 -0
- package/dist/next-node/http/admission.js.map +1 -0
- package/dist/next-node/http/authenticate.d.ts +21 -0
- package/dist/next-node/http/authenticate.d.ts.map +1 -0
- package/dist/next-node/http/authenticate.js +34 -0
- package/dist/next-node/http/authenticate.js.map +1 -0
- package/dist/next-node/http/cookies.d.ts +24 -0
- package/dist/next-node/http/cookies.d.ts.map +1 -0
- package/dist/next-node/http/cookies.js +62 -0
- package/dist/next-node/http/cookies.js.map +1 -0
- package/dist/next-node/http/file.d.ts +23 -0
- package/dist/next-node/http/file.d.ts.map +1 -0
- package/dist/next-node/http/file.js +94 -0
- package/dist/next-node/http/file.js.map +1 -0
- package/dist/next-node/http/headers.d.ts +37 -0
- package/dist/next-node/http/headers.d.ts.map +1 -0
- package/dist/next-node/http/headers.js +129 -0
- package/dist/next-node/http/headers.js.map +1 -0
- package/dist/next-node/http/http.d.ts +100 -0
- package/dist/next-node/http/http.d.ts.map +1 -0
- package/dist/next-node/http/http.js +462 -0
- package/dist/next-node/http/http.js.map +1 -0
- package/dist/next-node/http/incoming.d.ts +19 -0
- package/dist/next-node/http/incoming.d.ts.map +1 -0
- package/dist/next-node/http/incoming.js +31 -0
- package/dist/next-node/http/incoming.js.map +1 -0
- package/dist/next-node/http/index.d.ts +11 -0
- package/dist/next-node/http/index.d.ts.map +1 -0
- package/dist/next-node/http/index.js +12 -0
- package/dist/next-node/http/index.js.map +1 -0
- package/dist/next-node/http/node.d.ts +78 -0
- package/dist/next-node/http/node.d.ts.map +1 -0
- package/dist/next-node/http/node.js +291 -0
- package/dist/next-node/http/node.js.map +1 -0
- package/dist/next-node/http/request.d.ts +54 -0
- package/dist/next-node/http/request.d.ts.map +1 -0
- package/dist/next-node/http/request.js +116 -0
- package/dist/next-node/http/request.js.map +1 -0
- package/dist/next-node/http/response.d.ts +63 -0
- package/dist/next-node/http/response.d.ts.map +1 -0
- package/dist/next-node/http/response.js +202 -0
- package/dist/next-node/http/response.js.map +1 -0
- package/dist/next-node/http/router.d.ts +114 -0
- package/dist/next-node/http/router.d.ts.map +1 -0
- package/dist/next-node/http/router.js +261 -0
- package/dist/next-node/http/router.js.map +1 -0
- package/dist/next-node/http/upgrades.d.ts +58 -0
- package/dist/next-node/http/upgrades.d.ts.map +1 -0
- package/dist/next-node/http/upgrades.js +184 -0
- package/dist/next-node/http/upgrades.js.map +1 -0
- package/dist/next-node/plugins/build.d.ts +57 -0
- package/dist/next-node/plugins/build.d.ts.map +1 -0
- package/dist/next-node/plugins/build.js +334 -0
- package/dist/next-node/plugins/build.js.map +1 -0
- package/dist/next-node/plugins/discover.d.ts +36 -0
- package/dist/next-node/plugins/discover.d.ts.map +1 -0
- package/dist/next-node/plugins/discover.js +91 -0
- package/dist/next-node/plugins/discover.js.map +1 -0
- package/dist/next-node/plugins/evaluate.d.ts +33 -0
- package/dist/next-node/plugins/evaluate.d.ts.map +1 -0
- package/dist/next-node/plugins/evaluate.js +98 -0
- package/dist/next-node/plugins/evaluate.js.map +1 -0
- package/dist/next-node/plugins/index.d.ts +9 -0
- package/dist/next-node/plugins/index.d.ts.map +1 -0
- package/dist/next-node/plugins/index.js +11 -0
- package/dist/next-node/plugins/index.js.map +1 -0
- package/dist/next-node/plugins/install.d.ts +13 -0
- package/dist/next-node/plugins/install.d.ts.map +1 -0
- package/dist/next-node/plugins/install.js +37 -0
- package/dist/next-node/plugins/install.js.map +1 -0
- package/dist/next-node/plugins/plugins.d.ts +135 -0
- package/dist/next-node/plugins/plugins.d.ts.map +1 -0
- package/dist/next-node/plugins/plugins.js +206 -0
- package/dist/next-node/plugins/plugins.js.map +1 -0
- package/dist/next-node/plugins/runtime.d.ts +41 -0
- package/dist/next-node/plugins/runtime.d.ts.map +1 -0
- package/dist/next-node/plugins/runtime.js +136 -0
- package/dist/next-node/plugins/runtime.js.map +1 -0
- package/dist/next-node/plugins/stack.d.ts +16 -0
- package/dist/next-node/plugins/stack.d.ts.map +1 -0
- package/dist/next-node/plugins/stack.js +61 -0
- package/dist/next-node/plugins/stack.js.map +1 -0
- package/dist/next-node/plugins/watcher.d.ts +58 -0
- package/dist/next-node/plugins/watcher.d.ts.map +1 -0
- package/dist/next-node/plugins/watcher.js +281 -0
- package/dist/next-node/plugins/watcher.js.map +1 -0
- package/dist/next-node/workers/control.d.ts +83 -0
- package/dist/next-node/workers/control.d.ts.map +1 -0
- package/dist/next-node/workers/control.js +77 -0
- package/dist/next-node/workers/control.js.map +1 -0
- package/dist/next-node/workers/index.d.ts +5 -0
- package/dist/next-node/workers/index.d.ts.map +1 -0
- package/dist/next-node/workers/index.js +7 -0
- package/dist/next-node/workers/index.js.map +1 -0
- package/dist/next-node/workers/lock.d.ts +21 -0
- package/dist/next-node/workers/lock.d.ts.map +1 -0
- package/dist/next-node/workers/lock.js +137 -0
- package/dist/next-node/workers/lock.js.map +1 -0
- package/dist/next-node/workers/main.d.ts +46 -0
- package/dist/next-node/workers/main.d.ts.map +1 -0
- package/dist/next-node/workers/main.js +230 -0
- package/dist/next-node/workers/main.js.map +1 -0
- package/dist/next-node/workers/process.d.ts +42 -0
- package/dist/next-node/workers/process.d.ts.map +1 -0
- package/dist/next-node/workers/process.js +125 -0
- package/dist/next-node/workers/process.js.map +1 -0
- package/dist/next-node/workers/workers.d.ts +80 -0
- package/dist/next-node/workers/workers.d.ts.map +1 -0
- package/dist/next-node/workers/workers.js +572 -0
- package/dist/next-node/workers/workers.js.map +1 -0
- package/dist/object.d.ts +4 -4
- package/dist/object.d.ts.map +1 -1
- package/dist/object.js +3 -4
- package/dist/object.js.map +1 -1
- package/dist/output.d.ts +9 -3
- package/dist/output.d.ts.map +1 -1
- package/dist/output.js +21 -9
- package/dist/output.js.map +1 -1
- package/dist/remote.d.ts.map +1 -1
- package/dist/remote.js +2 -2
- package/dist/remote.js.map +1 -1
- package/dist/schema.d.ts +8 -4
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +180 -5
- package/dist/schema.js.map +1 -1
- package/dist/sqlite/cloudflare.d.ts +54 -0
- package/dist/sqlite/cloudflare.d.ts.map +1 -0
- package/dist/sqlite/cloudflare.js +144 -0
- package/dist/sqlite/cloudflare.js.map +1 -0
- package/dist/sqlite/database.d.ts +40 -0
- package/dist/sqlite/database.d.ts.map +1 -0
- package/dist/sqlite/database.js +2 -0
- package/dist/sqlite/database.js.map +1 -0
- package/dist/sqlite/index.d.ts +4 -0
- package/dist/sqlite/index.d.ts.map +1 -0
- package/dist/sqlite/index.js +3 -0
- package/dist/sqlite/index.js.map +1 -0
- package/dist/sqlite/migrations.d.ts +10 -0
- package/dist/sqlite/migrations.d.ts.map +1 -0
- package/dist/sqlite/migrations.js +33 -0
- package/dist/sqlite/migrations.js.map +1 -0
- package/dist/sqlite/node.d.ts +41 -0
- package/dist/sqlite/node.d.ts.map +1 -0
- package/dist/sqlite/node.js +191 -0
- package/dist/sqlite/node.js.map +1 -0
- package/dist/sqlite/schema.d.ts +3 -0
- package/dist/sqlite/schema.d.ts.map +1 -0
- package/dist/sqlite/schema.js +10 -0
- package/dist/sqlite/schema.js.map +1 -0
- package/dist/telemetry-sqlite/index.d.ts +24 -0
- package/dist/telemetry-sqlite/index.d.ts.map +1 -0
- package/dist/telemetry-sqlite/index.js +273 -0
- package/dist/telemetry-sqlite/index.js.map +1 -0
- package/dist/telemetry-sqlite/store.d.ts +9 -0
- package/dist/telemetry-sqlite/store.d.ts.map +1 -0
- package/dist/telemetry-sqlite/store.js +110 -0
- package/dist/telemetry-sqlite/store.js.map +1 -0
- package/dist/watch.d.ts +194 -0
- package/dist/watch.d.ts.map +1 -0
- package/dist/watch.js +383 -0
- package/dist/watch.js.map +1 -0
- package/dist/wire.d.ts +174 -193
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +81 -80
- package/dist/wire.js.map +1 -1
- package/docs/guide.md +15 -15
- package/docs/next/benchmarks.md +959 -0
- package/docs/next/decisions.md +2957 -0
- package/docs/next/dependencies/book.md +1671 -0
- package/docs/next/dependencies/index.html +2641 -0
- package/docs/next/dependencies/model.md +330 -0
- package/docs/next/design.md +2554 -0
- package/docs/next/durable-observers/book.md +432 -0
- package/docs/next/durable-observers/index.html +517 -0
- package/docs/next/flow-control/book.md +333 -0
- package/docs/next/flow-control/fold/index.html +265 -0
- package/docs/next/flow-control/index.html +548 -0
- package/docs/next/flow-control/window/index.html +228 -0
- package/docs/next/guide-plugins-hosts/book.md +607 -0
- package/docs/next/guide-plugins-hosts/index.html +652 -0
- package/docs/next/http-workers/book.md +378 -0
- package/docs/next/http-workers/index.html +515 -0
- package/docs/next/layer-1.md +311 -0
- package/docs/next/layer-2.md +216 -0
- package/docs/next/plugin-model/book.md +186 -0
- package/docs/next/plugin-model/index.html +310 -0
- package/docs/next/plugin-primer/book.md +273 -0
- package/docs/next/plugin-primer/index.html +430 -0
- package/docs/next/slice-1.md +236 -0
- package/docs/next/slice-10.md +285 -0
- package/docs/next/slice-11.md +93 -0
- package/docs/next/slice-2.md +174 -0
- package/docs/next/slice-3a.md +296 -0
- package/docs/next/slice-3b.md +197 -0
- package/docs/next/slice-4.md +146 -0
- package/docs/next/slice-4a.md +418 -0
- package/docs/next/slice-4b.md +208 -0
- package/docs/next/slice-5.md +281 -0
- package/docs/next/slice-6a.md +676 -0
- package/docs/next/slice-6b.md +332 -0
- package/docs/next/slice-7a.md +130 -0
- package/docs/next/slice-7b/book.md +608 -0
- package/docs/next/slice-7b/index.html +842 -0
- package/docs/next/slice-7b.md +255 -0
- package/docs/next/slice-7c.md +165 -0
- package/docs/next/slice-8.md +194 -0
- package/docs/next/slices.md +230 -0
- package/docs/next/store/book.md +665 -0
- package/docs/next/store/index.html +861 -0
- package/docs/next/store/walkthrough.md +193 -0
- package/docs/spec.md +9 -9
- package/docs/tutorial.md +26 -25
- package/package.json +42 -5
- package/src/delta/README.md +69 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyed-slot.js","sourceRoot":"","sources":["../../../src/next/documents/keyed-slot.ts"],"names":[],"mappings":"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","sourcesContent":["// Keyed slots (slice 6a §1.2, §4, §10, §11): the documents of one keyed name on one object, by key. In memory, every\n// present document stays; persisted, a document is loaded on demand (a cold read is a job on the object's line, one\n// load in flight per key, shared) and leaves memory when unpinned and idle for the retention (`residency.ts`). A key\n// read through `at(key)` or a watch has its own source, which exists while the key is pinned.\n\nimport { awaitWithContext, type Context } from \"../../context/index.ts\";\nimport { type Prepared, type Tracker, track } from \"../../delta/index.ts\";\nimport type { Watch } from \"../../watch.ts\";\nimport { ChordError } from \"../data/index.ts\";\nimport { asChordError } from \"../data/internal.ts\";\nimport type { StagedWrite } from \"../store/step.ts\";\nimport { compareText, storedText } from \"../store/text.ts\";\nimport { AddressSource } from \"./address-source.ts\";\nimport type { JsonObject } from \"./definition.ts\";\nimport type { Documents } from \"./documents.ts\";\nimport type { SealToken } from \"./fence.ts\";\nimport {\n\ttype DocumentChange,\n\ttype Loaded,\n\ttype Persistence,\n\ttype Stored,\n\ttype StoredChange,\n\tstoredAfter,\n} from \"./persistence.ts\";\nimport { Resident } from \"./residency.ts\";\nimport { type AnyDefinition, type DocumentSlot, type PersistedSlot, SlotDefinition } from \"./slot.ts\";\n\n/** Whom a read is for: a handle's seal token and the version it was declared with (R15). */\nexport type Access = { readonly token: SealToken; readonly version: number };\n\n/**\n * A cold load in flight, shared by its waiters: their handles' tokens, and those already sealed when the load took\n * the line (`undefined` until then), whose waiters it refuses (rule 4).\n */\ntype SharedLoad = {\n\treadonly done: Promise<void>;\n\treadonly tokens: Set<SealToken>;\n\trefused: ReadonlySet<SealToken> | undefined;\n};\n\n/** The keys `keys(ctx)` reads per page from the store. */\nconst KEYS_PAGE = 100;\n\n/** A keyed slot: one resident per document in memory, one source per pinned key. */\nexport class KeyedSlot implements DocumentSlot, PersistedSlot {\n\treadonly owner: Documents;\n\treadonly definition: SlotDefinition;\n\treadonly persisted: PersistedSlot | undefined;\n\treadonly #persistence: Persistence | undefined;\n\treadonly #residents = new Map<string, Resident>();\n\t/** The sources of pinned keys: a key is pinned while it has one. */\n\treadonly #sources = new Map<string, KeySource>();\n\t/** Cold loads in flight, by key: shared by every reader of the key. */\n\treadonly #loads = new Map<string, SharedLoad>();\n\t/** Names a refused key (the slot's name is the same at every version): made once, not per key check. */\n\treadonly #keyWhat: string;\n\n\tconstructor(owner: Documents, definition: AnyDefinition, persistence: Persistence | undefined) {\n\t\tthis.owner = owner;\n\t\tthis.definition = new SlotDefinition(definition);\n\t\tthis.#keyWhat = `${definition.name}: key`;\n\t\tthis.#persistence = persistence;\n\t\tthis.persisted = persistence === undefined ? undefined : this;\n\t}\n\n\tget persistence(): Persistence {\n\t\t// Only reached through `persisted`, which a persisted slot alone has.\n\t\treturn this.#persistence!;\n\t}\n\n\t/**\n\t * The value at `key`, `undefined` when absent. A document in memory is read at once (also through a sealed\n\t * handle); a cold persisted one is loaded on the line (refused `released` once the access's token is sealed), and\n\t * `context` ends only this caller's wait. An absent key is not cached (rule 20).\n\t */\n\tget(raw: string, access: Access, context: Context): Promise<JsonObject | undefined> {\n\t\t// Not `async`: `#get` is the one async layer; a refused key still reaches the caller as a rejection.\n\t\ttry {\n\t\t\treturn this.#get(this.key(raw), access, context);\n\t\t} catch (error) {\n\t\t\treturn Promise.reject(error);\n\t\t}\n\t}\n\n\t/** `get` of a key that went through `key` already. */\n\tasync #get(key: string, access: Access, context: Context): Promise<JsonObject | undefined> {\n\t\tthis.owner.assertLive();\n\t\tthis.definition.assertVersion(access.version);\n\t\tconst resident = this.#resident(key);\n\t\tif (resident !== undefined) {\n\t\t\tthis.#touch(resident);\n\t\t\treturn resident.tracker.value;\n\t\t}\n\t\tif (this.#persistence === undefined) return undefined;\n\t\tawait this.#loadShared(key, access.token, context);\n\t\treturn this.#residents.get(key)?.tracker.value;\n\t}\n\n\t/** The present keys in code point order: in memory, the residents; persisted, the store's, a page per line job. */\n\tasync *keys(access: Access, context: Context): AsyncIterable<string> {\n\t\tthis.owner.assertLive();\n\t\tthis.definition.assertVersion(access.version);\n\t\tconst persistence = this.#persistence;\n\t\tif (persistence === undefined) {\n\t\t\tyield* [...this.#residents.keys()].sort(compareText);\n\t\t\treturn;\n\t\t}\n\t\tlet after: string | undefined;\n\t\tfor (;;) {\n\t\t\tconst page = await this.owner.onLine(() => persistence.keys(after, KEYS_PAGE, context), access.token);\n\t\t\tyield* page;\n\t\t\tif (page.length < KEYS_PAGE) return;\n\t\t\tafter = page.at(-1);\n\t\t}\n\t}\n\n\t/**\n\t * A watch of the document at `key`, `undefined` when absent (after a cold load); it follows the address (a\n\t * retirement is a frame with the `retired` flag) and pins the key until it ends.\n\t */\n\tasync watch(raw: string, access: Access, context: Context): Promise<Watch<JsonObject> | undefined> {\n\t\tconst key = this.key(raw);\n\t\tif ((await this.#get(key, access, context)) === undefined) return undefined;\n\t\tconst release = this.pin(key, context);\n\t\t// Retired between the load and now: absent.\n\t\tif (!this.#residents.has(key)) {\n\t\t\trelease();\n\t\t\treturn undefined;\n\t\t}\n\t\tlet watch: Watch<JsonObject>;\n\t\ttry {\n\t\t\t// The source's values are this slot's documents.\n\t\t\twatch = this.#sources.get(key)!.openWatch(context) as Watch<JsonObject>;\n\t\t} catch (error) {\n\t\t\trelease();\n\t\t\tthrow error;\n\t\t}\n\t\tvoid watch.closed.then(release);\n\t\treturn watch;\n\t}\n\n\t/**\n\t * Pins `key`: its source (made by the first pin) and its document stay in memory until the returned release\n\t * (idempotent) runs; a persisted key not in memory is loaded by the next activation load (`loadDeclared`).\n\t */\n\tpin(raw: string, context: Context): () => void {\n\t\tconst key = this.key(raw);\n\t\tlet source = this.#sources.get(key);\n\t\tif (source === undefined) {\n\t\t\tconst ready = this.#persistence === undefined || this.#residents.has(key);\n\t\t\tsource = new KeySource(this, key, this.definition.current.initial(context), ready);\n\t\t\tthis.#sources.set(key, source);\n\t\t}\n\t\tsource.pins++;\n\t\tconst resident = this.#residents.get(key);\n\t\tif (resident !== undefined) this.owner.residency.forget(resident);\n\t\tconst pinned = source;\n\t\tlet released = false;\n\t\treturn () => {\n\t\t\tif (released) return;\n\t\t\treleased = true;\n\t\t\tif (--pinned.pins > 0 || this.#sources.get(key) !== pinned) return;\n\t\t\tthis.#sources.delete(key);\n\t\t\tconst idle = this.#residents.get(key);\n\t\t\tif (idle !== undefined) this.#touch(idle);\n\t\t};\n\t}\n\n\t/** Loads pinned `key` on the line unless it was loaded since it was pinned (a consumer's `at(key)`, slice 6a §12). */\n\tasync ensure(raw: string, context: Context): Promise<void> {\n\t\tconst key = this.key(raw);\n\t\tif (this.#sources.get(key)?.ready !== false) return;\n\t\tawait this.owner.onLine(() => this.load(key, context));\n\t}\n\n\t/** The source of pinned `key`. */\n\tsource(key: string): KeySource {\n\t\treturn this.#sources.get(this.key(key))!;\n\t}\n\n\t/**\n\t * `key` as the slot and the store keep it: the `str()` text rules (slice 6a §8), a lone surrogate replaced by\n\t * U+FFFD, NUL refused `invalid/args`. Plugin keys are a trust boundary; every entry point takes them through here,\n\t * so memory and the store agree on one key.\n\t */\n\tkey(key: string): string {\n\t\treturn storedText(key, this.#keyWhat);\n\t}\n\n\t/** Loads every pinned key not loaded since it was pinned (activation, holding the line). */\n\tasync loadDeclared(context: Context): Promise<void> {\n\t\tfor (const [key, source] of this.#sources) if (!source.ready) await this.load(key, context);\n\t}\n\n\t/**\n\t * Loads the document at `key` (the caller holds the line) and installs it while it is still absent from memory (a\n\t * commit's `adopt` always wins). A stored version newer than the code's, another fingerprint or a failing `migrate`\n\t * fails the owner (slice 6a §1.4) and rejects with the cause.\n\t */\n\tasync load(key: string, context: Context, token?: SealToken): Promise<void> {\n\t\tif (this.#residents.has(key)) return;\n\t\t// A store error rejects as the store's (`storage_failed`, `aborted`).\n\t\tconst document = await this.persistence.read(key, context);\n\t\t// The transaction was cut meanwhile: what it read may be stale already.\n\t\tif (token?.sealed === true) return;\n\t\tlet loaded: Loaded | undefined;\n\t\ttry {\n\t\t\tloaded =\n\t\t\t\tdocument === undefined ? undefined : this.persistence.decode(document, this.definition.current, context);\n\t\t} catch (error) {\n\t\t\t// What the code cannot read (a failing `migrate`, whatever it throws) fails the owner.\n\t\t\tconst failure = asChordError(error, this.owner.label);\n\t\t\tthis.owner.fail(failure);\n\t\t\tthrow failure;\n\t\t}\n\t\tif (loaded !== undefined && !this.#residents.has(key)) {\n\t\t\tconst resident = new Resident(this, key, track(loaded.value), loaded.stored, this.definition.current.version);\n\t\t\tthis.#residents.set(key, resident);\n\t\t\tthis.#touch(resident);\n\t\t}\n\t\tconst source = this.#sources.get(key);\n\t\tif (source !== undefined) source.ready = true;\n\t}\n\n\tcold(key: string): boolean {\n\t\treturn this.#persistence !== undefined && !this.#residents.has(key);\n\t}\n\n\tstored(key: string): Stored | undefined {\n\t\treturn this.#residents.get(key)?.stored;\n\t}\n\n\tstage(key: string, change: DocumentChange, was: Stored | undefined, writes: StagedWrite[]): StoredChange {\n\t\treturn this.persistence.stage(key, this.definition.current, was, change, writes);\n\t}\n\n\t/**\n\t * Takes the attempt's declaration: a newer version migrates each document in memory on its next access (persisted\n\t * ones store a base with their next change); the pinned keys are watched, so they migrate now, all or none, and\n\t * take `initial()` again.\n\t */\n\thydrate(definition: AnyDefinition, context: Context): void {\n\t\tconst from = this.definition.hydrated;\n\t\tthis.definition.hydrate(definition);\n\t\tif (from === undefined || from.version === definition.version) return;\n\t\tconst pinned = [...this.#sources.keys()].flatMap((key) => this.#residents.get(key) ?? []);\n\t\tconst migrated = pinned.map((resident) => [resident, this.#migrated(resident, context)] as const);\n\t\tfor (const [resident, tracker] of migrated) {\n\t\t\tresident.tracker = tracker;\n\t\t\tresident.version = definition.version;\n\t\t}\n\t\tthis.owner.batch.commit(() => {\n\t\t\tfor (const source of this.#sources.values()) source.retake(definition.initial(context));\n\t\t}, context);\n\t}\n\n\tcurrent(key: string): Tracker<JsonObject> | undefined {\n\t\treturn this.#resident(key)?.tracker;\n\t}\n\n\t/** The value a draft of an absent document starts from: a fresh `initial()`. */\n\tinitial(context: Context): JsonObject {\n\t\treturn this.definition.current.initial(context);\n\t}\n\n\tadopt(\n\t\tkey: string,\n\t\ttracker: Tracker<JsonObject>,\n\t\tprepared: Prepared<JsonObject>,\n\t\tchange: StoredChange | undefined,\n\t): void {\n\t\tconst stored = change === undefined ? undefined : storedAfter(change);\n\t\tconst source = this.#sources.get(key);\n\t\tconst before = source?.peek();\n\t\ttracker.adopt(prepared);\n\t\tlet resident = this.#residents.get(key);\n\t\tconst { version } = this.definition.current;\n\t\tif (resident === undefined) {\n\t\t\tresident = new Resident(this, key, tracker, stored, version);\n\t\t\tthis.#residents.set(key, resident);\n\t\t} else {\n\t\t\tresident.tracker = tracker;\n\t\t\tresident.stored = stored;\n\t\t\tresident.version = version;\n\t\t}\n\t\tif (source === undefined) this.#touch(resident);\n\t\telse source.written(before!, prepared);\n\t}\n\n\t/** Retires the document at `key` (inside the batch): out of memory, its source reads `initial()` with the flag. */\n\tretire(key: string): void {\n\t\tconst resident = this.#residents.get(key);\n\t\tif (resident !== undefined) {\n\t\t\tthis.#residents.delete(key);\n\t\t\tthis.owner.residency.forget(resident);\n\t\t}\n\t\tthis.#sources.get(key)?.retire();\n\t}\n\n\t/** The sweep found `resident` idle past the retention: it leaves memory. */\n\tevict(resident: Resident): void {\n\t\tif (this.#residents.get(resident.key) === resident) this.#residents.delete(resident.key);\n\t}\n\n\t/** Its object ended or no attempt declares it any more: the documents go and the keys' watches end. */\n\tdrop(): void {\n\t\tfor (const resident of this.#residents.values()) this.owner.residency.forget(resident);\n\t\tthis.#residents.clear();\n\t\tfor (const source of this.#sources.values()) source.end();\n\t\tthis.#sources.clear();\n\t}\n\n\t/**\n\t * A cold persisted key's load, one in flight per key, on the line under the owner's context (rule 11). The load is\n\t * every waiter's: when it takes the line, a waiter whose handle was sealed meanwhile (its attempt failed live, the\n\t * object still open) is refused `released`, and with no other waiter the load does not run (rule 4).\n\t */\n\tasync #loadShared(key: string, token: SealToken, context: Context): Promise<void> {\n\t\t// Also when a load is in flight: a sealed handle's cold read is refused (rule 4).\n\t\tthis.owner.assertAdmitted(token);\n\t\tlet load = this.#loads.get(key);\n\t\tif (load === undefined) load = this.#startLoad(key);\n\t\tload.tokens.add(token);\n\t\tawait awaitWithContext(load.done, context);\n\t\tif (load.refused?.has(token)) throw this.owner.released();\n\t}\n\n\t/** Starts the shared load of `key`; it leaves `#loads` when it settles. */\n\t#startLoad(key: string): SharedLoad {\n\t\tconst tokens = new Set<SealToken>();\n\t\tconst load: SharedLoad = {\n\t\t\ttokens,\n\t\t\trefused: undefined,\n\t\t\t// The job runs once the line is taken, after `load` is assigned.\n\t\t\tdone: this.owner.onLine(async () => {\n\t\t\t\tconst refused = new Set([...tokens].filter(({ sealed }) => sealed));\n\t\t\t\tload.refused = refused;\n\t\t\t\tif (refused.size === tokens.size) throw this.owner.released();\n\t\t\t\tawait this.load(key, this.owner.context);\n\t\t\t}),\n\t\t};\n\t\tthis.#loads.set(key, load);\n\t\tconst settled = (): void => {\n\t\t\tthis.#loads.delete(key);\n\t\t};\n\t\tload.done.then(settled, settled);\n\t\treturn load;\n\t}\n\n\t/** The resident at `key`, migrated to the slot's version first when it is older (migration on access). */\n\t#resident(key: string): Resident | undefined {\n\t\tconst resident = this.#residents.get(key);\n\t\tif (resident === undefined || resident.version === this.definition.current.version) return resident;\n\t\tconst tracker = this.#migrated(resident, this.owner.context);\n\t\tresident.tracker = tracker;\n\t\tresident.version = this.definition.current.version;\n\t\treturn resident;\n\t}\n\n\t/**\n\t * `resident`'s value migrated from its version to the slot's (checked, R8). A throwing `migrate` fails the live\n\t * owner `broken` (slice 6a §1.4) and throws the failure (an activation fails with it).\n\t */\n\t#migrated(resident: Resident, context: Context): Tracker<JsonObject> {\n\t\ttry {\n\t\t\treturn track(this.definition.current.migrate(resident.tracker.value, resident.version, context));\n\t\t} catch (error) {\n\t\t\tconst failure = asChordError(error, this.owner.label);\n\t\t\tthis.owner.fail(failure);\n\t\t\tthrow failure;\n\t\t}\n\t}\n\n\t/** A use of `resident` while unpinned: persisted, it is idle from now (Durable's granule rule). */\n\t#touch(resident: Resident): void {\n\t\tif (this.#persistence !== undefined && !this.#sources.has(resident.key)) this.owner.residency.touch(resident);\n\t}\n}\n\n/**\n * One pinned key of a keyed slot as a source (`handle.at(key)`, a keyed member's `at(key)`, `watch(key)`): the\n * document's value, `initial()` while it is absent; retirements arrive with the `retired` flag.\n */\nexport class KeySource extends AddressSource {\n\treadonly #slot: KeyedSlot;\n\treadonly key: string;\n\t/** Its pins: at 0 the slot forgets it. */\n\tpins = 0;\n\t/** Whether the key was loaded since it was pinned (always, in memory): its value is known. */\n\tready: boolean;\n\t#initial: JsonObject;\n\n\tconstructor(slot: KeyedSlot, key: string, initial: JsonObject, ready: boolean) {\n\t\tsuper(slot.owner.batch);\n\t\tthis.#slot = slot;\n\t\tthis.key = key;\n\t\tthis.#initial = initial;\n\t\tthis.ready = ready;\n\t}\n\n\tget value(): JsonObject {\n\t\tthis.#slot.owner.assertLive();\n\t\tif (!this.ready) {\n\t\t\tconst message = `${this.#slot.definition.current.name}(${this.key}): read before it was loaded`;\n\t\t\tthrow new ChordError({ code: \"not_ready\", message });\n\t\t}\n\t\treturn this.peek();\n\t}\n\n\t/** The value without the checks (inside its slot's commits). */\n\tpeek(): JsonObject {\n\t\treturn this.#slot.current(this.key)?.value ?? this.#initial;\n\t}\n\n\t/** The document was retired: `initial()` from now, with the flag. */\n\tretire(): void {\n\t\tthis.retired(this.#initial);\n\t}\n\n\t/** A new definition took over (inside a batch): `initial()` again, the value as a root replacement. */\n\tretake(initial: JsonObject): void {\n\t\tthis.#initial = initial;\n\t\tif (this.ready) this.replaced();\n\t}\n\n\t/** Its slot was dropped: the watches end. */\n\tend(): void {\n\t\tthis.endWatches();\n\t}\n}\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** An object's line: `acquire()` resolves with the release once every earlier holder released; releasing twice is harmless. */
|
|
2
|
+
export declare class Line {
|
|
3
|
+
#private;
|
|
4
|
+
/** Resolves with this holder's release once every earlier holder released. */
|
|
5
|
+
acquire(): Promise<() => void>;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=line.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"line.d.ts","sourceRoot":"","sources":["../../../src/next/documents/line.ts"],"names":[],"mappings":"AAGA,+HAA+H;AAC/H,qBAAa,IAAI;;IAGhB,8EAA8E;IAC9E,OAAO,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,CAK7B;CACD"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// An object's line (§9): its transactions, cold loads, key pages and eviction sweeps run on it one at a time, in the
|
|
2
|
+
// order they asked.
|
|
3
|
+
/** An object's line: `acquire()` resolves with the release once every earlier holder released; releasing twice is harmless. */
|
|
4
|
+
export class Line {
|
|
5
|
+
#tail = Promise.resolve();
|
|
6
|
+
/** Resolves with this holder's release once every earlier holder released. */
|
|
7
|
+
acquire() {
|
|
8
|
+
const { promise, resolve } = Promise.withResolvers();
|
|
9
|
+
const previous = this.#tail;
|
|
10
|
+
this.#tail = promise;
|
|
11
|
+
return previous.then(() => resolve);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=line.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"line.js","sourceRoot":"","sources":["../../../src/next/documents/line.ts"],"names":[],"mappings":"AAAA,qHAAqH;AACrH,oBAAoB;AAEpB,+HAA+H;AAC/H,MAAM,OAAO,IAAI;IAChB,KAAK,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IAEzC,8EAA8E;IAC9E,OAAO;QACN,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,aAAa,EAAQ,CAAC;QAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC;QAC5B,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;QACrB,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;CACD","sourcesContent":["// An object's line (§9): its transactions, cold loads, key pages and eviction sweeps run on it one at a time, in the\n// order they asked.\n\n/** An object's line: `acquire()` resolves with the release once every earlier holder released; releasing twice is harmless. */\nexport class Line {\n\t#tail: Promise<void> = Promise.resolve();\n\n\t/** Resolves with this holder's release once every earlier holder released. */\n\tacquire(): Promise<() => void> {\n\t\tconst { promise, resolve } = Promise.withResolvers<void>();\n\t\tconst previous = this.#tail;\n\t\tthis.#tail = promise;\n\t\treturn previous.then(() => resolve);\n\t}\n}\n"]}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import type { Context } from "../../context/index.ts";
|
|
2
|
+
import type { Op, Prepared } from "../../delta/index.ts";
|
|
3
|
+
import { type DocumentAddress, type StoredDocument } from "../store/engine.ts";
|
|
4
|
+
import type { StagedWrite } from "../store/step.ts";
|
|
5
|
+
import type { ChordStore } from "../store/store.ts";
|
|
6
|
+
import type { JsonObject } from "./definition.ts";
|
|
7
|
+
import type { AnyDefinition } from "./slot.ts";
|
|
8
|
+
/** What is stored of a loaded document: its record's id and revision, its base's version, the deltas after it. */
|
|
9
|
+
export type Stored = {
|
|
10
|
+
readonly id: number;
|
|
11
|
+
readonly revision: number;
|
|
12
|
+
/** The version of the stored base: below the definition's, the next change stores a base (rule 1). */
|
|
13
|
+
readonly version: number;
|
|
14
|
+
readonly deltasSinceBase: number;
|
|
15
|
+
};
|
|
16
|
+
/** A live document found without loading it: what is stored of it and the fingerprint it was stored with. */
|
|
17
|
+
export type FoundDocument = {
|
|
18
|
+
readonly stored: Stored;
|
|
19
|
+
readonly fingerprint: string;
|
|
20
|
+
};
|
|
21
|
+
/** A loaded document: its value at the definition's version, and what is stored of it. */
|
|
22
|
+
export type Loaded = {
|
|
23
|
+
readonly value: JsonObject;
|
|
24
|
+
readonly stored: Stored;
|
|
25
|
+
};
|
|
26
|
+
/** One transaction's change of one document: its prepared draft (if changed), and whether it retires it. */
|
|
27
|
+
export type DocumentChange = {
|
|
28
|
+
readonly prepared: Prepared<JsonObject> | undefined;
|
|
29
|
+
readonly retires: boolean;
|
|
30
|
+
};
|
|
31
|
+
/** A run state's held ops (D8), stored before the next change's own; `base` when a held change asked for a base. */
|
|
32
|
+
export type Held = {
|
|
33
|
+
readonly ops: readonly Op[];
|
|
34
|
+
readonly base: boolean;
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* What one commit stores of a document, in the store writes' words: a retirement (nothing stored after it), a
|
|
38
|
+
* creation whose id the step assigns (`create`: `created.id` once it applied), a change of the record `stored` was
|
|
39
|
+
* prepared on, or nothing yet (`held`: a deferred change of a run's state, D8, kept in memory over `stored`).
|
|
40
|
+
*/
|
|
41
|
+
export type StoredChange = {
|
|
42
|
+
readonly kind: "retire";
|
|
43
|
+
} | {
|
|
44
|
+
readonly kind: "create";
|
|
45
|
+
readonly version: number;
|
|
46
|
+
readonly created: {
|
|
47
|
+
id: number;
|
|
48
|
+
};
|
|
49
|
+
} | {
|
|
50
|
+
readonly kind: "change";
|
|
51
|
+
readonly stored: Stored;
|
|
52
|
+
} | {
|
|
53
|
+
readonly kind: "held";
|
|
54
|
+
readonly stored: Stored;
|
|
55
|
+
readonly withinMs: number;
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* The documents of one persisted name on one object: `(<object type>, namespace, name, key)`, the namespace `chord` for
|
|
59
|
+
* `self.state`, `chord.jobs` and `chord.job-states` for persisted job runs (slice 6b D5).
|
|
60
|
+
*/
|
|
61
|
+
export declare class Persistence {
|
|
62
|
+
#private;
|
|
63
|
+
readonly store: ChordStore;
|
|
64
|
+
/** `owner` is the object's type (R2); `kind` the definition's or the job's name. */
|
|
65
|
+
constructor(store: ChordStore, owner: string, namespace: string, kind: string);
|
|
66
|
+
/**
|
|
67
|
+
* The stored document at `key`, `undefined` when absent: found and loaded with plain reads (a store error rejects
|
|
68
|
+
* as the store's). Counted (`chord.store.loads`).
|
|
69
|
+
*/
|
|
70
|
+
read(key: string, context: Context): Promise<StoredDocument | undefined>;
|
|
71
|
+
/**
|
|
72
|
+
* `document` as `definition` reads it: a stored version newer than the code's, or the same version with another
|
|
73
|
+
* fingerprint (D9), throws; an older one is migrated and the result checked once (R8). What throws here is the
|
|
74
|
+
* code's (a failing `migrate` too, whatever it throws), never the store's.
|
|
75
|
+
*/
|
|
76
|
+
decode(document: StoredDocument, definition: AnyDefinition, context: Context): Loaded;
|
|
77
|
+
/**
|
|
78
|
+
* What is stored of the live document at `key` without loading it (a retirement's find) and the schema fingerprint
|
|
79
|
+
* it was stored with (`checkReadable` takes both), `undefined` when absent.
|
|
80
|
+
*/
|
|
81
|
+
find(key: string, context: Context): Promise<FoundDocument | undefined>;
|
|
82
|
+
/** Up to `limit` keys of live documents after `after`, in code point order. */
|
|
83
|
+
keys(after: string | undefined, limit: number, context: Context): Promise<string[]>;
|
|
84
|
+
/**
|
|
85
|
+
* Stages one commit's writes of the document at `key` into `writes` (rule 8: serialized here, before the queue):
|
|
86
|
+
* its retirement when `retired` is stored, then its creation, or the change of `stored` (a base when created, when
|
|
87
|
+
* the stored version is older, or when `checkpointWhen` asks; a delta otherwise), `held` ops stored before the
|
|
88
|
+
* change's own (D8: a held base makes it a base). Returns what the commit stores.
|
|
89
|
+
*/
|
|
90
|
+
stage(key: string, definition: AnyDefinition, stored: Stored | undefined, change: DocumentChange, writes: StagedWrite[], held?: Held): StoredChange;
|
|
91
|
+
/** The address of `key`: a singleton's (`""`) has no key. */
|
|
92
|
+
at(key: string): DocumentAddress;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Throws when `definition` cannot read a document stored at `stored`'s version and fingerprint: a newer version than
|
|
96
|
+
* the code's, or the same version with another fingerprint (D9). A load and a retirement check alike (R15).
|
|
97
|
+
*/
|
|
98
|
+
export declare function checkReadable(stored: {
|
|
99
|
+
readonly version: number;
|
|
100
|
+
readonly fingerprint: string;
|
|
101
|
+
}, definition: AnyDefinition): void;
|
|
102
|
+
/** What is stored after a commit's `change` was adopted. */
|
|
103
|
+
export declare function storedAfter(change: StoredChange): Stored | undefined;
|
|
104
|
+
//# sourceMappingURL=persistence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../../src/next/documents/persistence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
// Persisted documents' store side (slice 6a §8, §10): a slot's address in the documents engine, what is stored of each
|
|
2
|
+
// loaded document (Durable's `LoadedDocument` fields), its loads with the version and fingerprint checks and the
|
|
3
|
+
// checked `migrate`, and the writes one commit stages for a changed or retired document.
|
|
4
|
+
import { changeDocument, createDocument, findDocument, listDocumentKeys, loadDocument, retireDocument, } from "../store/engine.js";
|
|
5
|
+
/**
|
|
6
|
+
* The documents of one persisted name on one object: `(<object type>, namespace, name, key)`, the namespace `chord` for
|
|
7
|
+
* `self.state`, `chord.jobs` and `chord.job-states` for persisted job runs (slice 6b D5).
|
|
8
|
+
*/
|
|
9
|
+
export class Persistence {
|
|
10
|
+
store;
|
|
11
|
+
#address;
|
|
12
|
+
/** `owner` is the object's type (R2); `kind` the definition's or the job's name. */
|
|
13
|
+
constructor(store, owner, namespace, kind) {
|
|
14
|
+
this.store = store;
|
|
15
|
+
this.#address = { owner, namespace, kind };
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* The stored document at `key`, `undefined` when absent: found and loaded with plain reads (a store error rejects
|
|
19
|
+
* as the store's). Counted (`chord.store.loads`).
|
|
20
|
+
*/
|
|
21
|
+
async read(key, context) {
|
|
22
|
+
const address = this.at(key);
|
|
23
|
+
const document = await this.store.read(async (executor) => {
|
|
24
|
+
const record = await findDocument(executor, address);
|
|
25
|
+
return record === undefined ? undefined : loadDocument(executor, record);
|
|
26
|
+
}, context);
|
|
27
|
+
if (document !== undefined)
|
|
28
|
+
context.telemetry.metrics?.counter("chord.store.loads").add(1);
|
|
29
|
+
return document;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* `document` as `definition` reads it: a stored version newer than the code's, or the same version with another
|
|
33
|
+
* fingerprint (D9), throws; an older one is migrated and the result checked once (R8). What throws here is the
|
|
34
|
+
* code's (a failing `migrate` too, whatever it throws), never the store's.
|
|
35
|
+
*/
|
|
36
|
+
decode(document, definition, context) {
|
|
37
|
+
const { record, deltasSinceBase } = document;
|
|
38
|
+
checkReadable(record, definition);
|
|
39
|
+
// The engine stores what commits gave it: JSON objects of the record's version.
|
|
40
|
+
const stored = document.value;
|
|
41
|
+
const value = record.version === definition.version ? stored : definition.migrate(stored, record.version, context);
|
|
42
|
+
return {
|
|
43
|
+
value,
|
|
44
|
+
stored: { id: record.id, revision: record.revision, version: record.version, deltasSinceBase },
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* What is stored of the live document at `key` without loading it (a retirement's find) and the schema fingerprint
|
|
49
|
+
* it was stored with (`checkReadable` takes both), `undefined` when absent.
|
|
50
|
+
*/
|
|
51
|
+
async find(key, context) {
|
|
52
|
+
const record = await this.store.read((executor) => findDocument(executor, this.at(key)), context);
|
|
53
|
+
if (record === undefined)
|
|
54
|
+
return undefined;
|
|
55
|
+
// The change counter is all a retirement needs; `deltasSinceBase` is not read for one.
|
|
56
|
+
const stored = { id: record.id, revision: record.revision, version: record.version, deltasSinceBase: 0 };
|
|
57
|
+
return { stored, fingerprint: record.fingerprint };
|
|
58
|
+
}
|
|
59
|
+
/** Up to `limit` keys of live documents after `after`, in code point order. */
|
|
60
|
+
keys(after, limit, context) {
|
|
61
|
+
return this.store.read((executor) => listDocumentKeys(executor, this.#address, after, limit), context);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Stages one commit's writes of the document at `key` into `writes` (rule 8: serialized here, before the queue):
|
|
65
|
+
* its retirement when `retired` is stored, then its creation, or the change of `stored` (a base when created, when
|
|
66
|
+
* the stored version is older, or when `checkpointWhen` asks; a delta otherwise), `held` ops stored before the
|
|
67
|
+
* change's own (D8: a held base makes it a base). Returns what the commit stores.
|
|
68
|
+
*/
|
|
69
|
+
stage(key, definition, stored, change, writes, held) {
|
|
70
|
+
const { prepared, retires } = change;
|
|
71
|
+
if (retires && stored !== undefined)
|
|
72
|
+
writes.push(retireDocument(stored.id, stored.revision));
|
|
73
|
+
if (prepared === undefined)
|
|
74
|
+
return { kind: "retire" };
|
|
75
|
+
const { version, fingerprint } = definition;
|
|
76
|
+
if (retires || stored === undefined) {
|
|
77
|
+
const base = { version, fingerprint, value: prepared.value };
|
|
78
|
+
const created = { id: 0 };
|
|
79
|
+
const write = createDocument(this.at(key), base, JSON.stringify(prepared.value), (id) => {
|
|
80
|
+
created.id = id;
|
|
81
|
+
});
|
|
82
|
+
writes.push(write);
|
|
83
|
+
return { kind: "create", version, created };
|
|
84
|
+
}
|
|
85
|
+
const info = { deltasSinceBase: stored.deltasSinceBase };
|
|
86
|
+
const base = held?.base === true ||
|
|
87
|
+
stored.version !== version ||
|
|
88
|
+
definition.checkpointWhen(prepared.value, prepared.ops, info);
|
|
89
|
+
const ops = held === undefined ? prepared.ops : [...held.ops, ...prepared.ops];
|
|
90
|
+
const content = base
|
|
91
|
+
? { kind: "base", version, fingerprint, value: prepared.value }
|
|
92
|
+
: { kind: "delta", version, ops };
|
|
93
|
+
const text = JSON.stringify(base ? prepared.value : ops);
|
|
94
|
+
writes.push(changeDocument(stored.id, stored.revision, content, text));
|
|
95
|
+
const deltasSinceBase = base ? 0 : stored.deltasSinceBase + 1;
|
|
96
|
+
return { kind: "change", stored: { id: stored.id, revision: stored.revision + 1, version, deltasSinceBase } };
|
|
97
|
+
}
|
|
98
|
+
/** The address of `key`: a singleton's (`""`) has no key. */
|
|
99
|
+
at(key) {
|
|
100
|
+
return key === "" ? this.#address : { ...this.#address, key };
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Throws when `definition` cannot read a document stored at `stored`'s version and fingerprint: a newer version than
|
|
105
|
+
* the code's, or the same version with another fingerprint (D9). A load and a retirement check alike (R15).
|
|
106
|
+
*/
|
|
107
|
+
export function checkReadable(stored, definition) {
|
|
108
|
+
const { name, version, fingerprint } = definition;
|
|
109
|
+
if (stored.version > version) {
|
|
110
|
+
throw new Error(`${name}: stored at version ${stored.version}, newer than the code's ${version}`);
|
|
111
|
+
}
|
|
112
|
+
if (stored.version === version && stored.fingerprint !== fingerprint) {
|
|
113
|
+
throw new Error(`${name}: stored with another schema at version ${version} (a schema changed without a bump)`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/** What is stored after a commit's `change` was adopted. */
|
|
117
|
+
export function storedAfter(change) {
|
|
118
|
+
switch (change.kind) {
|
|
119
|
+
case "retire":
|
|
120
|
+
return undefined;
|
|
121
|
+
case "create":
|
|
122
|
+
return { id: change.created.id, revision: 1, version: change.version, deltasSinceBase: 0 };
|
|
123
|
+
case "change":
|
|
124
|
+
case "held":
|
|
125
|
+
return change.stored;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=persistence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../../src/next/documents/persistence.ts"],"names":[],"mappings":"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","sourcesContent":["// Persisted documents' store side (slice 6a §8, §10): a slot's address in the documents engine, what is stored of each\n// loaded document (Durable's `LoadedDocument` fields), its loads with the version and fingerprint checks and the\n// checked `migrate`, and the writes one commit stages for a changed or retired document.\n\nimport type { Context } from \"../../context/index.ts\";\nimport type { Op, Prepared } from \"../../delta/index.ts\";\nimport {\n\tchangeDocument,\n\tcreateDocument,\n\ttype DocumentAddress,\n\ttype DocumentContent,\n\tfindDocument,\n\tlistDocumentKeys,\n\tloadDocument,\n\tretireDocument,\n\ttype StoredDocument,\n} from \"../store/engine.ts\";\nimport type { StagedWrite } from \"../store/step.ts\";\nimport type { ChordStore } from \"../store/store.ts\";\nimport type { JsonObject } from \"./definition.ts\";\nimport type { AnyDefinition } from \"./slot.ts\";\n\n/** What is stored of a loaded document: its record's id and revision, its base's version, the deltas after it. */\nexport type Stored = {\n\treadonly id: number;\n\treadonly revision: number;\n\t/** The version of the stored base: below the definition's, the next change stores a base (rule 1). */\n\treadonly version: number;\n\treadonly deltasSinceBase: number;\n};\n\n/** A live document found without loading it: what is stored of it and the fingerprint it was stored with. */\nexport type FoundDocument = { readonly stored: Stored; readonly fingerprint: string };\n\n/** A loaded document: its value at the definition's version, and what is stored of it. */\nexport type Loaded = { readonly value: JsonObject; readonly stored: Stored };\n\n/** One transaction's change of one document: its prepared draft (if changed), and whether it retires it. */\nexport type DocumentChange = { readonly prepared: Prepared<JsonObject> | undefined; readonly retires: boolean };\n\n/** A run state's held ops (D8), stored before the next change's own; `base` when a held change asked for a base. */\nexport type Held = { readonly ops: readonly Op[]; readonly base: boolean };\n\n/**\n * What one commit stores of a document, in the store writes' words: a retirement (nothing stored after it), a\n * creation whose id the step assigns (`create`: `created.id` once it applied), a change of the record `stored` was\n * prepared on, or nothing yet (`held`: a deferred change of a run's state, D8, kept in memory over `stored`).\n */\nexport type StoredChange =\n\t| { readonly kind: \"retire\" }\n\t| { readonly kind: \"create\"; readonly version: number; readonly created: { id: number } }\n\t| { readonly kind: \"change\"; readonly stored: Stored }\n\t| { readonly kind: \"held\"; readonly stored: Stored; readonly withinMs: number };\n\n/**\n * The documents of one persisted name on one object: `(<object type>, namespace, name, key)`, the namespace `chord` for\n * `self.state`, `chord.jobs` and `chord.job-states` for persisted job runs (slice 6b D5).\n */\nexport class Persistence {\n\treadonly store: ChordStore;\n\treadonly #address: Omit<DocumentAddress, \"key\">;\n\n\t/** `owner` is the object's type (R2); `kind` the definition's or the job's name. */\n\tconstructor(store: ChordStore, owner: string, namespace: string, kind: string) {\n\t\tthis.store = store;\n\t\tthis.#address = { owner, namespace, kind };\n\t}\n\n\t/**\n\t * The stored document at `key`, `undefined` when absent: found and loaded with plain reads (a store error rejects\n\t * as the store's). Counted (`chord.store.loads`).\n\t */\n\tasync read(key: string, context: Context): Promise<StoredDocument | undefined> {\n\t\tconst address = this.at(key);\n\t\tconst document = await this.store.read(async (executor) => {\n\t\t\tconst record = await findDocument(executor, address);\n\t\t\treturn record === undefined ? undefined : loadDocument(executor, record);\n\t\t}, context);\n\t\tif (document !== undefined) context.telemetry.metrics?.counter(\"chord.store.loads\").add(1);\n\t\treturn document;\n\t}\n\n\t/**\n\t * `document` as `definition` reads it: a stored version newer than the code's, or the same version with another\n\t * fingerprint (D9), throws; an older one is migrated and the result checked once (R8). What throws here is the\n\t * code's (a failing `migrate` too, whatever it throws), never the store's.\n\t */\n\tdecode(document: StoredDocument, definition: AnyDefinition, context: Context): Loaded {\n\t\tconst { record, deltasSinceBase } = document;\n\t\tcheckReadable(record, definition);\n\t\t// The engine stores what commits gave it: JSON objects of the record's version.\n\t\tconst stored = document.value as JsonObject;\n\t\tconst value =\n\t\t\trecord.version === definition.version ? stored : definition.migrate(stored, record.version, context);\n\t\treturn {\n\t\t\tvalue,\n\t\t\tstored: { id: record.id, revision: record.revision, version: record.version, deltasSinceBase },\n\t\t};\n\t}\n\n\t/**\n\t * What is stored of the live document at `key` without loading it (a retirement's find) and the schema fingerprint\n\t * it was stored with (`checkReadable` takes both), `undefined` when absent.\n\t */\n\tasync find(key: string, context: Context): Promise<FoundDocument | undefined> {\n\t\tconst record = await this.store.read((executor) => findDocument(executor, this.at(key)), context);\n\t\tif (record === undefined) return undefined;\n\t\t// The change counter is all a retirement needs; `deltasSinceBase` is not read for one.\n\t\tconst stored = { id: record.id, revision: record.revision, version: record.version, deltasSinceBase: 0 };\n\t\treturn { stored, fingerprint: record.fingerprint };\n\t}\n\n\t/** Up to `limit` keys of live documents after `after`, in code point order. */\n\tkeys(after: string | undefined, limit: number, context: Context): Promise<string[]> {\n\t\treturn this.store.read((executor) => listDocumentKeys(executor, this.#address, after, limit), context);\n\t}\n\n\t/**\n\t * Stages one commit's writes of the document at `key` into `writes` (rule 8: serialized here, before the queue):\n\t * its retirement when `retired` is stored, then its creation, or the change of `stored` (a base when created, when\n\t * the stored version is older, or when `checkpointWhen` asks; a delta otherwise), `held` ops stored before the\n\t * change's own (D8: a held base makes it a base). Returns what the commit stores.\n\t */\n\tstage(\n\t\tkey: string,\n\t\tdefinition: AnyDefinition,\n\t\tstored: Stored | undefined,\n\t\tchange: DocumentChange,\n\t\twrites: StagedWrite[],\n\t\theld?: Held,\n\t): StoredChange {\n\t\tconst { prepared, retires } = change;\n\t\tif (retires && stored !== undefined) writes.push(retireDocument(stored.id, stored.revision));\n\t\tif (prepared === undefined) return { kind: \"retire\" };\n\t\tconst { version, fingerprint } = definition;\n\t\tif (retires || stored === undefined) {\n\t\t\tconst base = { version, fingerprint, value: prepared.value };\n\t\t\tconst created = { id: 0 };\n\t\t\tconst write = createDocument(this.at(key), base, JSON.stringify(prepared.value), (id) => {\n\t\t\t\tcreated.id = id;\n\t\t\t});\n\t\t\twrites.push(write);\n\t\t\treturn { kind: \"create\", version, created };\n\t\t}\n\t\tconst info = { deltasSinceBase: stored.deltasSinceBase };\n\t\tconst base =\n\t\t\theld?.base === true ||\n\t\t\tstored.version !== version ||\n\t\t\tdefinition.checkpointWhen(prepared.value, prepared.ops, info);\n\t\tconst ops = held === undefined ? prepared.ops : [...held.ops, ...prepared.ops];\n\t\tconst content: DocumentContent = base\n\t\t\t? { kind: \"base\", version, fingerprint, value: prepared.value }\n\t\t\t: { kind: \"delta\", version, ops };\n\t\tconst text = JSON.stringify(base ? prepared.value : ops);\n\t\twrites.push(changeDocument(stored.id, stored.revision, content, text));\n\t\tconst deltasSinceBase = base ? 0 : stored.deltasSinceBase + 1;\n\t\treturn { kind: \"change\", stored: { id: stored.id, revision: stored.revision + 1, version, deltasSinceBase } };\n\t}\n\n\t/** The address of `key`: a singleton's (`\"\"`) has no key. */\n\tat(key: string): DocumentAddress {\n\t\treturn key === \"\" ? this.#address : { ...this.#address, key };\n\t}\n}\n\n/**\n * Throws when `definition` cannot read a document stored at `stored`'s version and fingerprint: a newer version than\n * the code's, or the same version with another fingerprint (D9). A load and a retirement check alike (R15).\n */\nexport function checkReadable(\n\tstored: { readonly version: number; readonly fingerprint: string },\n\tdefinition: AnyDefinition,\n): void {\n\tconst { name, version, fingerprint } = definition;\n\tif (stored.version > version) {\n\t\tthrow new Error(`${name}: stored at version ${stored.version}, newer than the code's ${version}`);\n\t}\n\tif (stored.version === version && stored.fingerprint !== fingerprint) {\n\t\tthrow new Error(`${name}: stored with another schema at version ${version} (a schema changed without a bump)`);\n\t}\n}\n\n/** What is stored after a commit's `change` was adopted. */\nexport function storedAfter(change: StoredChange): Stored | undefined {\n\tswitch (change.kind) {\n\t\tcase \"retire\":\n\t\t\treturn undefined;\n\t\tcase \"create\":\n\t\t\treturn { id: change.created.id, revision: 1, version: change.version, deltasSinceBase: 0 };\n\t\tcase \"change\":\n\t\tcase \"held\":\n\t\t\treturn change.stored;\n\t}\n}\n"]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Tracker } from "../../delta/index.ts";
|
|
2
|
+
import type { JsonObject } from "./definition.ts";
|
|
3
|
+
import type { Stored } from "./persistence.ts";
|
|
4
|
+
/** One keyed document in memory: its slot, its tracker and, persisted, what is stored of it. */
|
|
5
|
+
export declare class Resident {
|
|
6
|
+
readonly slot: {
|
|
7
|
+
evict(resident: Resident): void;
|
|
8
|
+
};
|
|
9
|
+
readonly key: string;
|
|
10
|
+
tracker: Tracker<JsonObject>;
|
|
11
|
+
stored: Stored | undefined;
|
|
12
|
+
/** The definition version the tracker's value is at: below the slot's, it migrates on its next access. */
|
|
13
|
+
version: number;
|
|
14
|
+
constructor(slot: {
|
|
15
|
+
evict(resident: Resident): void;
|
|
16
|
+
}, key: string, tracker: Tracker<JsonObject>, stored: Stored | undefined, version: number);
|
|
17
|
+
}
|
|
18
|
+
/** How long an unpinned persisted keyed document stays in memory after its last read or write (slice 6a §10). */
|
|
19
|
+
export declare const RETENTION_MS: number;
|
|
20
|
+
/** The idle persisted keyed documents of one object, oldest first, and the one timer evicting them. */
|
|
21
|
+
export declare class Residency {
|
|
22
|
+
#private;
|
|
23
|
+
constructor(onLine: (sweep: () => void) => void);
|
|
24
|
+
/** A use of an unpinned `resident`: it becomes the newest idle one (once per granule), and a sweep is scheduled. */
|
|
25
|
+
touch(resident: Resident): void;
|
|
26
|
+
/** `resident` is pinned or left memory: it is no longer idle. */
|
|
27
|
+
forget(resident: Resident): void;
|
|
28
|
+
/** The object ended: nothing is evicted any more, the timer is cleared. */
|
|
29
|
+
end(): void;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=residency.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"residency.d.ts","sourceRoot":"","sources":["../../../src/next/documents/residency.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,gGAAgG;AAChG,qBAAa,QAAQ;IACpB,QAAQ,CAAC,IAAI,EAAE;QAAE,KAAK,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAA;KAAE,CAAC;IACnD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,0GAA0G;IAC1G,OAAO,EAAE,MAAM,CAAC;IAEhB,YACC,IAAI,EAAE;QAAE,KAAK,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAA;KAAE,EACzC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,EAC5B,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,OAAO,EAAE,MAAM,EAOf;CACD;AAED,iHAAiH;AACjH,eAAO,MAAM,YAAY,QAAc,CAAC;AAKxC,uGAAuG;AACvG,qBAAa,SAAS;;IAQrB,YAAY,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,IAAI,KAAK,IAAI,EAE9C;IAED,oHAAoH;IACpH,KAAK,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAQ9B;IAED,iEAAiE;IACjE,MAAM,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAE/B;IAED,2EAA2E;IAC3E,GAAG,IAAI,IAAI,CAKV;CAmCD"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// Residency of keyed documents (slice 6a §10, rule 23): which keyed documents are in memory, and the eviction of
|
|
2
|
+
// persisted ones nobody pinned and nobody read or wrote for the retention. One idle structure and one timer per
|
|
3
|
+
// object, Durable's (`Session.#touchDocument`): an insertion-ordered map whose oldest entry the timer waits for, a
|
|
4
|
+
// touch moving an entry to the back at most once per granule (O(1) per touch, no timer per key).
|
|
5
|
+
/** One keyed document in memory: its slot, its tracker and, persisted, what is stored of it. */
|
|
6
|
+
export class Resident {
|
|
7
|
+
slot;
|
|
8
|
+
key;
|
|
9
|
+
tracker;
|
|
10
|
+
stored;
|
|
11
|
+
/** The definition version the tracker's value is at: below the slot's, it migrates on its next access. */
|
|
12
|
+
version;
|
|
13
|
+
constructor(slot, key, tracker, stored, version) {
|
|
14
|
+
this.slot = slot;
|
|
15
|
+
this.key = key;
|
|
16
|
+
this.tracker = tracker;
|
|
17
|
+
this.stored = stored;
|
|
18
|
+
this.version = version;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/** How long an unpinned persisted keyed document stays in memory after its last read or write (slice 6a §10). */
|
|
22
|
+
export const RETENTION_MS = 10 * 60_000;
|
|
23
|
+
/** A touch moves an entry at most once per granule: a tenth of the retention, up to 1 s (Durable's rule). */
|
|
24
|
+
const GRANULE_MS = Math.min(1_000, RETENTION_MS / 10);
|
|
25
|
+
/** The idle persisted keyed documents of one object, oldest first, and the one timer evicting them. */
|
|
26
|
+
export class Residency {
|
|
27
|
+
/** Runs a sweep on the object's line. */
|
|
28
|
+
#onLine;
|
|
29
|
+
#idle = new Map();
|
|
30
|
+
/** The pending sweep: when it is due and its timer; stays set until its job runs on the line. */
|
|
31
|
+
#sweep;
|
|
32
|
+
#ended = false;
|
|
33
|
+
constructor(onLine) {
|
|
34
|
+
this.#onLine = onLine;
|
|
35
|
+
}
|
|
36
|
+
/** A use of an unpinned `resident`: it becomes the newest idle one (once per granule), and a sweep is scheduled. */
|
|
37
|
+
touch(resident) {
|
|
38
|
+
const now = Date.now();
|
|
39
|
+
const since = this.#idle.get(resident);
|
|
40
|
+
// A hot document moves at most once per granule: it may then leave up to a granule early (a reload).
|
|
41
|
+
if (since !== undefined && now - since < GRANULE_MS)
|
|
42
|
+
return;
|
|
43
|
+
this.#idle.delete(resident);
|
|
44
|
+
this.#idle.set(resident, now);
|
|
45
|
+
if (this.#sweep === undefined)
|
|
46
|
+
this.#schedule();
|
|
47
|
+
}
|
|
48
|
+
/** `resident` is pinned or left memory: it is no longer idle. */
|
|
49
|
+
forget(resident) {
|
|
50
|
+
this.#idle.delete(resident);
|
|
51
|
+
}
|
|
52
|
+
/** The object ended: nothing is evicted any more, the timer is cleared. */
|
|
53
|
+
end() {
|
|
54
|
+
this.#ended = true;
|
|
55
|
+
this.#idle.clear();
|
|
56
|
+
clearTimeout(this.#sweep?.timer);
|
|
57
|
+
this.#sweep = undefined;
|
|
58
|
+
}
|
|
59
|
+
/** Schedules the eviction of the oldest idle document when its retention expires. */
|
|
60
|
+
#schedule() {
|
|
61
|
+
const oldest = this.#idle.values().next();
|
|
62
|
+
if (this.#ended || oldest.done === true)
|
|
63
|
+
return;
|
|
64
|
+
const at = oldest.value + RETENTION_MS;
|
|
65
|
+
const sweep = { at, timer: undefined };
|
|
66
|
+
this.#sweep = sweep;
|
|
67
|
+
// A timer firing early sweeps nothing and schedules the next one.
|
|
68
|
+
sweep.timer = setTimeout(() => this.#onLine(() => {
|
|
69
|
+
if (this.#sweep === sweep)
|
|
70
|
+
this.#sweep = undefined;
|
|
71
|
+
this.#evictExpired();
|
|
72
|
+
}), Math.max(0, at - Date.now()));
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* On the line: evicts the idle documents whose retention passed, oldest first, then schedules the next sweep. No
|
|
76
|
+
* load in flight needs a pin against it: cold loads run on the line too, so a sweep never runs during one, and a
|
|
77
|
+
* load installing an unpinned key touches it (it is then the newest idle one).
|
|
78
|
+
*/
|
|
79
|
+
#evictExpired() {
|
|
80
|
+
if (this.#ended)
|
|
81
|
+
return;
|
|
82
|
+
const expired = Date.now() - RETENTION_MS;
|
|
83
|
+
for (const [resident, since] of this.#idle) {
|
|
84
|
+
if (since > expired)
|
|
85
|
+
break;
|
|
86
|
+
this.#idle.delete(resident);
|
|
87
|
+
resident.slot.evict(resident);
|
|
88
|
+
}
|
|
89
|
+
if (this.#sweep === undefined)
|
|
90
|
+
this.#schedule();
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=residency.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"residency.js","sourceRoot":"","sources":["../../../src/next/documents/residency.ts"],"names":[],"mappings":"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","sourcesContent":["// Residency of keyed documents (slice 6a §10, rule 23): which keyed documents are in memory, and the eviction of\n// persisted ones nobody pinned and nobody read or wrote for the retention. One idle structure and one timer per\n// object, Durable's (`Session.#touchDocument`): an insertion-ordered map whose oldest entry the timer waits for, a\n// touch moving an entry to the back at most once per granule (O(1) per touch, no timer per key).\n\nimport type { Tracker } from \"../../delta/index.ts\";\nimport type { JsonObject } from \"./definition.ts\";\nimport type { Stored } from \"./persistence.ts\";\n\n/** One keyed document in memory: its slot, its tracker and, persisted, what is stored of it. */\nexport class Resident {\n\treadonly slot: { evict(resident: Resident): void };\n\treadonly key: string;\n\ttracker: Tracker<JsonObject>;\n\tstored: Stored | undefined;\n\t/** The definition version the tracker's value is at: below the slot's, it migrates on its next access. */\n\tversion: number;\n\n\tconstructor(\n\t\tslot: { evict(resident: Resident): void },\n\t\tkey: string,\n\t\ttracker: Tracker<JsonObject>,\n\t\tstored: Stored | undefined,\n\t\tversion: number,\n\t) {\n\t\tthis.slot = slot;\n\t\tthis.key = key;\n\t\tthis.tracker = tracker;\n\t\tthis.stored = stored;\n\t\tthis.version = version;\n\t}\n}\n\n/** How long an unpinned persisted keyed document stays in memory after its last read or write (slice 6a §10). */\nexport const RETENTION_MS = 10 * 60_000;\n\n/** A touch moves an entry at most once per granule: a tenth of the retention, up to 1 s (Durable's rule). */\nconst GRANULE_MS = Math.min(1_000, RETENTION_MS / 10);\n\n/** The idle persisted keyed documents of one object, oldest first, and the one timer evicting them. */\nexport class Residency {\n\t/** Runs a sweep on the object's line. */\n\treadonly #onLine: (sweep: () => void) => void;\n\treadonly #idle = new Map<Resident, number>();\n\t/** The pending sweep: when it is due and its timer; stays set until its job runs on the line. */\n\t#sweep: { readonly at: number; timer: ReturnType<typeof setTimeout> | undefined } | undefined;\n\t#ended = false;\n\n\tconstructor(onLine: (sweep: () => void) => void) {\n\t\tthis.#onLine = onLine;\n\t}\n\n\t/** A use of an unpinned `resident`: it becomes the newest idle one (once per granule), and a sweep is scheduled. */\n\ttouch(resident: Resident): void {\n\t\tconst now = Date.now();\n\t\tconst since = this.#idle.get(resident);\n\t\t// A hot document moves at most once per granule: it may then leave up to a granule early (a reload).\n\t\tif (since !== undefined && now - since < GRANULE_MS) return;\n\t\tthis.#idle.delete(resident);\n\t\tthis.#idle.set(resident, now);\n\t\tif (this.#sweep === undefined) this.#schedule();\n\t}\n\n\t/** `resident` is pinned or left memory: it is no longer idle. */\n\tforget(resident: Resident): void {\n\t\tthis.#idle.delete(resident);\n\t}\n\n\t/** The object ended: nothing is evicted any more, the timer is cleared. */\n\tend(): void {\n\t\tthis.#ended = true;\n\t\tthis.#idle.clear();\n\t\tclearTimeout(this.#sweep?.timer);\n\t\tthis.#sweep = undefined;\n\t}\n\n\t/** Schedules the eviction of the oldest idle document when its retention expires. */\n\t#schedule(): void {\n\t\tconst oldest = this.#idle.values().next();\n\t\tif (this.#ended || oldest.done === true) return;\n\t\tconst at = oldest.value + RETENTION_MS;\n\t\tconst sweep: { readonly at: number; timer: ReturnType<typeof setTimeout> | undefined } = { at, timer: undefined };\n\t\tthis.#sweep = sweep;\n\t\t// A timer firing early sweeps nothing and schedules the next one.\n\t\tsweep.timer = setTimeout(\n\t\t\t() =>\n\t\t\t\tthis.#onLine(() => {\n\t\t\t\t\tif (this.#sweep === sweep) this.#sweep = undefined;\n\t\t\t\t\tthis.#evictExpired();\n\t\t\t\t}),\n\t\t\tMath.max(0, at - Date.now()),\n\t\t);\n\t}\n\n\t/**\n\t * On the line: evicts the idle documents whose retention passed, oldest first, then schedules the next sweep. No\n\t * load in flight needs a pin against it: cold loads run on the line too, so a sweep never runs during one, and a\n\t * load installing an unpinned key touches it (it is then the newest idle one).\n\t */\n\t#evictExpired(): void {\n\t\tif (this.#ended) return;\n\t\tconst expired = Date.now() - RETENTION_MS;\n\t\tfor (const [resident, since] of this.#idle) {\n\t\t\tif (since > expired) break;\n\t\t\tthis.#idle.delete(resident);\n\t\t\tresident.slot.evict(resident);\n\t\t}\n\t\tif (this.#sweep === undefined) this.#schedule();\n\t}\n}\n"]}
|