@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,506 @@
|
|
|
1
|
+
// The provider side of one origin on a link (§3, §22, W1; decision "Relay flow control per origin"): the holds the
|
|
2
|
+
// peer sent for that origin, served here or relayed, by their ids; the calls on them, at most this side's N at once;
|
|
3
|
+
// and the window: at most K unacknowledged `bound` and `state` messages of this host's own, with what waits meanwhile,
|
|
4
|
+
// and the sender of every message in flight, so each `ack` reaches the host that sent its message.
|
|
5
|
+
import { withAbortSignal } from "../../context/index.js";
|
|
6
|
+
import { ChordError, isChordError } from "../data/index.js";
|
|
7
|
+
import { DeflatedPart, oversized, parsePayload, payloadPart, wireError, } from "../link/internal.js";
|
|
8
|
+
import { Hold } from "./hold.js";
|
|
9
|
+
/** At most this many of this host's own `bound` and `state` messages unacknowledged per origin. */
|
|
10
|
+
const WINDOW = 2;
|
|
11
|
+
/**
|
|
12
|
+
* The provider side of one origin on a link. Ids are the origin's; a message naming an id this side does not know is
|
|
13
|
+
* ignored (Q1), one reusing a live id is a protocol error, and so are more concurrent calls than this side announced.
|
|
14
|
+
* This host's own `bound` and `state` messages go through the window: locally served holds wait while it is full
|
|
15
|
+
* (their ops in their members' pending queues, their bindings for the next slot). A relay forwards upstream messages
|
|
16
|
+
* at once (each upstream host keeps its own window for the origin it sees), so a slow consumer stalls only its origin.
|
|
17
|
+
*/
|
|
18
|
+
export class ProviderSide {
|
|
19
|
+
link;
|
|
20
|
+
/** Whose work this side serves: 0 for the peer's own, a relay's number for one of its downstream links. */
|
|
21
|
+
origin;
|
|
22
|
+
#calls = new Map();
|
|
23
|
+
#entries = new Map();
|
|
24
|
+
#limit;
|
|
25
|
+
/** The sender of each `bound` and `state` message in flight, in order: the consumer acknowledges in order. */
|
|
26
|
+
#sent = [];
|
|
27
|
+
/** This host's own messages in flight. */
|
|
28
|
+
#inFlight = 0;
|
|
29
|
+
/** The holds the current batch touched, in order; its flush sends or queues them. */
|
|
30
|
+
#touched = [];
|
|
31
|
+
/** Holds whose ops wait in their pending queues for a slot. */
|
|
32
|
+
#waiting = new Set();
|
|
33
|
+
/** Holds waiting for a slot to send their first binding. */
|
|
34
|
+
#binding = new Set();
|
|
35
|
+
/** The waiting bindings take the next slot: the last one went to waiting state while they waited. */
|
|
36
|
+
#bindingTurn = false;
|
|
37
|
+
/** Set once a hold of this origin is relayed. */
|
|
38
|
+
#relay;
|
|
39
|
+
constructor(link, origin, limit) {
|
|
40
|
+
this.link = link;
|
|
41
|
+
this.origin = origin;
|
|
42
|
+
this.#limit = limit;
|
|
43
|
+
}
|
|
44
|
+
/** Handles one message of this origin; a call whose arguments wait for an asynchronous inflate returns its promise. */
|
|
45
|
+
message(message) {
|
|
46
|
+
switch (message.kind) {
|
|
47
|
+
case "hold":
|
|
48
|
+
this.#hold(message);
|
|
49
|
+
break;
|
|
50
|
+
case "release":
|
|
51
|
+
this.#release(message.hold);
|
|
52
|
+
this.#settle();
|
|
53
|
+
break;
|
|
54
|
+
case "call":
|
|
55
|
+
return this.#call(message);
|
|
56
|
+
case "abort":
|
|
57
|
+
this.#abort(message.call);
|
|
58
|
+
this.#settle();
|
|
59
|
+
break;
|
|
60
|
+
case "retry":
|
|
61
|
+
this.#entries.get(message.hold)?.retry(message);
|
|
62
|
+
break;
|
|
63
|
+
case "ack":
|
|
64
|
+
this.#ack();
|
|
65
|
+
this.#settle();
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* The link closed, or the origin did (`closed`): every hold is released (relayed ones by one `closed` to each
|
|
71
|
+
* upstream link) and every call aborted.
|
|
72
|
+
*/
|
|
73
|
+
closed() {
|
|
74
|
+
const closing = this.link.host.closing;
|
|
75
|
+
const entries = [...this.#entries.values()];
|
|
76
|
+
this.#entries.clear();
|
|
77
|
+
const closed = new ChordError({ code: "unavailable", message: "the link closed" });
|
|
78
|
+
for (const call of this.#calls.values())
|
|
79
|
+
if (call.kind === "served")
|
|
80
|
+
call.abort.abort(closed);
|
|
81
|
+
this.#calls.clear();
|
|
82
|
+
// While the host closes, it ends its objects itself.
|
|
83
|
+
for (const entry of entries) {
|
|
84
|
+
if (entry.kind === "served" && !closing)
|
|
85
|
+
entry.release();
|
|
86
|
+
else
|
|
87
|
+
entry.drop();
|
|
88
|
+
}
|
|
89
|
+
// A batch flushing later finds nothing of this side.
|
|
90
|
+
this.#touched = [];
|
|
91
|
+
const relay = this.#relay;
|
|
92
|
+
if (relay === undefined)
|
|
93
|
+
return;
|
|
94
|
+
this.link.host.relays.delete(relay.origin);
|
|
95
|
+
for (const link of relay.links)
|
|
96
|
+
link.send({ kind: "closed", origin: relay.origin });
|
|
97
|
+
}
|
|
98
|
+
/** Sends `message` on the link with this origin. */
|
|
99
|
+
send(message) {
|
|
100
|
+
this.link.send(this.origin === 0 ? message : { ...message, origin: this.origin });
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Ends with `error` every hold of this origin that acts for a principal `revoked` names and holds nothing: served
|
|
104
|
+
* here but unbound (before the publication, refused), or relayed and waiting for its route's link.
|
|
105
|
+
*/
|
|
106
|
+
revokeUnbound(revoked, error) {
|
|
107
|
+
for (const hold of [...this.#entries.values()]) {
|
|
108
|
+
// A hold arriving on a link acts for a principal: the link's, or one its parent named.
|
|
109
|
+
if (!revoked(hold.caller.principal))
|
|
110
|
+
continue;
|
|
111
|
+
if (hold.kind === "served" && hold.unbound)
|
|
112
|
+
hold.end(error);
|
|
113
|
+
else if (hold.kind === "relayed" && hold.waiting)
|
|
114
|
+
hold.revoked(error);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/** A pending hold turned out to be relayed: it takes the hold's place in the table. */
|
|
118
|
+
relayed(hold) {
|
|
119
|
+
this.#entries.set(hold.id, hold);
|
|
120
|
+
}
|
|
121
|
+
/** This origin's number on upstream links (one per host, never reused), with `link` as one it relays to. */
|
|
122
|
+
relayTo(link) {
|
|
123
|
+
let relay = this.#relay;
|
|
124
|
+
if (relay === undefined) {
|
|
125
|
+
relay = { origin: this.link.host.relayOrigin(this), links: new Set() };
|
|
126
|
+
this.#relay = relay;
|
|
127
|
+
}
|
|
128
|
+
relay.links.add(link);
|
|
129
|
+
return relay.origin;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* A message from upstream link `from` for this origin's relayed holds, forwarded with this origin: `bound` and
|
|
133
|
+
* `state` join the window's senders (their `ack` goes back to `from`), a reply ends its call, `gone` forgets its
|
|
134
|
+
* hold. A link answers only for what was relayed over it: an entry, a notice or a reply naming a hold (or a call)
|
|
135
|
+
* this origin did not relay over `from` is dropped (Q1); a `bound` or `state` left without entries is acknowledged
|
|
136
|
+
* to `from` at once. Parts travel unchecked and unparsed: the end that parses a part checks it against its own
|
|
137
|
+
* link's limits.
|
|
138
|
+
*/
|
|
139
|
+
forward(message, from) {
|
|
140
|
+
const relay = this.#relay;
|
|
141
|
+
if (relay === undefined || !relay.links.has(from))
|
|
142
|
+
return;
|
|
143
|
+
const { origin: _, ...forwarded } = message;
|
|
144
|
+
switch (forwarded.kind) {
|
|
145
|
+
case "bound":
|
|
146
|
+
case "state": {
|
|
147
|
+
const holds = this.#relayedOver(forwarded.holds, from);
|
|
148
|
+
if (holds.length === 0) {
|
|
149
|
+
from.send({ kind: "ack", origin: relay.origin });
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
this.#sent.push(from);
|
|
153
|
+
// The entries of the message's own kind.
|
|
154
|
+
this.send(holds === forwarded.holds ? forwarded : { ...forwarded, holds });
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
case "result":
|
|
158
|
+
case "error": {
|
|
159
|
+
const call = this.#calls.get(forwarded.call);
|
|
160
|
+
if (call?.kind === "relayed" && call.hold.heldOn(from))
|
|
161
|
+
this.reply(forwarded.call, forwarded);
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
case "gone": {
|
|
165
|
+
const hold = this.#relayedHold(forwarded.hold, from);
|
|
166
|
+
if (hold === undefined)
|
|
167
|
+
return;
|
|
168
|
+
hold.lost();
|
|
169
|
+
this.send(forwarded);
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
default:
|
|
173
|
+
if (this.#relayedHold(forwarded.hold, from) !== undefined)
|
|
174
|
+
this.send(forwarded);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/** An upstream link closed: nothing more is relayed to it, nor accepted from it. */
|
|
178
|
+
unlinked(link) {
|
|
179
|
+
this.#relay?.links.delete(link);
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* The upstream link of relayed hold `hold` dropped with `error`: its calls in flight fail, the hold goes loading
|
|
183
|
+
* downstream, and its path's next link holds it again.
|
|
184
|
+
*/
|
|
185
|
+
upstreamDropped(hold, error) {
|
|
186
|
+
for (const [id, call] of this.#calls) {
|
|
187
|
+
if (call.hold === hold)
|
|
188
|
+
this.reply(id, { kind: "error", call: id, error: wireError(error) });
|
|
189
|
+
}
|
|
190
|
+
this.send({ kind: "loading", hold: hold.id });
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Forgets a hold (released, refused or gone) and every call on it; local calls are aborted with `error` (its
|
|
194
|
+
* object's end for a gone hold, `released` otherwise).
|
|
195
|
+
*/
|
|
196
|
+
forget(hold, error) {
|
|
197
|
+
if (this.#entries.get(hold.id) === hold)
|
|
198
|
+
this.#entries.delete(hold.id);
|
|
199
|
+
const reason = error ?? new ChordError({ code: "released", message: `hold ${hold.id}: released` });
|
|
200
|
+
for (const [id, call] of this.#calls) {
|
|
201
|
+
if (call.hold !== hold)
|
|
202
|
+
continue;
|
|
203
|
+
this.#calls.delete(id);
|
|
204
|
+
if (call.kind === "served")
|
|
205
|
+
call.abort.abort(reason);
|
|
206
|
+
}
|
|
207
|
+
if (hold.kind === "served")
|
|
208
|
+
this.unbind(hold);
|
|
209
|
+
this.#settle();
|
|
210
|
+
}
|
|
211
|
+
/** A call ended with `reply` (a result or an error): its slot is free; nothing is sent for one already gone. */
|
|
212
|
+
reply(id, reply) {
|
|
213
|
+
if (!this.#calls.delete(id))
|
|
214
|
+
return;
|
|
215
|
+
this.send(reply);
|
|
216
|
+
this.#settle();
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Drops this side from its link once it holds nothing: no holds, no calls, nothing in flight. Its origin's next hold
|
|
220
|
+
* makes a new one (origins are never reused), so a long-lived link keeps records only for live work.
|
|
221
|
+
*/
|
|
222
|
+
#settle() {
|
|
223
|
+
if (this.#entries.size === 0 && this.#calls.size === 0 && this.#sent.length === 0)
|
|
224
|
+
this.link.drop(this);
|
|
225
|
+
}
|
|
226
|
+
/** A hold's object is live: its `bound` goes now when a slot is free, else with the next free slot's bindings. */
|
|
227
|
+
bind(hold, context) {
|
|
228
|
+
if (this.#free) {
|
|
229
|
+
this.#sendOwn({ kind: "bound", holds: [hold.boundEntry(context)] });
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
this.#binding.add(hold);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
/** A hold stopped waiting for a slot: it was forgotten. */
|
|
236
|
+
unbind(hold) {
|
|
237
|
+
this.#waiting.delete(hold);
|
|
238
|
+
this.#binding.delete(hold);
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* A served hold left its object's binding (slice 7b §6, model §5): its unsent pending ops and a queued `bound` are
|
|
242
|
+
* dropped (the ack slots of messages already sent stay until their `ack`), its calls in flight rejected with `error`
|
|
243
|
+
* (each slot freed once).
|
|
244
|
+
*/
|
|
245
|
+
unbound(hold, error) {
|
|
246
|
+
this.unbind(hold);
|
|
247
|
+
for (const [id, call] of this.#calls) {
|
|
248
|
+
if (call.hold !== hold)
|
|
249
|
+
continue;
|
|
250
|
+
if (call.kind === "served")
|
|
251
|
+
call.abort.abort(error);
|
|
252
|
+
this.reply(id, { kind: "error", call: id, error: wireError(error) });
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
/** A hold's members changed in the current batch; its flush sends or queues it. */
|
|
256
|
+
touched(hold) {
|
|
257
|
+
if (this.#touched.length === 0)
|
|
258
|
+
this.link.host.batch.flushing((context) => this.#flush(context));
|
|
259
|
+
this.#touched.push(hold);
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* `entries` whose holds this origin relayed over `from`, in one pass: the same array when all are, else a copy made
|
|
263
|
+
* at the first one that is not.
|
|
264
|
+
*/
|
|
265
|
+
#relayedOver(entries, from) {
|
|
266
|
+
let kept;
|
|
267
|
+
for (let i = 0; i < entries.length; i++) {
|
|
268
|
+
const entry = entries[i];
|
|
269
|
+
const relayed = this.#relayedHold(entry.hold, from) !== undefined;
|
|
270
|
+
if (kept !== undefined) {
|
|
271
|
+
if (relayed)
|
|
272
|
+
kept.push(entry);
|
|
273
|
+
}
|
|
274
|
+
else if (!relayed) {
|
|
275
|
+
kept = entries.slice(0, i);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
return kept ?? entries;
|
|
279
|
+
}
|
|
280
|
+
/** The hold `id` of this origin when it is relayed over `from`. */
|
|
281
|
+
#relayedHold(id, from) {
|
|
282
|
+
const hold = this.#entries.get(id);
|
|
283
|
+
return hold?.kind === "relayed" && hold.heldOn(from) ? hold : undefined;
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* A hold message: a protocol error for a live id or compressed params (params are never compressed), otherwise
|
|
287
|
+
* admitted (`Hold.start`, placed once the host published). Its activation chain is kept only from a trusted link (Q5); its
|
|
288
|
+
* decoded limit is the link's, or the smaller one a parent stamped (Q2), and travels with it when it is relayed.
|
|
289
|
+
*/
|
|
290
|
+
#hold(message) {
|
|
291
|
+
if (this.#entries.has(message.hold))
|
|
292
|
+
throw new Error(`hold ${message.hold}: the id is in use`);
|
|
293
|
+
if (message.params instanceof DeflatedPart)
|
|
294
|
+
throw new Error(`hold ${message.hold}: compressed params`);
|
|
295
|
+
// Whom it acts for is decided here once (`#caller`), never passed on: a relay names it only on a route link.
|
|
296
|
+
const { kind: _kind, origin: _origin, hold: id, principal: _principal, incarnation: _incarnation, chain, limit: stamped, ...fields } = message;
|
|
297
|
+
const { link } = this;
|
|
298
|
+
const limit = Math.min(link.limits.decoded, (link.role === "parent" ? stamped : undefined) ?? Infinity);
|
|
299
|
+
const request = {
|
|
300
|
+
...fields,
|
|
301
|
+
...(chain !== undefined && link.trusted ? { chain } : {}),
|
|
302
|
+
...(limit === Infinity ? {} : { limit }),
|
|
303
|
+
};
|
|
304
|
+
const limits = limit === link.limits.decoded ? link.limits : { part: link.limits.part, decoded: limit };
|
|
305
|
+
const hold = new Hold(id, this, this.#caller(message), limits);
|
|
306
|
+
this.#entries.set(id, hold);
|
|
307
|
+
hold.start(request);
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Whom a hold acts for: on a parent link the hold's own principal and incarnation when it names them, everywhere
|
|
311
|
+
* else the link's principal and the peer's incarnation (a child cannot claim to be someone else).
|
|
312
|
+
*/
|
|
313
|
+
#caller(message) {
|
|
314
|
+
const { link } = this;
|
|
315
|
+
if (link.role !== "parent")
|
|
316
|
+
return { principal: link.principal, incarnation: link.peer };
|
|
317
|
+
// The message schema checked a principal's shape on an untrusted link; a trusted parent is believed.
|
|
318
|
+
const principal = message.principal ?? link.principal;
|
|
319
|
+
return { principal, incarnation: message.incarnation ?? link.peer };
|
|
320
|
+
}
|
|
321
|
+
#release(id) {
|
|
322
|
+
const hold = this.#entries.get(id);
|
|
323
|
+
if (hold === undefined)
|
|
324
|
+
return;
|
|
325
|
+
this.forget(hold);
|
|
326
|
+
hold.release();
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* A call: one on a hold this side does not know is ignored (Q1), more than this side's N at once and compressed
|
|
330
|
+
* arguments from a child (clients never compress) are protocol errors. On a relayed hold it is forwarded, its
|
|
331
|
+
* arguments checked against this link's part limit first (the bytes are here). On a served hold that is not bound
|
|
332
|
+
* yet (nor binding afresh after a swap) it is refused `not_ready`; its method is an index into the bound variant (one
|
|
333
|
+
* outside it is a protocol error) and its arguments are opened and parsed here within the hold's limits (past one
|
|
334
|
+
* the call fails `too_large/part`; a malformed part is a protocol error), absent ones `null`. Arguments this host
|
|
335
|
+
* must inflate asynchronously are inflated first, then the call is handled again.
|
|
336
|
+
*/
|
|
337
|
+
#call(message) {
|
|
338
|
+
if (this.#calls.has(message.call))
|
|
339
|
+
throw new Error(`call ${message.call}: the id is in use`);
|
|
340
|
+
const hold = this.#entries.get(message.hold);
|
|
341
|
+
if (hold === undefined)
|
|
342
|
+
return;
|
|
343
|
+
if (this.#calls.size >= this.#limit)
|
|
344
|
+
throw new Error(`call ${message.call}: more than ${this.#limit} calls`);
|
|
345
|
+
const { args: part, segments } = message;
|
|
346
|
+
if (part instanceof DeflatedPart && this.link.role === "child") {
|
|
347
|
+
throw new Error(`call ${message.call}: compressed arguments from a child`);
|
|
348
|
+
}
|
|
349
|
+
if (hold.kind === "relayed") {
|
|
350
|
+
const error = part === undefined ? undefined : oversized(part, this.link.limits.part);
|
|
351
|
+
if (error !== undefined) {
|
|
352
|
+
this.#refuse(message.call, error);
|
|
353
|
+
return;
|
|
354
|
+
}
|
|
355
|
+
this.#calls.set(message.call, { kind: "relayed", hold });
|
|
356
|
+
hold.call(message);
|
|
357
|
+
return;
|
|
358
|
+
}
|
|
359
|
+
if (!hold.callable) {
|
|
360
|
+
this.#refuse(message.call, new ChordError({ code: "not_ready", message: `hold ${hold.id}: not bound yet` }));
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
const method = hold.method(message.method);
|
|
364
|
+
if (this.link.inflates(part, hold.limits)) {
|
|
365
|
+
return this.link.inflate([[part, hold.limits.decoded]], () => this.#call(message));
|
|
366
|
+
}
|
|
367
|
+
let json;
|
|
368
|
+
try {
|
|
369
|
+
json = part === undefined ? undefined : this.link.openPart(part, hold.limits, this.link.context);
|
|
370
|
+
}
|
|
371
|
+
catch (error) {
|
|
372
|
+
if (!isChordError(error, "too_large"))
|
|
373
|
+
throw error;
|
|
374
|
+
this.#refuse(message.call, error);
|
|
375
|
+
return;
|
|
376
|
+
}
|
|
377
|
+
const args = json === undefined ? null : parsePayload(json, segments);
|
|
378
|
+
const call = { kind: "served", hold, bytes: method.resultBytes, abort: new AbortController() };
|
|
379
|
+
this.#calls.set(message.call, call);
|
|
380
|
+
void this.#run(message.call, call, method.name, args);
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* Runs a call and sends its result (absent when `null`) or error, unless it was aborted, released or gone
|
|
384
|
+
* meanwhile. A result that cannot be encoded is sent as its error.
|
|
385
|
+
*/
|
|
386
|
+
async #run(id, call, method, args) {
|
|
387
|
+
let reply;
|
|
388
|
+
try {
|
|
389
|
+
// A link's context has no abort signal, so this is the call's own signal: no `AbortSignal.any` per call.
|
|
390
|
+
const result = await call.hold.call(method, args, withAbortSignal(call.abort.signal, this.link.context));
|
|
391
|
+
// Results are not validated: they are the provider's.
|
|
392
|
+
reply =
|
|
393
|
+
result === null || result === undefined
|
|
394
|
+
? { kind: "result", call: id }
|
|
395
|
+
: this.#result(id, result, call.bytes, this.link.context);
|
|
396
|
+
}
|
|
397
|
+
catch (error) {
|
|
398
|
+
reply = { kind: "error", call: id, error: wireError(error) };
|
|
399
|
+
}
|
|
400
|
+
this.reply(id, reply);
|
|
401
|
+
}
|
|
402
|
+
/** Answers call `id` with `error` before it was admitted: it took no slot. */
|
|
403
|
+
#refuse(id, error) {
|
|
404
|
+
this.send({ kind: "error", call: id, error: wireError(error) });
|
|
405
|
+
}
|
|
406
|
+
#abort(id) {
|
|
407
|
+
const call = this.#calls.get(id);
|
|
408
|
+
if (call === undefined)
|
|
409
|
+
return;
|
|
410
|
+
this.#calls.delete(id);
|
|
411
|
+
if (call.kind === "relayed")
|
|
412
|
+
call.hold.abort(id);
|
|
413
|
+
else
|
|
414
|
+
call.abort.abort(new ChordError({ code: "aborted", message: `call ${id}: aborted by its caller` }));
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* An `ack` answers the oldest message in flight: this host's own frees a slot, a relayed one is acknowledged to its
|
|
418
|
+
* upstream link (closed meanwhile: nothing to do). An ack crossing nothing in flight is ignored.
|
|
419
|
+
*/
|
|
420
|
+
#ack() {
|
|
421
|
+
const sender = this.#sent.shift();
|
|
422
|
+
if (sender === undefined)
|
|
423
|
+
return;
|
|
424
|
+
if (sender !== "local") {
|
|
425
|
+
// A relayed message implies the relay's number.
|
|
426
|
+
sender.send({ kind: "ack", origin: this.#relay.origin });
|
|
427
|
+
return;
|
|
428
|
+
}
|
|
429
|
+
this.#inFlight--;
|
|
430
|
+
this.#slotFreed();
|
|
431
|
+
}
|
|
432
|
+
/**
|
|
433
|
+
* The end of a batch: while a slot is free and nothing waits, one `state` message with an entry per touched hold;
|
|
434
|
+
* otherwise each touched hold's ops join its pending queues until a slot frees.
|
|
435
|
+
*/
|
|
436
|
+
#flush(context) {
|
|
437
|
+
const holds = this.#touched;
|
|
438
|
+
// The side closed during the batch: nothing is sent.
|
|
439
|
+
if (holds.length === 0)
|
|
440
|
+
return;
|
|
441
|
+
this.#touched = [];
|
|
442
|
+
// A hold touched in this batch may have left its binding since (a reload unbound it).
|
|
443
|
+
if (this.#free) {
|
|
444
|
+
const entries = [];
|
|
445
|
+
for (const hold of holds)
|
|
446
|
+
if (hold.bound)
|
|
447
|
+
entries.push(hold.entry(context));
|
|
448
|
+
if (entries.length > 0)
|
|
449
|
+
this.#sendOwn({ kind: "state", holds: entries });
|
|
450
|
+
return;
|
|
451
|
+
}
|
|
452
|
+
// A bound hold never waits for its binding.
|
|
453
|
+
for (const hold of holds) {
|
|
454
|
+
if (!hold.bound)
|
|
455
|
+
continue;
|
|
456
|
+
hold.queue();
|
|
457
|
+
this.#waiting.add(hold);
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
/** Whether this host's next message goes out now: a slot is free and nothing waits for one. */
|
|
461
|
+
get #free() {
|
|
462
|
+
return this.#binding.size === 0 && this.#waiting.size === 0 && this.#inFlight < WINDOW;
|
|
463
|
+
}
|
|
464
|
+
/**
|
|
465
|
+
* A slot may be free: while there is room, the waiting state goes out as one message and the waiting bindings as
|
|
466
|
+
* one `bound`, taking turns when both wait (state first), so neither a hold that keeps changing nor a stream of new
|
|
467
|
+
* holds starves the other.
|
|
468
|
+
*/
|
|
469
|
+
#slotFreed() {
|
|
470
|
+
const context = this.link.context;
|
|
471
|
+
while (this.#inFlight < WINDOW) {
|
|
472
|
+
if (this.#binding.size > 0 && (this.#waiting.size === 0 || this.#bindingTurn)) {
|
|
473
|
+
const holds = [...this.#binding];
|
|
474
|
+
this.#binding.clear();
|
|
475
|
+
this.#bindingTurn = false;
|
|
476
|
+
// Every snapshot in one synchronous step: the binding shows all of them at one moment.
|
|
477
|
+
this.#sendOwn({ kind: "bound", holds: holds.map((hold) => hold.boundEntry(context)) });
|
|
478
|
+
}
|
|
479
|
+
else if (this.#waiting.size > 0) {
|
|
480
|
+
const holds = [...this.#waiting];
|
|
481
|
+
this.#waiting.clear();
|
|
482
|
+
this.#bindingTurn = this.#binding.size > 0;
|
|
483
|
+
this.#sendOwn({ kind: "state", holds: holds.map((hold) => hold.pendingEntry(context)) });
|
|
484
|
+
}
|
|
485
|
+
else {
|
|
486
|
+
return;
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
/**
|
|
491
|
+
* A call's result message, its part deflated above the threshold when this host compresses; with byte segments when
|
|
492
|
+
* its method's result schema has a `bytes()` leaf.
|
|
493
|
+
*/
|
|
494
|
+
#result(id, result, bytes, context) {
|
|
495
|
+
const { json, segments } = payloadPart(result, bytes);
|
|
496
|
+
const value = this.link.part(json, context);
|
|
497
|
+
return { kind: "result", call: id, value, ...(segments === undefined ? {} : { segments }) };
|
|
498
|
+
}
|
|
499
|
+
/** Sends one of this host's own `bound` or `state` messages, taking a slot. */
|
|
500
|
+
#sendOwn(message) {
|
|
501
|
+
this.#inFlight++;
|
|
502
|
+
this.#sent.push("local");
|
|
503
|
+
this.send(message);
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/next/remote/provider.ts"],"names":[],"mappings":"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","sourcesContent":["// The provider side of one origin on a link (§3, §22, W1; decision \"Relay flow control per origin\"): the holds the\n// peer sent for that origin, served here or relayed, by their ids; the calls on them, at most this side's N at once;\n// and the window: at most K unacknowledged `bound` and `state` messages of this host's own, with what waits meanwhile,\n// and the sender of every message in flight, so each `ack` reaches the host that sent its message.\n\nimport { type Context, withAbortSignal } from \"../../context/index.ts\";\nimport { ChordError, isChordError, type Principal } from \"../data/index.ts\";\nimport type { Caller } from \"../host/internal.ts\";\nimport {\n\ttype BoundEntry,\n\ttype ConsumerMessage,\n\tDeflatedPart,\n\ttype Message,\n\ttype OriginMessage,\n\toversized,\n\ttype ProviderMessage,\n\tparsePayload,\n\tpayloadPart,\n\ttype StateEntry,\n\twireError,\n} from \"../link/internal.ts\";\nimport { Hold } from \"./hold.ts\";\nimport type { HostLink } from \"./host-link.ts\";\nimport type { RelayedHold } from \"./relay.ts\";\n\n/**\n * A call being handled: on a hold served here, with whether its result carries byte segments and the abort of its\n * handler's context; or relayed, its reply forwarded from upstream.\n */\ntype RunningCall =\n\t| { readonly kind: \"served\"; readonly hold: Hold; readonly bytes: boolean; readonly abort: AbortController }\n\t| { readonly kind: \"relayed\"; readonly hold: RelayedHold };\n\n/** Who sent a `bound` or `state` message in flight: this host, or the upstream link a relay forwarded it from. */\ntype Sender = \"local\" | HostLink;\n\n/** A relaying origin: its number on upstream links, and the open upstream links it relayed holds to. */\ntype Relay = { readonly origin: number; readonly links: Set<HostLink> };\n\n/** At most this many of this host's own `bound` and `state` messages unacknowledged per origin. */\nconst WINDOW = 2;\n\n/**\n * The provider side of one origin on a link. Ids are the origin's; a message naming an id this side does not know is\n * ignored (Q1), one reusing a live id is a protocol error, and so are more concurrent calls than this side announced.\n * This host's own `bound` and `state` messages go through the window: locally served holds wait while it is full\n * (their ops in their members' pending queues, their bindings for the next slot). A relay forwards upstream messages\n * at once (each upstream host keeps its own window for the origin it sees), so a slow consumer stalls only its origin.\n */\nexport class ProviderSide {\n\treadonly link: HostLink;\n\t/** Whose work this side serves: 0 for the peer's own, a relay's number for one of its downstream links. */\n\treadonly origin: number;\n\treadonly #calls = new Map<number, RunningCall>();\n\treadonly #entries = new Map<number, Hold | RelayedHold>();\n\treadonly #limit: number;\n\t/** The sender of each `bound` and `state` message in flight, in order: the consumer acknowledges in order. */\n\treadonly #sent: Sender[] = [];\n\t/** This host's own messages in flight. */\n\t#inFlight = 0;\n\t/** The holds the current batch touched, in order; its flush sends or queues them. */\n\t#touched: Hold[] = [];\n\t/** Holds whose ops wait in their pending queues for a slot. */\n\treadonly #waiting = new Set<Hold>();\n\t/** Holds waiting for a slot to send their first binding. */\n\treadonly #binding = new Set<Hold>();\n\t/** The waiting bindings take the next slot: the last one went to waiting state while they waited. */\n\t#bindingTurn = false;\n\t/** Set once a hold of this origin is relayed. */\n\t#relay: Relay | undefined;\n\n\tconstructor(link: HostLink, origin: number, limit: number) {\n\t\tthis.link = link;\n\t\tthis.origin = origin;\n\t\tthis.#limit = limit;\n\t}\n\n\t/** Handles one message of this origin; a call whose arguments wait for an asynchronous inflate returns its promise. */\n\tmessage(message: ProviderMessage): void | Promise<void> {\n\t\tswitch (message.kind) {\n\t\t\tcase \"hold\":\n\t\t\t\tthis.#hold(message);\n\t\t\t\tbreak;\n\t\t\tcase \"release\":\n\t\t\t\tthis.#release(message.hold);\n\t\t\t\tthis.#settle();\n\t\t\t\tbreak;\n\t\t\tcase \"call\":\n\t\t\t\treturn this.#call(message);\n\t\t\tcase \"abort\":\n\t\t\t\tthis.#abort(message.call);\n\t\t\t\tthis.#settle();\n\t\t\t\tbreak;\n\t\t\tcase \"retry\":\n\t\t\t\tthis.#entries.get(message.hold)?.retry(message);\n\t\t\t\tbreak;\n\t\t\tcase \"ack\":\n\t\t\t\tthis.#ack();\n\t\t\t\tthis.#settle();\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/**\n\t * The link closed, or the origin did (`closed`): every hold is released (relayed ones by one `closed` to each\n\t * upstream link) and every call aborted.\n\t */\n\tclosed(): void {\n\t\tconst closing = this.link.host.closing;\n\t\tconst entries = [...this.#entries.values()];\n\t\tthis.#entries.clear();\n\t\tconst closed = new ChordError({ code: \"unavailable\", message: \"the link closed\" });\n\t\tfor (const call of this.#calls.values()) if (call.kind === \"served\") call.abort.abort(closed);\n\t\tthis.#calls.clear();\n\t\t// While the host closes, it ends its objects itself.\n\t\tfor (const entry of entries) {\n\t\t\tif (entry.kind === \"served\" && !closing) entry.release();\n\t\t\telse entry.drop();\n\t\t}\n\t\t// A batch flushing later finds nothing of this side.\n\t\tthis.#touched = [];\n\t\tconst relay = this.#relay;\n\t\tif (relay === undefined) return;\n\t\tthis.link.host.relays.delete(relay.origin);\n\t\tfor (const link of relay.links) link.send({ kind: \"closed\", origin: relay.origin });\n\t}\n\n\t/** Sends `message` on the link with this origin. */\n\tsend(message: OriginMessage): void {\n\t\tthis.link.send(this.origin === 0 ? message : { ...message, origin: this.origin });\n\t}\n\n\t/**\n\t * Ends with `error` every hold of this origin that acts for a principal `revoked` names and holds nothing: served\n\t * here but unbound (before the publication, refused), or relayed and waiting for its route's link.\n\t */\n\trevokeUnbound(revoked: (principal: Principal) => boolean, error: ChordError): void {\n\t\tfor (const hold of [...this.#entries.values()]) {\n\t\t\t// A hold arriving on a link acts for a principal: the link's, or one its parent named.\n\t\t\tif (!revoked(hold.caller.principal!)) continue;\n\t\t\tif (hold.kind === \"served\" && hold.unbound) hold.end(error);\n\t\t\telse if (hold.kind === \"relayed\" && hold.waiting) hold.revoked(error);\n\t\t}\n\t}\n\n\t/** A pending hold turned out to be relayed: it takes the hold's place in the table. */\n\trelayed(hold: RelayedHold): void {\n\t\tthis.#entries.set(hold.id, hold);\n\t}\n\n\t/** This origin's number on upstream links (one per host, never reused), with `link` as one it relays to. */\n\trelayTo(link: HostLink): number {\n\t\tlet relay = this.#relay;\n\t\tif (relay === undefined) {\n\t\t\trelay = { origin: this.link.host.relayOrigin(this), links: new Set() };\n\t\t\tthis.#relay = relay;\n\t\t}\n\t\trelay.links.add(link);\n\t\treturn relay.origin;\n\t}\n\n\t/**\n\t * A message from upstream link `from` for this origin's relayed holds, forwarded with this origin: `bound` and\n\t * `state` join the window's senders (their `ack` goes back to `from`), a reply ends its call, `gone` forgets its\n\t * hold. A link answers only for what was relayed over it: an entry, a notice or a reply naming a hold (or a call)\n\t * this origin did not relay over `from` is dropped (Q1); a `bound` or `state` left without entries is acknowledged\n\t * to `from` at once. Parts travel unchecked and unparsed: the end that parses a part checks it against its own\n\t * link's limits.\n\t */\n\tforward(message: ConsumerMessage, from: HostLink): void {\n\t\tconst relay = this.#relay;\n\t\tif (relay === undefined || !relay.links.has(from)) return;\n\t\tconst { origin: _, ...forwarded } = message;\n\t\tswitch (forwarded.kind) {\n\t\t\tcase \"bound\":\n\t\t\tcase \"state\": {\n\t\t\t\tconst holds = this.#relayedOver<BoundEntry | StateEntry>(forwarded.holds, from);\n\t\t\t\tif (holds.length === 0) {\n\t\t\t\t\tfrom.send({ kind: \"ack\", origin: relay.origin });\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.#sent.push(from);\n\t\t\t\t// The entries of the message's own kind.\n\t\t\t\tthis.send(holds === forwarded.holds ? forwarded : ({ ...forwarded, holds } as typeof forwarded));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"result\":\n\t\t\tcase \"error\": {\n\t\t\t\tconst call = this.#calls.get(forwarded.call);\n\t\t\t\tif (call?.kind === \"relayed\" && call.hold.heldOn(from)) this.reply(forwarded.call, forwarded);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"gone\": {\n\t\t\t\tconst hold = this.#relayedHold(forwarded.hold, from);\n\t\t\t\tif (hold === undefined) return;\n\t\t\t\thold.lost();\n\t\t\t\tthis.send(forwarded);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tif (this.#relayedHold(forwarded.hold, from) !== undefined) this.send(forwarded);\n\t\t}\n\t}\n\n\t/** An upstream link closed: nothing more is relayed to it, nor accepted from it. */\n\tunlinked(link: HostLink): void {\n\t\tthis.#relay?.links.delete(link);\n\t}\n\n\t/**\n\t * The upstream link of relayed hold `hold` dropped with `error`: its calls in flight fail, the hold goes loading\n\t * downstream, and its path's next link holds it again.\n\t */\n\tupstreamDropped(hold: RelayedHold, error: ChordError): void {\n\t\tfor (const [id, call] of this.#calls) {\n\t\t\tif (call.hold === hold) this.reply(id, { kind: \"error\", call: id, error: wireError(error) });\n\t\t}\n\t\tthis.send({ kind: \"loading\", hold: hold.id });\n\t}\n\n\t/**\n\t * Forgets a hold (released, refused or gone) and every call on it; local calls are aborted with `error` (its\n\t * object's end for a gone hold, `released` otherwise).\n\t */\n\tforget(hold: Hold | RelayedHold, error?: ChordError): void {\n\t\tif (this.#entries.get(hold.id) === hold) this.#entries.delete(hold.id);\n\t\tconst reason = error ?? new ChordError({ code: \"released\", message: `hold ${hold.id}: released` });\n\t\tfor (const [id, call] of this.#calls) {\n\t\t\tif (call.hold !== hold) continue;\n\t\t\tthis.#calls.delete(id);\n\t\t\tif (call.kind === \"served\") call.abort.abort(reason);\n\t\t}\n\t\tif (hold.kind === \"served\") this.unbind(hold);\n\t\tthis.#settle();\n\t}\n\n\t/** A call ended with `reply` (a result or an error): its slot is free; nothing is sent for one already gone. */\n\treply(id: number, reply: Extract<OriginMessage, { readonly kind: \"result\" | \"error\" }>): void {\n\t\tif (!this.#calls.delete(id)) return;\n\t\tthis.send(reply);\n\t\tthis.#settle();\n\t}\n\n\t/**\n\t * Drops this side from its link once it holds nothing: no holds, no calls, nothing in flight. Its origin's next hold\n\t * makes a new one (origins are never reused), so a long-lived link keeps records only for live work.\n\t */\n\t#settle(): void {\n\t\tif (this.#entries.size === 0 && this.#calls.size === 0 && this.#sent.length === 0) this.link.drop(this);\n\t}\n\n\t/** A hold's object is live: its `bound` goes now when a slot is free, else with the next free slot's bindings. */\n\tbind(hold: Hold, context: Context): void {\n\t\tif (this.#free) {\n\t\t\tthis.#sendOwn({ kind: \"bound\", holds: [hold.boundEntry(context)] });\n\t\t} else {\n\t\t\tthis.#binding.add(hold);\n\t\t}\n\t}\n\n\t/** A hold stopped waiting for a slot: it was forgotten. */\n\tunbind(hold: Hold): void {\n\t\tthis.#waiting.delete(hold);\n\t\tthis.#binding.delete(hold);\n\t}\n\n\t/**\n\t * A served hold left its object's binding (slice 7b §6, model §5): its unsent pending ops and a queued `bound` are\n\t * dropped (the ack slots of messages already sent stay until their `ack`), its calls in flight rejected with `error`\n\t * (each slot freed once).\n\t */\n\tunbound(hold: Hold, error: ChordError): void {\n\t\tthis.unbind(hold);\n\t\tfor (const [id, call] of this.#calls) {\n\t\t\tif (call.hold !== hold) continue;\n\t\t\tif (call.kind === \"served\") call.abort.abort(error);\n\t\t\tthis.reply(id, { kind: \"error\", call: id, error: wireError(error) });\n\t\t}\n\t}\n\n\t/** A hold's members changed in the current batch; its flush sends or queues it. */\n\ttouched(hold: Hold): void {\n\t\tif (this.#touched.length === 0) this.link.host.batch.flushing((context) => this.#flush(context));\n\t\tthis.#touched.push(hold);\n\t}\n\n\t/**\n\t * `entries` whose holds this origin relayed over `from`, in one pass: the same array when all are, else a copy made\n\t * at the first one that is not.\n\t */\n\t#relayedOver<E extends { readonly hold: number }>(entries: readonly E[], from: HostLink): readonly E[] {\n\t\tlet kept: E[] | undefined;\n\t\tfor (let i = 0; i < entries.length; i++) {\n\t\t\tconst entry = entries[i]!;\n\t\t\tconst relayed = this.#relayedHold(entry.hold, from) !== undefined;\n\t\t\tif (kept !== undefined) {\n\t\t\t\tif (relayed) kept.push(entry);\n\t\t\t} else if (!relayed) {\n\t\t\t\tkept = entries.slice(0, i);\n\t\t\t}\n\t\t}\n\t\treturn kept ?? entries;\n\t}\n\n\t/** The hold `id` of this origin when it is relayed over `from`. */\n\t#relayedHold(id: number, from: HostLink): RelayedHold | undefined {\n\t\tconst hold = this.#entries.get(id);\n\t\treturn hold?.kind === \"relayed\" && hold.heldOn(from) ? hold : undefined;\n\t}\n\n\t/**\n\t * A hold message: a protocol error for a live id or compressed params (params are never compressed), otherwise\n\t * admitted (`Hold.start`, placed once the host published). Its activation chain is kept only from a trusted link (Q5); its\n\t * decoded limit is the link's, or the smaller one a parent stamped (Q2), and travels with it when it is relayed.\n\t */\n\t#hold(message: Extract<Message, { readonly kind: \"hold\" }>): void {\n\t\tif (this.#entries.has(message.hold)) throw new Error(`hold ${message.hold}: the id is in use`);\n\t\tif (message.params instanceof DeflatedPart) throw new Error(`hold ${message.hold}: compressed params`);\n\t\t// Whom it acts for is decided here once (`#caller`), never passed on: a relay names it only on a route link.\n\t\tconst {\n\t\t\tkind: _kind,\n\t\t\torigin: _origin,\n\t\t\thold: id,\n\t\t\tprincipal: _principal,\n\t\t\tincarnation: _incarnation,\n\t\t\tchain,\n\t\t\tlimit: stamped,\n\t\t\t...fields\n\t\t} = message;\n\t\tconst { link } = this;\n\t\tconst limit = Math.min(link.limits.decoded, (link.role === \"parent\" ? stamped : undefined) ?? Infinity);\n\t\tconst request = {\n\t\t\t...fields,\n\t\t\t...(chain !== undefined && link.trusted ? { chain } : {}),\n\t\t\t...(limit === Infinity ? {} : { limit }),\n\t\t};\n\t\tconst limits = limit === link.limits.decoded ? link.limits : { part: link.limits.part, decoded: limit };\n\t\tconst hold = new Hold(id, this, this.#caller(message), limits);\n\t\tthis.#entries.set(id, hold);\n\t\thold.start(request);\n\t}\n\n\t/**\n\t * Whom a hold acts for: on a parent link the hold's own principal and incarnation when it names them, everywhere\n\t * else the link's principal and the peer's incarnation (a child cannot claim to be someone else).\n\t */\n\t#caller(message: Extract<Message, { readonly kind: \"hold\" }>): Caller {\n\t\tconst { link } = this;\n\t\tif (link.role !== \"parent\") return { principal: link.principal, incarnation: link.peer };\n\t\t// The message schema checked a principal's shape on an untrusted link; a trusted parent is believed.\n\t\tconst principal = (message.principal as Caller[\"principal\"]) ?? link.principal;\n\t\treturn { principal, incarnation: message.incarnation ?? link.peer };\n\t}\n\n\t#release(id: number): void {\n\t\tconst hold = this.#entries.get(id);\n\t\tif (hold === undefined) return;\n\t\tthis.forget(hold);\n\t\thold.release();\n\t}\n\n\t/**\n\t * A call: one on a hold this side does not know is ignored (Q1), more than this side's N at once and compressed\n\t * arguments from a child (clients never compress) are protocol errors. On a relayed hold it is forwarded, its\n\t * arguments checked against this link's part limit first (the bytes are here). On a served hold that is not bound\n\t * yet (nor binding afresh after a swap) it is refused `not_ready`; its method is an index into the bound variant (one\n\t * outside it is a protocol error) and its arguments are opened and parsed here within the hold's limits (past one\n\t * the call fails `too_large/part`; a malformed part is a protocol error), absent ones `null`. Arguments this host\n\t * must inflate asynchronously are inflated first, then the call is handled again.\n\t */\n\t#call(message: Extract<Message, { readonly kind: \"call\" }>): void | Promise<void> {\n\t\tif (this.#calls.has(message.call)) throw new Error(`call ${message.call}: the id is in use`);\n\t\tconst hold = this.#entries.get(message.hold);\n\t\tif (hold === undefined) return;\n\t\tif (this.#calls.size >= this.#limit) throw new Error(`call ${message.call}: more than ${this.#limit} calls`);\n\t\tconst { args: part, segments } = message;\n\t\tif (part instanceof DeflatedPart && this.link.role === \"child\") {\n\t\t\tthrow new Error(`call ${message.call}: compressed arguments from a child`);\n\t\t}\n\t\tif (hold.kind === \"relayed\") {\n\t\t\tconst error = part === undefined ? undefined : oversized(part, this.link.limits.part);\n\t\t\tif (error !== undefined) {\n\t\t\t\tthis.#refuse(message.call, error);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.#calls.set(message.call, { kind: \"relayed\", hold });\n\t\t\thold.call(message);\n\t\t\treturn;\n\t\t}\n\t\tif (!hold.callable) {\n\t\t\tthis.#refuse(message.call, new ChordError({ code: \"not_ready\", message: `hold ${hold.id}: not bound yet` }));\n\t\t\treturn;\n\t\t}\n\t\tconst method = hold.method(message.method);\n\t\tif (this.link.inflates(part, hold.limits)) {\n\t\t\treturn this.link.inflate([[part, hold.limits.decoded]], () => this.#call(message));\n\t\t}\n\t\tlet json: string | Uint8Array | undefined;\n\t\ttry {\n\t\t\tjson = part === undefined ? undefined : this.link.openPart(part, hold.limits, this.link.context);\n\t\t} catch (error) {\n\t\t\tif (!isChordError(error, \"too_large\")) throw error;\n\t\t\tthis.#refuse(message.call, error);\n\t\t\treturn;\n\t\t}\n\t\tconst args = json === undefined ? null : parsePayload(json, segments);\n\t\tconst call = { kind: \"served\", hold, bytes: method.resultBytes, abort: new AbortController() } as const;\n\t\tthis.#calls.set(message.call, call);\n\t\tvoid this.#run(message.call, call, method.name, args);\n\t}\n\n\t/**\n\t * Runs a call and sends its result (absent when `null`) or error, unless it was aborted, released or gone\n\t * meanwhile. A result that cannot be encoded is sent as its error.\n\t */\n\tasync #run(\n\t\tid: number,\n\t\tcall: Extract<RunningCall, { readonly kind: \"served\" }>,\n\t\tmethod: string,\n\t\targs: unknown,\n\t): Promise<void> {\n\t\tlet reply: Extract<OriginMessage, { readonly kind: \"result\" | \"error\" }>;\n\t\ttry {\n\t\t\t// A link's context has no abort signal, so this is the call's own signal: no `AbortSignal.any` per call.\n\t\t\tconst result = await call.hold.call(method, args, withAbortSignal(call.abort.signal, this.link.context));\n\t\t\t// Results are not validated: they are the provider's.\n\t\t\treply =\n\t\t\t\tresult === null || result === undefined\n\t\t\t\t\t? { kind: \"result\", call: id }\n\t\t\t\t\t: this.#result(id, result, call.bytes, this.link.context);\n\t\t} catch (error) {\n\t\t\treply = { kind: \"error\", call: id, error: wireError(error) };\n\t\t}\n\t\tthis.reply(id, reply);\n\t}\n\n\t/** Answers call `id` with `error` before it was admitted: it took no slot. */\n\t#refuse(id: number, error: ChordError): void {\n\t\tthis.send({ kind: \"error\", call: id, error: wireError(error) });\n\t}\n\n\t#abort(id: number): void {\n\t\tconst call = this.#calls.get(id);\n\t\tif (call === undefined) return;\n\t\tthis.#calls.delete(id);\n\t\tif (call.kind === \"relayed\") call.hold.abort(id);\n\t\telse call.abort.abort(new ChordError({ code: \"aborted\", message: `call ${id}: aborted by its caller` }));\n\t}\n\n\t/**\n\t * An `ack` answers the oldest message in flight: this host's own frees a slot, a relayed one is acknowledged to its\n\t * upstream link (closed meanwhile: nothing to do). An ack crossing nothing in flight is ignored.\n\t */\n\t#ack(): void {\n\t\tconst sender = this.#sent.shift();\n\t\tif (sender === undefined) return;\n\t\tif (sender !== \"local\") {\n\t\t\t// A relayed message implies the relay's number.\n\t\t\tsender.send({ kind: \"ack\", origin: this.#relay!.origin });\n\t\t\treturn;\n\t\t}\n\t\tthis.#inFlight--;\n\t\tthis.#slotFreed();\n\t}\n\n\t/**\n\t * The end of a batch: while a slot is free and nothing waits, one `state` message with an entry per touched hold;\n\t * otherwise each touched hold's ops join its pending queues until a slot frees.\n\t */\n\t#flush(context: Context): void {\n\t\tconst holds = this.#touched;\n\t\t// The side closed during the batch: nothing is sent.\n\t\tif (holds.length === 0) return;\n\t\tthis.#touched = [];\n\t\t// A hold touched in this batch may have left its binding since (a reload unbound it).\n\t\tif (this.#free) {\n\t\t\tconst entries: StateEntry[] = [];\n\t\t\tfor (const hold of holds) if (hold.bound) entries.push(hold.entry(context));\n\t\t\tif (entries.length > 0) this.#sendOwn({ kind: \"state\", holds: entries });\n\t\t\treturn;\n\t\t}\n\t\t// A bound hold never waits for its binding.\n\t\tfor (const hold of holds) {\n\t\t\tif (!hold.bound) continue;\n\t\t\thold.queue();\n\t\t\tthis.#waiting.add(hold);\n\t\t}\n\t}\n\n\t/** Whether this host's next message goes out now: a slot is free and nothing waits for one. */\n\tget #free(): boolean {\n\t\treturn this.#binding.size === 0 && this.#waiting.size === 0 && this.#inFlight < WINDOW;\n\t}\n\n\t/**\n\t * A slot may be free: while there is room, the waiting state goes out as one message and the waiting bindings as\n\t * one `bound`, taking turns when both wait (state first), so neither a hold that keeps changing nor a stream of new\n\t * holds starves the other.\n\t */\n\t#slotFreed(): void {\n\t\tconst context = this.link.context;\n\t\twhile (this.#inFlight < WINDOW) {\n\t\t\tif (this.#binding.size > 0 && (this.#waiting.size === 0 || this.#bindingTurn)) {\n\t\t\t\tconst holds = [...this.#binding];\n\t\t\t\tthis.#binding.clear();\n\t\t\t\tthis.#bindingTurn = false;\n\t\t\t\t// Every snapshot in one synchronous step: the binding shows all of them at one moment.\n\t\t\t\tthis.#sendOwn({ kind: \"bound\", holds: holds.map((hold) => hold.boundEntry(context)) });\n\t\t\t} else if (this.#waiting.size > 0) {\n\t\t\t\tconst holds = [...this.#waiting];\n\t\t\t\tthis.#waiting.clear();\n\t\t\t\tthis.#bindingTurn = this.#binding.size > 0;\n\t\t\t\tthis.#sendOwn({ kind: \"state\", holds: holds.map((hold) => hold.pendingEntry(context)) });\n\t\t\t} else {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * A call's result message, its part deflated above the threshold when this host compresses; with byte segments when\n\t * its method's result schema has a `bytes()` leaf.\n\t */\n\t#result(\n\t\tid: number,\n\t\tresult: unknown,\n\t\tbytes: boolean,\n\t\tcontext: Context,\n\t): Extract<OriginMessage, { readonly kind: \"result\" }> {\n\t\tconst { json, segments } = payloadPart(result, bytes);\n\t\tconst value = this.link.part(json, context);\n\t\treturn { kind: \"result\", call: id, value, ...(segments === undefined ? {} : { segments }) };\n\t}\n\n\t/** Sends one of this host's own `bound` or `state` messages, taking a slot. */\n\t#sendOwn(message: Extract<OriginMessage, { readonly kind: \"bound\" | \"state\" }>): void {\n\t\tthis.#inFlight++;\n\t\tthis.#sent.push(\"local\");\n\t\tthis.send(message);\n\t}\n}\n"]}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { ChordError } from "../data/index.ts";
|
|
2
|
+
import type { Caller } from "../host/internal.ts";
|
|
3
|
+
import { type Message } from "../link/internal.ts";
|
|
4
|
+
import { type HoldRequest } from "./hold.ts";
|
|
5
|
+
import type { HostLink } from "./host-link.ts";
|
|
6
|
+
import type { Path } from "./path.ts";
|
|
7
|
+
import type { ProviderSide } from "./provider.ts";
|
|
8
|
+
/**
|
|
9
|
+
* One relayed hold: `id` on its downstream origin, and the same id upstream on its path's current link (none while
|
|
10
|
+
* the path has no link). It keeps its `hold` message to hold again on the next link. Calls, `abort`, `retry` and
|
|
11
|
+
* `release` go upstream at once; what comes back is forwarded by its downstream origin (`ProviderSide.forward`). Two
|
|
12
|
+
* downstream holds are two upstream holds, each with its own encoders (R1).
|
|
13
|
+
*/
|
|
14
|
+
export declare class RelayedHold {
|
|
15
|
+
#private;
|
|
16
|
+
readonly kind = "relayed";
|
|
17
|
+
readonly id: number;
|
|
18
|
+
/** Whom the hold acts for, sent on route links. */
|
|
19
|
+
readonly caller: Caller;
|
|
20
|
+
constructor(id: number, downstream: ProviderSide, request: HoldRequest, caller: Caller, path: Path);
|
|
21
|
+
/** Takes the pending hold's place downstream and holds upstream (now, or when the path has a link). */
|
|
22
|
+
start(): void;
|
|
23
|
+
/** Whether it is held on `link` now: only that link answers for it. */
|
|
24
|
+
heldOn(link: HostLink): boolean;
|
|
25
|
+
/** Holds on `link`, the path's link now: its kept `hold` message, with whom it acts for on a route link. */
|
|
26
|
+
attach(link: HostLink): void;
|
|
27
|
+
/** The upstream link dropped: downstream its calls fail and the hold goes loading until the path's next link. */
|
|
28
|
+
dropped(error: ChordError): void;
|
|
29
|
+
/** Its path's address cannot be reached for now: downstream it fails `waiting` with `error` until the next link. */
|
|
30
|
+
unreachable(error: ChordError): void;
|
|
31
|
+
/**
|
|
32
|
+
* Whether it waits for its path's link (a route still resolving, or a dropped link's next): a revocation ends it then,
|
|
33
|
+
* since the link it is held on next gets no past `revoke` (§4).
|
|
34
|
+
*/
|
|
35
|
+
get waiting(): boolean;
|
|
36
|
+
/** Revoked while it waited for its path's link: forgotten, and `gone` with `error` downstream. */
|
|
37
|
+
revoked(error: ChordError): void;
|
|
38
|
+
/** `gone` from upstream: the hold is forgotten (the downstream origin forwards the message). */
|
|
39
|
+
lost(): void;
|
|
40
|
+
/**
|
|
41
|
+
* A call from downstream (registered there under its id), forwarded upstream at once; its reply comes back by the
|
|
42
|
+
* origin. Without an upstream link it is answered `unavailable` at once (it crossed the `loading` notice).
|
|
43
|
+
*/
|
|
44
|
+
call(message: Extract<Message, {
|
|
45
|
+
readonly kind: "call";
|
|
46
|
+
}>): void;
|
|
47
|
+
/** A downstream `abort` of call `id`, forwarded. */
|
|
48
|
+
abort(id: number): void;
|
|
49
|
+
/** A downstream `retry`, forwarded with its hop budget as it is (a relay visits no object). */
|
|
50
|
+
retry(message: Extract<Message, {
|
|
51
|
+
readonly kind: "retry";
|
|
52
|
+
}>): void;
|
|
53
|
+
/** Released downstream: released upstream (its calls with it) and no later link holds it. */
|
|
54
|
+
release(): void;
|
|
55
|
+
/** No later link holds it (gone, or its downstream origin closed, which `closed` tells the upstream links). */
|
|
56
|
+
drop(): void;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=relay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay.d.ts","sourceRoot":"","sources":["../../../src/next/remote/relay.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,KAAK,OAAO,EAAa,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAa,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD;;;;;GAKG;AACH,qBAAa,WAAW;;IACvB,QAAQ,CAAC,IAAI,aAAa;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAOpB,mDAAmD;IACnD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAKxB,YAAY,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EASjG;IAED,uGAAuG;IACvG,KAAK,IAAI,IAAI,CAGZ;IAED,uEAAuE;IACvE,MAAM,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAE9B;IAED,4GAA4G;IAC5G,MAAM,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAI3B;IAED,iHAAiH;IACjH,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAI/B;IAED,oHAAoH;IACpH,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAEnC;IAED;;;OAGG;IACH,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,kGAAkG;IAClG,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAI/B;IAED,gGAAgG;IAChG,IAAI,IAAI,IAAI,CAGX;IAED;;;OAGG;IACH,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI,CAQ/D;IAED,oDAAoD;IACpD,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAGtB;IAED,+FAA+F;IAC/F,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC,GAAG,IAAI,CAGjE;IAED,6FAA6F;IAC7F,OAAO,IAAI,IAAI,CAId;IAED,+GAA+G;IAC/G,IAAI,IAAI,IAAI,CAGX;CACD"}
|