@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
package/dist/contract.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type Schema, type Static } from "@earendil-works/pi-schema";
|
|
2
2
|
import type { Ctx, Exposed, Readable, RefBase, StateSource } from "./types.ts";
|
|
3
3
|
declare const MEMBER: unique symbol;
|
|
4
4
|
/** A method's arguments and result; `undefined`: it takes no arguments, or returns nothing (void). */
|
|
5
|
-
export interface MethodSpec<A extends
|
|
5
|
+
export interface MethodSpec<A extends Schema | undefined = Schema | undefined, R extends Schema | undefined = Schema | undefined> {
|
|
6
6
|
readonly [MEMBER]: "method";
|
|
7
7
|
readonly args: A;
|
|
8
8
|
readonly result: R;
|
|
@@ -19,12 +19,12 @@ export interface OpaqueSpec<T = unknown> {
|
|
|
19
19
|
* for a method without arguments that returns something.
|
|
20
20
|
*/
|
|
21
21
|
export declare function method(): MethodSpec<undefined, undefined>;
|
|
22
|
-
export declare function method<A extends
|
|
23
|
-
export declare function method<A extends
|
|
22
|
+
export declare function method<A extends Schema>(args: A): MethodSpec<A, undefined>;
|
|
23
|
+
export declare function method<A extends Schema | undefined, R extends Schema>(args: A, result: R): MethodSpec<A, R>;
|
|
24
24
|
/** A native in-process object identified by `name@version` (local contracts only). */
|
|
25
25
|
export declare const opaque: <T = unknown>(id: string) => OpaqueSpec<T>;
|
|
26
26
|
export interface VariantDef {
|
|
27
|
-
readonly state?: Readonly<Record<string,
|
|
27
|
+
readonly state?: Readonly<Record<string, Schema>>;
|
|
28
28
|
readonly methods?: Readonly<Record<string, MethodSpec>>;
|
|
29
29
|
}
|
|
30
30
|
/** Where objects of a remote type live: one named host. */
|
|
@@ -58,61 +58,60 @@ export declare const placedOn: (placement: Placement, hostName: string) => boole
|
|
|
58
58
|
export declare const placementText: (placement: Placement) => string;
|
|
59
59
|
export interface RemoteDef {
|
|
60
60
|
readonly version: number;
|
|
61
|
-
readonly input:
|
|
61
|
+
readonly input: Schema;
|
|
62
62
|
/** Where its objects live: `hostNamed(…)` or `hostFamily(…)`. Part of the contract (and its fingerprint). */
|
|
63
63
|
readonly host: Placement;
|
|
64
64
|
readonly variants: Readonly<Record<string, VariantDef>>;
|
|
65
65
|
}
|
|
66
66
|
/** A local member: a method, an opaque native object, or a state member described by its schema. */
|
|
67
|
-
export type LocalMember = MethodSpec | OpaqueSpec |
|
|
67
|
+
export type LocalMember = MethodSpec | OpaqueSpec | Schema;
|
|
68
68
|
export interface LocalDef {
|
|
69
69
|
readonly version: number;
|
|
70
|
-
readonly input:
|
|
70
|
+
readonly input: Schema;
|
|
71
71
|
readonly members?: Readonly<Record<string, LocalMember>>;
|
|
72
72
|
}
|
|
73
|
-
declare const MemberDescriptionSchema:
|
|
74
|
-
kind:
|
|
75
|
-
args
|
|
76
|
-
result
|
|
77
|
-
}
|
|
78
|
-
kind:
|
|
79
|
-
schema:
|
|
80
|
-
}
|
|
81
|
-
kind:
|
|
82
|
-
id:
|
|
83
|
-
}
|
|
73
|
+
declare const MemberDescriptionSchema: Schema<{
|
|
74
|
+
kind: "method";
|
|
75
|
+
args?: Schema | undefined;
|
|
76
|
+
result?: Schema | undefined;
|
|
77
|
+
} | {
|
|
78
|
+
kind: "state";
|
|
79
|
+
schema: Schema;
|
|
80
|
+
} | {
|
|
81
|
+
kind: "opaque";
|
|
82
|
+
id: string;
|
|
83
|
+
}>;
|
|
84
84
|
export type MemberDescription = Static<typeof MemberDescriptionSchema>;
|
|
85
85
|
/** Local contracts have one unnamed variant. */
|
|
86
86
|
export declare const LOCAL_VARIANT = "";
|
|
87
|
-
export declare const DescriptionSchema:
|
|
88
|
-
name:
|
|
89
|
-
scope:
|
|
90
|
-
version:
|
|
91
|
-
input:
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
}>]>>>;
|
|
87
|
+
export declare const DescriptionSchema: Schema<{
|
|
88
|
+
name: string;
|
|
89
|
+
scope: "local" | "remote";
|
|
90
|
+
version: number;
|
|
91
|
+
input: Schema;
|
|
92
|
+
host?: {
|
|
93
|
+
name: string;
|
|
94
|
+
} | {
|
|
95
|
+
prefix: string;
|
|
96
|
+
key: string;
|
|
97
|
+
} | undefined;
|
|
98
|
+
variants: Record<string, Record<string, {
|
|
99
|
+
kind: "method";
|
|
100
|
+
args?: Schema | undefined;
|
|
101
|
+
result?: Schema | undefined;
|
|
102
|
+
} | {
|
|
103
|
+
kind: "state";
|
|
104
|
+
schema: Schema;
|
|
105
|
+
} | {
|
|
106
|
+
kind: "opaque";
|
|
107
|
+
id: string;
|
|
108
|
+
}>>;
|
|
110
109
|
}>;
|
|
111
110
|
export type Description = Static<typeof DescriptionSchema>;
|
|
112
111
|
interface ContractBase {
|
|
113
112
|
readonly name: string;
|
|
114
113
|
readonly version: number;
|
|
115
|
-
readonly input:
|
|
114
|
+
readonly input: Schema;
|
|
116
115
|
readonly description: Description;
|
|
117
116
|
readonly fingerprint: string;
|
|
118
117
|
}
|
|
@@ -145,19 +144,19 @@ export type Accepts = Readonly<Record<number, Adapter>>;
|
|
|
145
144
|
export declare function bind(provider: AnyContract, accepts: Accepts | undefined, consumer: AnyContract): Adapter | undefined;
|
|
146
145
|
type Empty = Record<never, never>;
|
|
147
146
|
type StateOf<V> = V extends {
|
|
148
|
-
readonly state: infer S extends Readonly<Record<string,
|
|
147
|
+
readonly state: infer S extends Readonly<Record<string, Schema>>;
|
|
149
148
|
} ? S : Empty;
|
|
150
|
-
type StaticOf<S> = S extends
|
|
149
|
+
type StaticOf<S> = S extends Schema ? Static<S> : never;
|
|
151
150
|
type MethodsOf<V> = V extends {
|
|
152
151
|
readonly methods: infer M extends Readonly<Record<string, MethodSpec>>;
|
|
153
152
|
} ? M : Empty;
|
|
154
153
|
/** What a handler returns: the result's value, or nothing for a void method. */
|
|
155
|
-
type Returned<R> = [R] extends [
|
|
154
|
+
type Returned<R> = [R] extends [Schema] ? Static<R> | Promise<Static<R>> : void | Promise<void>;
|
|
156
155
|
/** What a call resolves to. */
|
|
157
|
-
type Resolved<R> = [R] extends [
|
|
156
|
+
type Resolved<R> = [R] extends [Schema] ? Static<R> : undefined;
|
|
158
157
|
/** A method's handler; `P` is the app's principal type (`ctx.principal`). */
|
|
159
|
-
export type MethodImplementation<M, P = unknown> = M extends MethodSpec<infer A, infer R> ? [A] extends [
|
|
160
|
-
export type Call<M> = M extends MethodSpec<infer A, infer R> ? [A] extends [
|
|
158
|
+
export type MethodImplementation<M, P = unknown> = M extends MethodSpec<infer A, infer R> ? [A] extends [Schema] ? (args: Static<A>, ctx: Ctx<P>) => Returned<R> : (ctx: Ctx<P>) => Returned<R> : never;
|
|
159
|
+
export type Call<M> = M extends MethodSpec<infer A, infer R> ? [A] extends [Schema] ? (args: Static<A>, ctx?: Ctx) => Promise<Resolved<R>> : (ctx?: Ctx) => Promise<Resolved<R>> : never;
|
|
161
160
|
/** Whether `contract`'s method `name` takes no arguments (it is called as `ref.name(ctx)`). */
|
|
162
161
|
export declare function takesNoArgs(contract: AnyContract, name: string): boolean;
|
|
163
162
|
type VariantImplementation<K, V, P> = {
|
|
@@ -178,14 +177,14 @@ type VariantRef<C extends AnyContract, K, V> = RefBase<C> & {
|
|
|
178
177
|
} & {
|
|
179
178
|
readonly [M in keyof MethodsOf<V>]: Call<MethodsOf<V>[M]>;
|
|
180
179
|
};
|
|
181
|
-
type LocalImplementationMember<M, P> = M extends MethodSpec ? MethodImplementation<M, P> : M extends OpaqueSpec<infer T> ? T | Exposed<T> : M extends
|
|
182
|
-
type LocalRefMember<M> = M extends MethodSpec ? Call<M> : M extends OpaqueSpec<infer T> ? T | undefined : M extends
|
|
180
|
+
type LocalImplementationMember<M, P> = M extends MethodSpec ? MethodImplementation<M, P> : M extends OpaqueSpec<infer T> ? T | Exposed<T> : M extends Schema ? StateSource<Static<M>> : never;
|
|
181
|
+
type LocalRefMember<M> = M extends MethodSpec ? Call<M> : M extends OpaqueSpec<infer T> ? T | undefined : M extends Schema ? Readable<Static<M>> : never;
|
|
183
182
|
type LocalMembers<D> = D extends {
|
|
184
183
|
readonly members: infer M extends Readonly<Record<string, LocalMember>>;
|
|
185
184
|
} ? M : Empty;
|
|
186
185
|
export type InputOf<C> = C extends {
|
|
187
186
|
readonly def: {
|
|
188
|
-
readonly input: infer I extends
|
|
187
|
+
readonly input: infer I extends Schema;
|
|
189
188
|
};
|
|
190
189
|
} ? Static<I> : never;
|
|
191
190
|
/** What a factory returns for contract C; its methods' `ctx.principal` is `P`. */
|
package/dist/contract.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"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"}
|
package/dist/contract.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Value } from "typebox/value";
|
|
1
|
+
import { int, lit, map, obj, opt, str, union } from "@earendil-works/pi-schema";
|
|
3
2
|
import { ChordError, invalid } from "./errors.js";
|
|
4
|
-
import { canonicalJson, fits, hash64 } from "./schema.js";
|
|
3
|
+
import { canonicalJson, fits, hash64, isValid } from "./schema.js";
|
|
5
4
|
const MEMBER = Symbol("chord.member");
|
|
6
5
|
export function method(args, result) {
|
|
7
6
|
return { [MEMBER]: "method", args, result };
|
|
@@ -44,33 +43,29 @@ export const placedOn = (placement, hostName) => "name" in placement
|
|
|
44
43
|
: hostName.startsWith(placement.prefix) && hostName.length > placement.prefix.length;
|
|
45
44
|
export const placementText = (placement) => "name" in placement ? placement.name : `${placement.prefix}<${placement.key}>`;
|
|
46
45
|
// A description travels as a reference's contract token (wire.ts), so it is declared once, as the schema that validates it.
|
|
47
|
-
//
|
|
48
|
-
const SchemaObject =
|
|
49
|
-
const MemberDescriptionSchema =
|
|
46
|
+
// Any object is a schema, which is all a peer's schema is checked for here.
|
|
47
|
+
const SchemaObject = obj({}, { open: true });
|
|
48
|
+
const MemberDescriptionSchema = union([
|
|
50
49
|
// Absent `args`: the method takes none. Absent `result`: it returns nothing.
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
result: Type.Optional(SchemaObject),
|
|
55
|
-
}),
|
|
56
|
-
Type.Object({ kind: Type.Literal("state"), schema: SchemaObject }),
|
|
57
|
-
Type.Object({ kind: Type.Literal("opaque"), id: Type.String() }),
|
|
50
|
+
obj({ kind: lit("method"), args: opt(SchemaObject), result: opt(SchemaObject) }, { open: true }),
|
|
51
|
+
obj({ kind: lit("state"), schema: SchemaObject }, { open: true }),
|
|
52
|
+
obj({ kind: lit("opaque"), id: str() }, { open: true }),
|
|
58
53
|
]);
|
|
59
54
|
/** Local contracts have one unnamed variant. */
|
|
60
55
|
export const LOCAL_VARIANT = "";
|
|
61
|
-
const PlacementSchema =
|
|
62
|
-
|
|
63
|
-
|
|
56
|
+
const PlacementSchema = union([
|
|
57
|
+
obj({ name: str({ minLength: 1 }) }),
|
|
58
|
+
obj({ prefix: str({ minLength: 1 }), key: str({ minLength: 1 }) }),
|
|
64
59
|
]);
|
|
65
|
-
export const DescriptionSchema =
|
|
66
|
-
name:
|
|
67
|
-
scope:
|
|
68
|
-
version:
|
|
60
|
+
export const DescriptionSchema = obj({
|
|
61
|
+
name: str({ minLength: 1 }),
|
|
62
|
+
scope: union([lit("remote"), lit("local")]),
|
|
63
|
+
version: int(),
|
|
69
64
|
input: SchemaObject,
|
|
70
65
|
/** Remote types only (required there): where their objects live. */
|
|
71
|
-
host:
|
|
72
|
-
variants:
|
|
73
|
-
});
|
|
66
|
+
host: opt(PlacementSchema),
|
|
67
|
+
variants: map(map(MemberDescriptionSchema)),
|
|
68
|
+
}, { open: true });
|
|
74
69
|
/** Names a reference uses itself; members may not use them. */
|
|
75
70
|
export const RESERVED_MEMBERS = new Set([
|
|
76
71
|
"variant",
|
|
@@ -115,7 +110,7 @@ function checkHeader(name, version) {
|
|
|
115
110
|
export function remote(name, def) {
|
|
116
111
|
checkHeader(name, def.version);
|
|
117
112
|
const placement = def.host;
|
|
118
|
-
if (placement === undefined || !
|
|
113
|
+
if (placement === undefined || !isValid(PlacementSchema, placement))
|
|
119
114
|
throw new TypeError(`remote contract ${name} needs \`host\`: hostNamed(…) or hostFamily(…)`);
|
|
120
115
|
// A JSON copy: the description travels, and a placement object may carry nothing else.
|
|
121
116
|
const host = "name" in placement ? { name: placement.name } : { prefix: placement.prefix, key: placement.key };
|
package/dist/contract.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,IAAI,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1D,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;AA2BtC,MAAM,UAAU,MAAM,CAAC,IAAc,EAAE,MAAgB;IACtD,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC7C,CAAC;AAED,sFAAsF;AACtF,MAAM,CAAC,MAAM,MAAM,GAAG,CAAc,EAAU,EAAiB,EAAE;IAChE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,mCAAmC,EAAE,EAAE,CAAC,CAAC;IAC5F,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AACnC,CAAC,CAAC;AAqBF,iFAAiF;AACjF,MAAM,UAAU,SAAS,CAAC,IAAY;IACrC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,EAAE;QAAE,MAAM,IAAI,SAAS,CAAC,6BAA6B,CAAC,CAAC;IAChG,OAAO,EAAE,IAAI,EAAE,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAyB,MAAc,EAAE,GAAM;IACxE,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,EAAE;QAAE,MAAM,IAAI,SAAS,CAAC,qCAAqC,CAAC,CAAC;IAC5G,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,EAAE;QAAE,MAAM,IAAI,SAAS,CAAC,sCAAsC,CAAC,CAAC;IACvG,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AACxB,CAAC;AAOD,2GAA2G;AAC3G,MAAM,UAAU,WAAW,CAAC,QAAgB,EAAE,SAAoB,EAAE,KAAc;IACjF,IAAI,MAAM,IAAI,SAAS;QAAE,OAAO,SAAS,CAAC,IAAI,CAAC;IAC/C,MAAM,KAAK,GACV,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAE,KAAiC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7G,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE;QAC5C,MAAM,OAAO,CAAC,WAAW,EAAE,GAAG,QAAQ,iBAAiB,SAAS,CAAC,GAAG,gBAAgB,CAAC,CAAC;IACvF,OAAO,SAAS,CAAC,MAAM,GAAG,KAAK,CAAC;AACjC,CAAC;AAED,yEAAyE;AACzE,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,SAAoB,EAAE,QAAgB,EAAW,EAAE,CAC3E,MAAM,IAAI,SAAS;IAClB,CAAC,CAAC,SAAS,CAAC,IAAI,KAAK,QAAQ;IAC7B,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC;AAEvF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,SAAoB,EAAU,EAAE,CAC7D,MAAM,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,GAAG,GAAG,CAAC;AAmBhF,4HAA4H;AAC5H,wGAAwG;AACxG,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAU,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AAE3D,MAAM,uBAAuB,GAAG,IAAI,CAAC,KAAK,CAAC;IAC1C,6EAA6E;IAC7E,IAAI,CAAC,MAAM,CAAC;QACX,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;QAC5B,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;QACjC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;KACnC,CAAC;IACF,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;IAClE,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;CAChE,CAAC,CAAC;AAGH,gDAAgD;AAChD,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,CAAC;AAEhC,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC;IAClC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC;IACrF,IAAI,CAAC,MAAM,CACV,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,EAC7E,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAC/B;CACD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAAC;IAC5C,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IACnC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IAClE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;IACvB,KAAK,EAAE,YAAY;IACnB,oEAAoE;IACpE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC;IACpC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,uBAAuB,CAAC,CAAC;CACzF,CAAC,CAAC;AAuBH,+DAA+D;AAC/D,MAAM,CAAC,MAAM,gBAAgB,GAAwB,IAAI,GAAG,CAAC;IAC5D,SAAS;IACT,QAAQ;IACR,OAAO;IACP,OAAO;IACP,OAAO;IACP,SAAS;IACT,UAAU;IACV,SAAS;IACT,MAAM;IACN,UAAU;CACV,CAAC,CAAC;AAEH,SAAS,cAAc,CAAC,IAAY,EAAE,MAAe,EAAE,KAAyB;IAC/E,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,4BAA4B,IAAI,EAAE,CAAC,CAAC;IACxF,MAAM,KAAK,GAAI,MAAgC,CAAC,MAAM,CAAC,CAAC;IACxD,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,MAAoB,CAAC;QAClC,OAAO;YACN,IAAI,EAAE,QAAQ;YACd,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;YACvD,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;SAC7D,CAAC;IACH,CAAC;IACD,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxB,IAAI,KAAK,KAAK,QAAQ;YAAE,MAAM,IAAI,SAAS,CAAC,kDAAkD,IAAI,EAAE,CAAC,CAAC;QACtG,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAG,MAAqB,CAAC,EAAE,EAAE,CAAC;IAC1D,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAiB,EAAE,CAAC;AACrD,CAAC;AAED,SAAS,MAAM,CAAwB,QAAgC;IACtE,OAAO,EAAE,GAAG,QAAQ,EAAE,WAAW,EAAE,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,EAAO,CAAC;AACvF,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,OAAe;IACjD,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,SAAS,CAAC,wBAAwB,CAAC,CAAC;IACzD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,6CAA6C,CAAC,CAAC;AACnH,CAAC;AAED,MAAM,UAAU,MAAM,CACrB,IAAY,EACZ,GAA4D;IAE5D,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAC/B,MAAM,SAAS,GAAG,GAAG,CAAC,IAA6B,CAAC;IACpD,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,EAAE,SAAS,CAAC;QACtE,MAAM,IAAI,SAAS,CAAC,mBAAmB,IAAI,gDAAgD,CAAC,CAAC;IAC9F,uFAAuF;IACvF,MAAM,IAAI,GACT,MAAM,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,CAAC;IACnG,MAAM,QAAQ,GAAsD,EAAE,CAAC;IACvE,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,mBAAmB,IAAI,kBAAkB,CAAC,CAAC;IAC3G,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5D,MAAM,OAAO,GAAsC,EAAE,CAAC;QACtD,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;YAC9D,OAAO,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QACtD,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC;YACjE,IAAI,GAAG,IAAI,OAAO;gBAAE,MAAM,IAAI,SAAS,CAAC,UAAU,GAAG,gCAAgC,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;YACrG,OAAO,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;YACnD,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,IAAI,SAAS,CAAC,WAAW,GAAG,oBAAoB,CAAC,CAAC;QAC7F,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC;IAC1B,CAAC;IACD,MAAM,WAAW,GAAgB,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACnH,OAAO,MAAM,CAAoB;QAChC,KAAK,EAAE,QAAQ;QACf,IAAI;QACJ,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,GAAG;QACH,WAAW;KACX,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,KAAK,CAA2B,IAAY,EAAE,GAAM;IACnE,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAC/B,MAAM,OAAO,GAAsC,EAAE,CAAC;IACtD,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACnH,MAAM,WAAW,GAAgB;QAChC,IAAI;QACJ,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,QAAQ,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE;KACtC,CAAC;IACF,OAAO,MAAM,CAAmB,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC;AACrH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,WAAwB;IAC/D,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,WAAW,CAAC;IAC1D,IACC,OAAO,IAAI,KAAK,QAAQ;QACxB,CAAC,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,OAAO,CAAC;QACzC,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC;QAC1B,CAAC,KAAK,KAAK,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,EAC5C,CAAC;QACF,MAAM,IAAI,UAAU,CAAC,SAAS,EAAE,0BAA0B,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IAClF,CAAC;IACD,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;IACpG,OAAO,KAAK,KAAK,QAAQ;QACxB,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE;QACxE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC;AAChD,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,QAAQ,CAAC,QAAqB,EAAE,QAAqB;IACpE,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,KAAK,KAAK,QAAQ,CAAC,KAAK;QAAE,OAAO,gBAAgB,CAAC;IAClG,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAAE,OAAO,MAAM,CAAC;IACtD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IAC1D,KAAK,MAAM,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzE,MAAM,eAAe,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,eAAe,KAAK,SAAS;YAAE,OAAO,WAAW,IAAI,UAAU,CAAC;QACpE,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;YAC9D,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI;gBAAE,OAAO,GAAG,IAAI,IAAI,IAAI,6BAA6B,CAAC;YAC/G,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC3D,sFAAsF;gBACtF,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC;oBAAE,OAAO,GAAG,IAAI,IAAI,IAAI,YAAY,CAAC;gBACrG,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC;oBAC9F,OAAO,GAAG,IAAI,IAAI,IAAI,YAAY,CAAC;gBACpC,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;oBACxG,OAAO,GAAG,IAAI,IAAI,IAAI,SAAS,CAAC;YAClC,CAAC;iBAAM,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAChE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;oBAAE,OAAO,GAAG,IAAI,IAAI,IAAI,QAAQ,CAAC;YAC1E,CAAC;iBAAM,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,EAAE,CAAC;gBAC9F,OAAO,GAAG,IAAI,IAAI,IAAI,WAAW,OAAO,CAAC,EAAE,OAAO,MAAM,CAAC,EAAE,EAAE,CAAC;YAC/D,CAAC;QACF,CAAC;IACF,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,MAAM,aAAa,GAAG,CAAC,CAAc,EAAE,CAAc,EAAW,EAAE,CACjE,aAAa,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,aAAa,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;AACjE,MAAM,WAAW,GAAG,CAAC,WAAwB,EAAU,EAAE,CACxD,WAAW,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;AAM9E,oHAAoH;AACpH,MAAM,UAAU,IAAI,CAAC,QAAqB,EAAE,OAA4B,EAAE,QAAqB;IAC9F,IAAI,QAAQ,CAAC,WAAW,KAAK,QAAQ,CAAC,WAAW;QAAE,OAAO,SAAS,CAAC;IACpE,mFAAmF;IACnF,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,UAAU,CACnB,mBAAmB,EACnB,GAAG,QAAQ,CAAC,IAAI,aAAa,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,0BAA0B,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAC3H,CAAC;IACH,CAAC;IACD,IAAI,QAAQ,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;QACpE,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC3C,MAAM,IAAI,UAAU,CACnB,mBAAmB,EACnB,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,OAAO,+CAA+C,MAAM,4BAA4B,CACrH,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,IAAI,UAAU,CACnB,mBAAmB,EACnB,GAAG,QAAQ,CAAC,IAAI,sBAAsB,QAAQ,CAAC,OAAO,sBAAsB,QAAQ,CAAC,OAAO,sBAAsB,CAClH,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC;AA0BD,+FAA+F;AAC/F,MAAM,UAAU,WAAW,CAAC,QAAqB,EAAE,IAAY;IAC9D,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpE,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,MAAM,EAAE,IAAI,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC;IACjE,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC","sourcesContent":["import { type Static, type TSchema, Type } from \"typebox\";\nimport { Value } from \"typebox/value\";\nimport { ChordError, invalid } from \"./errors.ts\";\nimport { canonicalJson, fits, hash64 } from \"./schema.ts\";\nimport type { Ctx, Exposed, Readable, RefBase, StateSource } from \"./types.ts\";\n\nconst MEMBER = Symbol(\"chord.member\");\n\n/** A method's arguments and result; `undefined`: it takes no arguments, or returns nothing (void). */\nexport interface MethodSpec<\n\tA extends TSchema | undefined = TSchema | undefined,\n\tR extends TSchema | undefined = TSchema | undefined,\n> {\n\treadonly [MEMBER]: \"method\";\n\treadonly args: A;\n\treadonly result: R;\n}\n\nexport interface OpaqueSpec<T = unknown> {\n\treadonly [MEMBER]: \"opaque\";\n\treadonly id: string;\n\t/** Type carrier only; never set. */\n\treadonly type?: T;\n}\n\n/**\n * A method. `method()`: no arguments (called as `ref.name(ctx)`, implemented as `(ctx) => …`) and no result.\n * `method(args)`: no result, the handler returns nothing (void). `method(args, result)`, or `method(undefined, result)`\n * for a method without arguments that returns something.\n */\nexport function method(): MethodSpec<undefined, undefined>;\nexport function method<A extends TSchema>(args: A): MethodSpec<A, undefined>;\nexport function method<A extends TSchema | undefined, R extends TSchema>(args: A, result: R): MethodSpec<A, R>;\nexport function method(args?: TSchema, result?: TSchema): MethodSpec {\n\treturn { [MEMBER]: \"method\", args, result };\n}\n\n/** A native in-process object identified by `name@version` (local contracts only). */\nexport const opaque = <T = unknown>(id: string): OpaqueSpec<T> => {\n\tif (!/^[^@\\s]+@\\d+$/.test(id)) throw new TypeError(`opaque id must be name@version: ${id}`);\n\treturn { [MEMBER]: \"opaque\", id };\n};\n\nexport interface VariantDef {\n\treadonly state?: Readonly<Record<string, TSchema>>;\n\treadonly methods?: Readonly<Record<string, MethodSpec>>;\n}\n\n/** Where objects of a remote type live: one named host. */\nexport interface HostNamed {\n\treadonly name: string;\n}\n\n/** Where objects of a remote type live: the host `prefix` + the input's string field `key` (`session:` + `session`). */\nexport interface HostFamily<K extends string = string> {\n\treadonly prefix: string;\n\treadonly key: K;\n}\n\n/** A remote type's placement: data only, so a description carries it and every host can check it. */\nexport type Placement = HostNamed | HostFamily;\n\n/** Objects of the type live on the host named `name` (`hostNamed(\"server\")`). */\nexport function hostNamed(name: string): HostNamed {\n\tif (typeof name !== \"string\" || name === \"\") throw new TypeError(\"hostNamed needs a host name\");\n\treturn { name };\n}\n\n/**\n * Objects of the type live on `prefix` + the value of the input's string field `key`: `hostFamily(\"session:\",\n * \"session\")` puts `{ session: \"S1\", … }` on `session:S1`. The field is required and must be a non-empty string.\n */\nexport function hostFamily<const K extends string>(prefix: string, key: K): HostFamily<K> {\n\tif (typeof prefix !== \"string\" || prefix === \"\") throw new TypeError(\"hostFamily needs a host-name prefix\");\n\tif (typeof key !== \"string\" || key === \"\") throw new TypeError(\"hostFamily needs an input field name\");\n\treturn { prefix, key };\n}\n\n/** Required string fields of `I`: what a `hostFamily` may name. */\ntype StringKeys<I> = { [K in keyof I]-?: I[K] extends string ? K : never }[keyof I] & string;\n/** The placements a remote type with input `I` may have. */\nexport type PlacementFor<I> = HostNamed | HostFamily<StringKeys<I>>;\n\n/** The host an object of `placement` with this (normalized) input lives on. Throws `invalid/placement`. */\nexport function resolveHost(typeName: string, placement: Placement, input: unknown): string {\n\tif (\"name\" in placement) return placement.name;\n\tconst value =\n\t\tinput !== null && typeof input === \"object\" ? (input as Record<string, unknown>)[placement.key] : undefined;\n\tif (typeof value !== \"string\" || value === \"\")\n\t\tthrow invalid(\"placement\", `${typeName}: input field ${placement.key} names no host`);\n\treturn placement.prefix + value;\n}\n\n/** Whether the host named `hostName` may serve a type of `placement`. */\nexport const placedOn = (placement: Placement, hostName: string): boolean =>\n\t\"name\" in placement\n\t\t? placement.name === hostName\n\t\t: hostName.startsWith(placement.prefix) && hostName.length > placement.prefix.length;\n\nexport const placementText = (placement: Placement): string =>\n\t\"name\" in placement ? placement.name : `${placement.prefix}<${placement.key}>`;\n\nexport interface RemoteDef {\n\treadonly version: number;\n\treadonly input: TSchema;\n\t/** Where its objects live: `hostNamed(…)` or `hostFamily(…)`. Part of the contract (and its fingerprint). */\n\treadonly host: Placement;\n\treadonly variants: Readonly<Record<string, VariantDef>>;\n}\n\n/** A local member: a method, an opaque native object, or a state member described by its schema. */\nexport type LocalMember = MethodSpec | OpaqueSpec | TSchema;\n\nexport interface LocalDef {\n\treadonly version: number;\n\treadonly input: TSchema;\n\treadonly members?: Readonly<Record<string, LocalMember>>;\n}\n\n// A description travels as a reference's contract token (wire.ts), so it is declared once, as the schema that validates it.\n// `TSchema` is an empty interface: any object is one, which is all a peer's schema is checked for here.\nconst SchemaObject = Type.Unsafe<TSchema>(Type.Object({}));\n\nconst MemberDescriptionSchema = Type.Union([\n\t// Absent `args`: the method takes none. Absent `result`: it returns nothing.\n\tType.Object({\n\t\tkind: Type.Literal(\"method\"),\n\t\targs: Type.Optional(SchemaObject),\n\t\tresult: Type.Optional(SchemaObject),\n\t}),\n\tType.Object({ kind: Type.Literal(\"state\"), schema: SchemaObject }),\n\tType.Object({ kind: Type.Literal(\"opaque\"), id: Type.String() }),\n]);\nexport type MemberDescription = Static<typeof MemberDescriptionSchema>;\n\n/** Local contracts have one unnamed variant. */\nexport const LOCAL_VARIANT = \"\";\n\nconst PlacementSchema = Type.Union([\n\tType.Object({ name: Type.String({ minLength: 1 }) }, { additionalProperties: false }),\n\tType.Object(\n\t\t{ prefix: Type.String({ minLength: 1 }), key: Type.String({ minLength: 1 }) },\n\t\t{ additionalProperties: false },\n\t),\n]);\n\nexport const DescriptionSchema = Type.Object({\n\tname: Type.String({ minLength: 1 }),\n\tscope: Type.Union([Type.Literal(\"remote\"), Type.Literal(\"local\")]),\n\tversion: Type.Integer(),\n\tinput: SchemaObject,\n\t/** Remote types only (required there): where their objects live. */\n\thost: Type.Optional(PlacementSchema),\n\tvariants: Type.Record(Type.String(), Type.Record(Type.String(), MemberDescriptionSchema)),\n});\nexport type Description = Static<typeof DescriptionSchema>;\n\ninterface ContractBase {\n\treadonly name: string;\n\treadonly version: number;\n\treadonly input: TSchema;\n\treadonly description: Description;\n\treadonly fingerprint: string;\n}\n\nexport interface RemoteContract<D extends RemoteDef = RemoteDef> extends ContractBase {\n\treadonly scope: \"remote\";\n\treadonly def: D;\n}\n\nexport interface LocalContract<D extends LocalDef = LocalDef> extends ContractBase {\n\treadonly scope: \"local\";\n\treadonly def: D;\n}\n\nexport type AnyContract = RemoteContract | LocalContract;\n\n/** Names a reference uses itself; members may not use them. */\nexport const RESERVED_MEMBERS: ReadonlySet<string> = new Set([\n\t\"variant\",\n\t\"status\",\n\t\"ready\",\n\t\"shape\",\n\t\"error\",\n\t\"onShape\",\n\t\"onStatus\",\n\t\"release\",\n\t\"then\",\n\t\"contract\",\n]);\n\nfunction describeMember(name: string, member: unknown, scope: \"remote\" | \"local\"): MemberDescription {\n\tif (RESERVED_MEMBERS.has(name)) throw new TypeError(`member name is reserved: ${name}`);\n\tconst brand = (member as { [MEMBER]?: string })[MEMBER];\n\tif (brand === \"method\") {\n\t\tconst spec = member as MethodSpec;\n\t\treturn {\n\t\t\tkind: \"method\",\n\t\t\t...(spec.args === undefined ? {} : { args: spec.args }),\n\t\t\t...(spec.result === undefined ? {} : { result: spec.result }),\n\t\t};\n\t}\n\tif (brand === \"opaque\") {\n\t\tif (scope === \"remote\") throw new TypeError(`remote contracts cannot expose opaque members: ${name}`);\n\t\treturn { kind: \"opaque\", id: (member as OpaqueSpec).id };\n\t}\n\treturn { kind: \"state\", schema: member as TSchema };\n}\n\nfunction finish<C extends AnyContract>(contract: Omit<C, \"fingerprint\">): C {\n\treturn { ...contract, fingerprint: hash64(canonicalJson(contract.description)) } as C;\n}\n\nfunction checkHeader(name: string, version: number): void {\n\tif (!name) throw new TypeError(\"contract name is empty\");\n\tif (!Number.isInteger(version) || version < 1) throw new TypeError(`contract version must be a positive integer`);\n}\n\nexport function remote<const D extends RemoteDef>(\n\tname: string,\n\tdef: D & { readonly host: PlacementFor<Static<D[\"input\"]>> },\n): RemoteContract<D> {\n\tcheckHeader(name, def.version);\n\tconst placement = def.host as Placement | undefined;\n\tif (placement === undefined || !Value.Check(PlacementSchema, placement))\n\t\tthrow new TypeError(`remote contract ${name} needs \\`host\\`: hostNamed(…) or hostFamily(…)`);\n\t// A JSON copy: the description travels, and a placement object may carry nothing else.\n\tconst host: Placement =\n\t\t\"name\" in placement ? { name: placement.name } : { prefix: placement.prefix, key: placement.key };\n\tconst variants: Record<string, Record<string, MemberDescription>> = {};\n\tif (Object.keys(def.variants).length === 0) throw new TypeError(`remote contract ${name} has no variants`);\n\tfor (const [kind, variant] of Object.entries(def.variants)) {\n\t\tconst members: Record<string, MemberDescription> = {};\n\t\tfor (const [key, schema] of Object.entries(variant.state ?? {}))\n\t\t\tmembers[key] = describeMember(key, schema, \"remote\");\n\t\tfor (const [key, spec] of Object.entries(variant.methods ?? {})) {\n\t\t\tif (key in members) throw new TypeError(`member ${key} is both state and method in ${name}.${kind}`);\n\t\t\tmembers[key] = describeMember(key, spec, \"remote\");\n\t\t\tif (members[key].kind !== \"method\") throw new TypeError(`methods.${key} is not a method()`);\n\t\t}\n\t\tvariants[kind] = members;\n\t}\n\tconst description: Description = { name, scope: \"remote\", version: def.version, input: def.input, host, variants };\n\treturn finish<RemoteContract<D>>({\n\t\tscope: \"remote\",\n\t\tname,\n\t\tversion: def.version,\n\t\tinput: def.input,\n\t\tdef,\n\t\tdescription,\n\t});\n}\n\nexport function local<const D extends LocalDef>(name: string, def: D): LocalContract<D> {\n\tcheckHeader(name, def.version);\n\tconst members: Record<string, MemberDescription> = {};\n\tfor (const [key, member] of Object.entries(def.members ?? {})) members[key] = describeMember(key, member, \"local\");\n\tconst description: Description = {\n\t\tname,\n\t\tscope: \"local\",\n\t\tversion: def.version,\n\t\tinput: def.input,\n\t\tvariants: { [LOCAL_VARIANT]: members },\n\t};\n\treturn finish<LocalContract<D>>({ scope: \"local\", name, version: def.version, input: def.input, def, description });\n}\n\n/**\n * A consumer token received over a link (only its description travels). Has no `def`, so it is only good for binding\n * and validation, never for TypeScript types.\n */\nexport function contractFromDescription(description: Description): AnyContract {\n\tconst { name, scope, version, input, host } = description;\n\tif (\n\t\ttypeof name !== \"string\" ||\n\t\t(scope !== \"remote\" && scope !== \"local\") ||\n\t\t!Number.isInteger(version) ||\n\t\t(scope === \"remote\") !== (host !== undefined)\n\t) {\n\t\tthrow new ChordError(\"invalid\", \"malformed contract token\", { reason: \"token\" });\n\t}\n\tconst base = { name, version, input, description, fingerprint: hash64(canonicalJson(description)) };\n\treturn scope === \"remote\"\n\t\t? { ...base, scope, def: { version, input, host: host!, variants: {} } }\n\t\t: { ...base, scope, def: { version, input } };\n}\n\n/** Returns why `provider` does not cover `consumer`, or undefined when it does. */\nexport function coverage(provider: Description, consumer: Description): string | undefined {\n\tif (provider.name !== consumer.name || provider.scope !== consumer.scope) return \"different type\";\n\tif (!samePlacement(provider, consumer)) return \"host\";\n\tif (!fits(consumer.input, provider.input)) return \"input\";\n\tfor (const [kind, consumerMembers] of Object.entries(consumer.variants)) {\n\t\tconst providerMembers = provider.variants[kind];\n\t\tif (providerMembers === undefined) return `variant ${kind} missing`;\n\t\tfor (const [name, wanted] of Object.entries(consumerMembers)) {\n\t\t\tconst offered = providerMembers[name];\n\t\t\tif (offered === undefined || offered.kind !== wanted.kind) return `${kind}.${name} missing or of another kind`;\n\t\t\tif (offered.kind === \"method\" && wanted.kind === \"method\") {\n\t\t\t\t// Both take arguments or neither does; a consumer that expects no result accepts any.\n\t\t\t\tif ((wanted.args === undefined) !== (offered.args === undefined)) return `${kind}.${name} arguments`;\n\t\t\t\tif (wanted.args !== undefined && offered.args !== undefined && !fits(wanted.args, offered.args))\n\t\t\t\t\treturn `${kind}.${name} arguments`;\n\t\t\t\tif (wanted.result !== undefined && (offered.result === undefined || !fits(offered.result, wanted.result)))\n\t\t\t\t\treturn `${kind}.${name} result`;\n\t\t\t} else if (offered.kind === \"state\" && wanted.kind === \"state\") {\n\t\t\t\tif (!fits(offered.schema, wanted.schema)) return `${kind}.${name} state`;\n\t\t\t} else if (offered.kind === \"opaque\" && wanted.kind === \"opaque\" && offered.id !== wanted.id) {\n\t\t\t\treturn `${kind}.${name} opaque ${offered.id} != ${wanted.id}`;\n\t\t\t}\n\t\t}\n\t}\n\treturn undefined;\n}\n\nconst samePlacement = (a: Description, b: Description): boolean =>\n\tcanonicalJson(a.host ?? null) === canonicalJson(b.host ?? null);\nconst placementOf = (description: Description): string =>\n\tdescription.host === undefined ? \"(local)\" : placementText(description.host);\n\n/** Maps the provider's current implementation to the view a consumer of an older contract version expects. */\nexport type Adapter = (current: Record<string, unknown>) => Record<string, unknown>;\nexport type Accepts = Readonly<Record<number, Adapter>>;\n\n/** How a consumer token binds to a provider: directly or through an `accepts` adapter. Throws contract_mismatch. */\nexport function bind(provider: AnyContract, accepts: Accepts | undefined, consumer: AnyContract): Adapter | undefined {\n\tif (provider.fingerprint === consumer.fingerprint) return undefined;\n\t// A moved type is another type for its consumers: no adapter reaches across hosts.\n\tif (!samePlacement(provider.description, consumer.description)) {\n\t\tthrow new ChordError(\n\t\t\t\"contract_mismatch\",\n\t\t\t`${provider.name} lives on ${placementOf(provider.description)}, the consumer expects ${placementOf(consumer.description)}`,\n\t\t);\n\t}\n\tif (provider.version === consumer.version) {\n\t\tconst reason = coverage(provider.description, consumer.description);\n\t\tif (reason === undefined) return undefined;\n\t\tthrow new ChordError(\n\t\t\t\"contract_mismatch\",\n\t\t\t`${provider.name}@${provider.version} does not cover the consumer's description (${reason}); forgotten version bump?`,\n\t\t);\n\t}\n\tconst adapter = accepts?.[consumer.version];\n\tif (adapter === undefined) {\n\t\tthrow new ChordError(\n\t\t\t\"contract_mismatch\",\n\t\t\t`${provider.name}: provider version ${provider.version}, consumer version ${consumer.version}, no accepts adapter`,\n\t\t);\n\t}\n\treturn adapter;\n}\n\n// ─── Static types ────────────────────────────────────────────────────────────\n\ntype Empty = Record<never, never>;\ntype StateOf<V> = V extends { readonly state: infer S extends Readonly<Record<string, TSchema>> } ? S : Empty;\ntype StaticOf<S> = S extends TSchema ? Static<S> : never;\ntype MethodsOf<V> = V extends { readonly methods: infer M extends Readonly<Record<string, MethodSpec>> } ? M : Empty;\n\n/** What a handler returns: the result's value, or nothing for a void method. */\ntype Returned<R> = [R] extends [TSchema] ? Static<R> | Promise<Static<R>> : void | Promise<void>;\n/** What a call resolves to. */\ntype Resolved<R> = [R] extends [TSchema] ? Static<R> : undefined;\n\n/** A method's handler; `P` is the app's principal type (`ctx.principal`). */\nexport type MethodImplementation<M, P = unknown> = M extends MethodSpec<infer A, infer R>\n\t? [A] extends [TSchema]\n\t\t? (args: Static<A>, ctx: Ctx<P>) => Returned<R>\n\t\t: (ctx: Ctx<P>) => Returned<R>\n\t: never;\nexport type Call<M> = M extends MethodSpec<infer A, infer R>\n\t? [A] extends [TSchema]\n\t\t? (args: Static<A>, ctx?: Ctx) => Promise<Resolved<R>>\n\t\t: (ctx?: Ctx) => Promise<Resolved<R>>\n\t: never;\n\n/** Whether `contract`'s method `name` takes no arguments (it is called as `ref.name(ctx)`). */\nexport function takesNoArgs(contract: AnyContract, name: string): boolean {\n\tfor (const members of Object.values(contract.description.variants)) {\n\t\tconst member = members[name];\n\t\tif (member?.kind === \"method\") return member.args === undefined;\n\t}\n\treturn false;\n}\n\ntype VariantImplementation<K, V, P> = { readonly variant: K } & {\n\treadonly [S in keyof StateOf<V>]: StateSource<StaticOf<StateOf<V>[S]>>;\n} & {\n\treadonly [M in keyof MethodsOf<V>]: MethodImplementation<MethodsOf<V>[M], P>;\n};\n/**\n * A reference in one variant: its state members are plain readables (a reference you hold has its state) and its\n * methods calls. `variant` discriminates the union `Ref` is for a multi-variant type.\n */\ntype VariantRef<C extends AnyContract, K, V> = RefBase<C> & { readonly variant: K } & {\n\treadonly [S in keyof StateOf<V>]: Readable<StaticOf<StateOf<V>[S]>>;\n} & {\n\treadonly [M in keyof MethodsOf<V>]: Call<MethodsOf<V>[M]>;\n};\n\ntype LocalImplementationMember<M, P> = M extends MethodSpec\n\t? MethodImplementation<M, P>\n\t: M extends OpaqueSpec<infer T>\n\t\t? T | Exposed<T>\n\t\t: M extends TSchema\n\t\t\t? StateSource<Static<M>>\n\t\t\t: never;\ntype LocalRefMember<M> = M extends MethodSpec\n\t? Call<M>\n\t: M extends OpaqueSpec<infer T>\n\t\t? T | undefined\n\t\t: M extends TSchema\n\t\t\t? Readable<Static<M>>\n\t\t\t: never;\ntype LocalMembers<D> = D extends { readonly members: infer M extends Readonly<Record<string, LocalMember>> }\n\t? M\n\t: Empty;\n\nexport type InputOf<C> = C extends { readonly def: { readonly input: infer I extends TSchema } } ? Static<I> : never;\n\n/** What a factory returns for contract C; its methods' `ctx.principal` is `P`. */\nexport type ImplementationOf<C, P = unknown> = C extends RemoteContract<infer D>\n\t? { [K in keyof D[\"variants\"]]: VariantImplementation<K, D[\"variants\"][K], P> }[keyof D[\"variants\"]]\n\t: C extends LocalContract<infer D>\n\t\t? { readonly [K in keyof LocalMembers<D>]: LocalImplementationMember<LocalMembers<D>[K], P> } & Record<\n\t\t\t\tstring,\n\t\t\t\tunknown\n\t\t\t>\n\t\t: never;\n\n/**\n * What `get` returns for contract C. A remote type's reference is a union discriminated by `variant`: another variant's\n * members are reachable only after narrowing (`if (ref.variant === \"editor\") ref.add(…)`). A local type's reference has\n * its members.\n */\nexport type Ref<C extends AnyContract = AnyContract> = C extends RemoteContract<infer D>\n\t? { [K in keyof D[\"variants\"]]: VariantRef<C, K, D[\"variants\"][K]> }[keyof D[\"variants\"]]\n\t: C extends LocalContract<infer D>\n\t\t? RefBase<C> & { readonly [K in keyof LocalMembers<D>]: LocalRefMember<LocalMembers<D>[K]> }\n\t\t: never;\n"]}
|
|
1
|
+
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"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","sourcesContent":["import { int, lit, map, obj, opt, type Schema, type Static, str, union } from \"@earendil-works/pi-schema\";\nimport { ChordError, invalid } from \"./errors.ts\";\nimport { canonicalJson, fits, hash64, isValid } from \"./schema.ts\";\nimport type { Ctx, Exposed, Readable, RefBase, StateSource } from \"./types.ts\";\n\nconst MEMBER = Symbol(\"chord.member\");\n\n/** A method's arguments and result; `undefined`: it takes no arguments, or returns nothing (void). */\nexport interface MethodSpec<\n\tA extends Schema | undefined = Schema | undefined,\n\tR extends Schema | undefined = Schema | undefined,\n> {\n\treadonly [MEMBER]: \"method\";\n\treadonly args: A;\n\treadonly result: R;\n}\n\nexport interface OpaqueSpec<T = unknown> {\n\treadonly [MEMBER]: \"opaque\";\n\treadonly id: string;\n\t/** Type carrier only; never set. */\n\treadonly type?: T;\n}\n\n/**\n * A method. `method()`: no arguments (called as `ref.name(ctx)`, implemented as `(ctx) => …`) and no result.\n * `method(args)`: no result, the handler returns nothing (void). `method(args, result)`, or `method(undefined, result)`\n * for a method without arguments that returns something.\n */\nexport function method(): MethodSpec<undefined, undefined>;\nexport function method<A extends Schema>(args: A): MethodSpec<A, undefined>;\nexport function method<A extends Schema | undefined, R extends Schema>(args: A, result: R): MethodSpec<A, R>;\nexport function method(args?: Schema, result?: Schema): MethodSpec {\n\treturn { [MEMBER]: \"method\", args, result };\n}\n\n/** A native in-process object identified by `name@version` (local contracts only). */\nexport const opaque = <T = unknown>(id: string): OpaqueSpec<T> => {\n\tif (!/^[^@\\s]+@\\d+$/.test(id)) throw new TypeError(`opaque id must be name@version: ${id}`);\n\treturn { [MEMBER]: \"opaque\", id };\n};\n\nexport interface VariantDef {\n\treadonly state?: Readonly<Record<string, Schema>>;\n\treadonly methods?: Readonly<Record<string, MethodSpec>>;\n}\n\n/** Where objects of a remote type live: one named host. */\nexport interface HostNamed {\n\treadonly name: string;\n}\n\n/** Where objects of a remote type live: the host `prefix` + the input's string field `key` (`session:` + `session`). */\nexport interface HostFamily<K extends string = string> {\n\treadonly prefix: string;\n\treadonly key: K;\n}\n\n/** A remote type's placement: data only, so a description carries it and every host can check it. */\nexport type Placement = HostNamed | HostFamily;\n\n/** Objects of the type live on the host named `name` (`hostNamed(\"server\")`). */\nexport function hostNamed(name: string): HostNamed {\n\tif (typeof name !== \"string\" || name === \"\") throw new TypeError(\"hostNamed needs a host name\");\n\treturn { name };\n}\n\n/**\n * Objects of the type live on `prefix` + the value of the input's string field `key`: `hostFamily(\"session:\",\n * \"session\")` puts `{ session: \"S1\", … }` on `session:S1`. The field is required and must be a non-empty string.\n */\nexport function hostFamily<const K extends string>(prefix: string, key: K): HostFamily<K> {\n\tif (typeof prefix !== \"string\" || prefix === \"\") throw new TypeError(\"hostFamily needs a host-name prefix\");\n\tif (typeof key !== \"string\" || key === \"\") throw new TypeError(\"hostFamily needs an input field name\");\n\treturn { prefix, key };\n}\n\n/** Required string fields of `I`: what a `hostFamily` may name. */\ntype StringKeys<I> = { [K in keyof I]-?: I[K] extends string ? K : never }[keyof I] & string;\n/** The placements a remote type with input `I` may have. */\nexport type PlacementFor<I> = HostNamed | HostFamily<StringKeys<I>>;\n\n/** The host an object of `placement` with this (normalized) input lives on. Throws `invalid/placement`. */\nexport function resolveHost(typeName: string, placement: Placement, input: unknown): string {\n\tif (\"name\" in placement) return placement.name;\n\tconst value =\n\t\tinput !== null && typeof input === \"object\" ? (input as Record<string, unknown>)[placement.key] : undefined;\n\tif (typeof value !== \"string\" || value === \"\")\n\t\tthrow invalid(\"placement\", `${typeName}: input field ${placement.key} names no host`);\n\treturn placement.prefix + value;\n}\n\n/** Whether the host named `hostName` may serve a type of `placement`. */\nexport const placedOn = (placement: Placement, hostName: string): boolean =>\n\t\"name\" in placement\n\t\t? placement.name === hostName\n\t\t: hostName.startsWith(placement.prefix) && hostName.length > placement.prefix.length;\n\nexport const placementText = (placement: Placement): string =>\n\t\"name\" in placement ? placement.name : `${placement.prefix}<${placement.key}>`;\n\nexport interface RemoteDef {\n\treadonly version: number;\n\treadonly input: Schema;\n\t/** Where its objects live: `hostNamed(…)` or `hostFamily(…)`. Part of the contract (and its fingerprint). */\n\treadonly host: Placement;\n\treadonly variants: Readonly<Record<string, VariantDef>>;\n}\n\n/** A local member: a method, an opaque native object, or a state member described by its schema. */\nexport type LocalMember = MethodSpec | OpaqueSpec | Schema;\n\nexport interface LocalDef {\n\treadonly version: number;\n\treadonly input: Schema;\n\treadonly members?: Readonly<Record<string, LocalMember>>;\n}\n\n// A description travels as a reference's contract token (wire.ts), so it is declared once, as the schema that validates it.\n// Any object is a schema, which is all a peer's schema is checked for here.\nconst SchemaObject = obj({}, { open: true }) as Schema<Schema>;\n\nconst MemberDescriptionSchema = union([\n\t// Absent `args`: the method takes none. Absent `result`: it returns nothing.\n\tobj({ kind: lit(\"method\"), args: opt(SchemaObject), result: opt(SchemaObject) }, { open: true }),\n\tobj({ kind: lit(\"state\"), schema: SchemaObject }, { open: true }),\n\tobj({ kind: lit(\"opaque\"), id: str() }, { open: true }),\n]);\nexport type MemberDescription = Static<typeof MemberDescriptionSchema>;\n\n/** Local contracts have one unnamed variant. */\nexport const LOCAL_VARIANT = \"\";\n\nconst PlacementSchema = union([\n\tobj({ name: str({ minLength: 1 }) }),\n\tobj({ prefix: str({ minLength: 1 }), key: str({ minLength: 1 }) }),\n]);\n\nexport const DescriptionSchema = obj(\n\t{\n\t\tname: str({ minLength: 1 }),\n\t\tscope: union([lit(\"remote\"), lit(\"local\")]),\n\t\tversion: int(),\n\t\tinput: SchemaObject,\n\t\t/** Remote types only (required there): where their objects live. */\n\t\thost: opt(PlacementSchema),\n\t\tvariants: map(map(MemberDescriptionSchema)),\n\t},\n\t{ open: true },\n);\nexport type Description = Static<typeof DescriptionSchema>;\n\ninterface ContractBase {\n\treadonly name: string;\n\treadonly version: number;\n\treadonly input: Schema;\n\treadonly description: Description;\n\treadonly fingerprint: string;\n}\n\nexport interface RemoteContract<D extends RemoteDef = RemoteDef> extends ContractBase {\n\treadonly scope: \"remote\";\n\treadonly def: D;\n}\n\nexport interface LocalContract<D extends LocalDef = LocalDef> extends ContractBase {\n\treadonly scope: \"local\";\n\treadonly def: D;\n}\n\nexport type AnyContract = RemoteContract | LocalContract;\n\n/** Names a reference uses itself; members may not use them. */\nexport const RESERVED_MEMBERS: ReadonlySet<string> = new Set([\n\t\"variant\",\n\t\"status\",\n\t\"ready\",\n\t\"shape\",\n\t\"error\",\n\t\"onShape\",\n\t\"onStatus\",\n\t\"release\",\n\t\"then\",\n\t\"contract\",\n]);\n\nfunction describeMember(name: string, member: unknown, scope: \"remote\" | \"local\"): MemberDescription {\n\tif (RESERVED_MEMBERS.has(name)) throw new TypeError(`member name is reserved: ${name}`);\n\tconst brand = (member as { [MEMBER]?: string })[MEMBER];\n\tif (brand === \"method\") {\n\t\tconst spec = member as MethodSpec;\n\t\treturn {\n\t\t\tkind: \"method\",\n\t\t\t...(spec.args === undefined ? {} : { args: spec.args }),\n\t\t\t...(spec.result === undefined ? {} : { result: spec.result }),\n\t\t};\n\t}\n\tif (brand === \"opaque\") {\n\t\tif (scope === \"remote\") throw new TypeError(`remote contracts cannot expose opaque members: ${name}`);\n\t\treturn { kind: \"opaque\", id: (member as OpaqueSpec).id };\n\t}\n\treturn { kind: \"state\", schema: member as Schema };\n}\n\nfunction finish<C extends AnyContract>(contract: Omit<C, \"fingerprint\">): C {\n\treturn { ...contract, fingerprint: hash64(canonicalJson(contract.description)) } as C;\n}\n\nfunction checkHeader(name: string, version: number): void {\n\tif (!name) throw new TypeError(\"contract name is empty\");\n\tif (!Number.isInteger(version) || version < 1) throw new TypeError(`contract version must be a positive integer`);\n}\n\nexport function remote<const D extends RemoteDef>(\n\tname: string,\n\tdef: D & { readonly host: PlacementFor<Static<D[\"input\"]>> },\n): RemoteContract<D> {\n\tcheckHeader(name, def.version);\n\tconst placement = def.host as Placement | undefined;\n\tif (placement === undefined || !isValid(PlacementSchema, placement))\n\t\tthrow new TypeError(`remote contract ${name} needs \\`host\\`: hostNamed(…) or hostFamily(…)`);\n\t// A JSON copy: the description travels, and a placement object may carry nothing else.\n\tconst host: Placement =\n\t\t\"name\" in placement ? { name: placement.name } : { prefix: placement.prefix, key: placement.key };\n\tconst variants: Record<string, Record<string, MemberDescription>> = {};\n\tif (Object.keys(def.variants).length === 0) throw new TypeError(`remote contract ${name} has no variants`);\n\tfor (const [kind, variant] of Object.entries(def.variants)) {\n\t\tconst members: Record<string, MemberDescription> = {};\n\t\tfor (const [key, schema] of Object.entries(variant.state ?? {}))\n\t\t\tmembers[key] = describeMember(key, schema, \"remote\");\n\t\tfor (const [key, spec] of Object.entries(variant.methods ?? {})) {\n\t\t\tif (key in members) throw new TypeError(`member ${key} is both state and method in ${name}.${kind}`);\n\t\t\tmembers[key] = describeMember(key, spec, \"remote\");\n\t\t\tif (members[key].kind !== \"method\") throw new TypeError(`methods.${key} is not a method()`);\n\t\t}\n\t\tvariants[kind] = members;\n\t}\n\tconst description: Description = { name, scope: \"remote\", version: def.version, input: def.input, host, variants };\n\treturn finish<RemoteContract<D>>({\n\t\tscope: \"remote\",\n\t\tname,\n\t\tversion: def.version,\n\t\tinput: def.input,\n\t\tdef,\n\t\tdescription,\n\t});\n}\n\nexport function local<const D extends LocalDef>(name: string, def: D): LocalContract<D> {\n\tcheckHeader(name, def.version);\n\tconst members: Record<string, MemberDescription> = {};\n\tfor (const [key, member] of Object.entries(def.members ?? {})) members[key] = describeMember(key, member, \"local\");\n\tconst description: Description = {\n\t\tname,\n\t\tscope: \"local\",\n\t\tversion: def.version,\n\t\tinput: def.input,\n\t\tvariants: { [LOCAL_VARIANT]: members },\n\t};\n\treturn finish<LocalContract<D>>({ scope: \"local\", name, version: def.version, input: def.input, def, description });\n}\n\n/**\n * A consumer token received over a link (only its description travels). Has no `def`, so it is only good for binding\n * and validation, never for TypeScript types.\n */\nexport function contractFromDescription(description: Description): AnyContract {\n\tconst { name, scope, version, input, host } = description;\n\tif (\n\t\ttypeof name !== \"string\" ||\n\t\t(scope !== \"remote\" && scope !== \"local\") ||\n\t\t!Number.isInteger(version) ||\n\t\t(scope === \"remote\") !== (host !== undefined)\n\t) {\n\t\tthrow new ChordError(\"invalid\", \"malformed contract token\", { reason: \"token\" });\n\t}\n\tconst base = { name, version, input, description, fingerprint: hash64(canonicalJson(description)) };\n\treturn scope === \"remote\"\n\t\t? { ...base, scope, def: { version, input, host: host!, variants: {} } }\n\t\t: { ...base, scope, def: { version, input } };\n}\n\n/** Returns why `provider` does not cover `consumer`, or undefined when it does. */\nexport function coverage(provider: Description, consumer: Description): string | undefined {\n\tif (provider.name !== consumer.name || provider.scope !== consumer.scope) return \"different type\";\n\tif (!samePlacement(provider, consumer)) return \"host\";\n\tif (!fits(consumer.input, provider.input)) return \"input\";\n\tfor (const [kind, consumerMembers] of Object.entries(consumer.variants)) {\n\t\tconst providerMembers = provider.variants[kind];\n\t\tif (providerMembers === undefined) return `variant ${kind} missing`;\n\t\tfor (const [name, wanted] of Object.entries(consumerMembers)) {\n\t\t\tconst offered = providerMembers[name];\n\t\t\tif (offered === undefined || offered.kind !== wanted.kind) return `${kind}.${name} missing or of another kind`;\n\t\t\tif (offered.kind === \"method\" && wanted.kind === \"method\") {\n\t\t\t\t// Both take arguments or neither does; a consumer that expects no result accepts any.\n\t\t\t\tif ((wanted.args === undefined) !== (offered.args === undefined)) return `${kind}.${name} arguments`;\n\t\t\t\tif (wanted.args !== undefined && offered.args !== undefined && !fits(wanted.args, offered.args))\n\t\t\t\t\treturn `${kind}.${name} arguments`;\n\t\t\t\tif (wanted.result !== undefined && (offered.result === undefined || !fits(offered.result, wanted.result)))\n\t\t\t\t\treturn `${kind}.${name} result`;\n\t\t\t} else if (offered.kind === \"state\" && wanted.kind === \"state\") {\n\t\t\t\tif (!fits(offered.schema, wanted.schema)) return `${kind}.${name} state`;\n\t\t\t} else if (offered.kind === \"opaque\" && wanted.kind === \"opaque\" && offered.id !== wanted.id) {\n\t\t\t\treturn `${kind}.${name} opaque ${offered.id} != ${wanted.id}`;\n\t\t\t}\n\t\t}\n\t}\n\treturn undefined;\n}\n\nconst samePlacement = (a: Description, b: Description): boolean =>\n\tcanonicalJson(a.host ?? null) === canonicalJson(b.host ?? null);\nconst placementOf = (description: Description): string =>\n\tdescription.host === undefined ? \"(local)\" : placementText(description.host);\n\n/** Maps the provider's current implementation to the view a consumer of an older contract version expects. */\nexport type Adapter = (current: Record<string, unknown>) => Record<string, unknown>;\nexport type Accepts = Readonly<Record<number, Adapter>>;\n\n/** How a consumer token binds to a provider: directly or through an `accepts` adapter. Throws contract_mismatch. */\nexport function bind(provider: AnyContract, accepts: Accepts | undefined, consumer: AnyContract): Adapter | undefined {\n\tif (provider.fingerprint === consumer.fingerprint) return undefined;\n\t// A moved type is another type for its consumers: no adapter reaches across hosts.\n\tif (!samePlacement(provider.description, consumer.description)) {\n\t\tthrow new ChordError(\n\t\t\t\"contract_mismatch\",\n\t\t\t`${provider.name} lives on ${placementOf(provider.description)}, the consumer expects ${placementOf(consumer.description)}`,\n\t\t);\n\t}\n\tif (provider.version === consumer.version) {\n\t\tconst reason = coverage(provider.description, consumer.description);\n\t\tif (reason === undefined) return undefined;\n\t\tthrow new ChordError(\n\t\t\t\"contract_mismatch\",\n\t\t\t`${provider.name}@${provider.version} does not cover the consumer's description (${reason}); forgotten version bump?`,\n\t\t);\n\t}\n\tconst adapter = accepts?.[consumer.version];\n\tif (adapter === undefined) {\n\t\tthrow new ChordError(\n\t\t\t\"contract_mismatch\",\n\t\t\t`${provider.name}: provider version ${provider.version}, consumer version ${consumer.version}, no accepts adapter`,\n\t\t);\n\t}\n\treturn adapter;\n}\n\n// ─── Static types ────────────────────────────────────────────────────────────\n\ntype Empty = Record<never, never>;\ntype StateOf<V> = V extends { readonly state: infer S extends Readonly<Record<string, Schema>> } ? S : Empty;\ntype StaticOf<S> = S extends Schema ? Static<S> : never;\ntype MethodsOf<V> = V extends { readonly methods: infer M extends Readonly<Record<string, MethodSpec>> } ? M : Empty;\n\n/** What a handler returns: the result's value, or nothing for a void method. */\ntype Returned<R> = [R] extends [Schema] ? Static<R> | Promise<Static<R>> : void | Promise<void>;\n/** What a call resolves to. */\ntype Resolved<R> = [R] extends [Schema] ? Static<R> : undefined;\n\n/** A method's handler; `P` is the app's principal type (`ctx.principal`). */\nexport type MethodImplementation<M, P = unknown> = M extends MethodSpec<infer A, infer R>\n\t? [A] extends [Schema]\n\t\t? (args: Static<A>, ctx: Ctx<P>) => Returned<R>\n\t\t: (ctx: Ctx<P>) => Returned<R>\n\t: never;\nexport type Call<M> = M extends MethodSpec<infer A, infer R>\n\t? [A] extends [Schema]\n\t\t? (args: Static<A>, ctx?: Ctx) => Promise<Resolved<R>>\n\t\t: (ctx?: Ctx) => Promise<Resolved<R>>\n\t: never;\n\n/** Whether `contract`'s method `name` takes no arguments (it is called as `ref.name(ctx)`). */\nexport function takesNoArgs(contract: AnyContract, name: string): boolean {\n\tfor (const members of Object.values(contract.description.variants)) {\n\t\tconst member = members[name];\n\t\tif (member?.kind === \"method\") return member.args === undefined;\n\t}\n\treturn false;\n}\n\ntype VariantImplementation<K, V, P> = { readonly variant: K } & {\n\treadonly [S in keyof StateOf<V>]: StateSource<StaticOf<StateOf<V>[S]>>;\n} & {\n\treadonly [M in keyof MethodsOf<V>]: MethodImplementation<MethodsOf<V>[M], P>;\n};\n/**\n * A reference in one variant: its state members are plain readables (a reference you hold has its state) and its\n * methods calls. `variant` discriminates the union `Ref` is for a multi-variant type.\n */\ntype VariantRef<C extends AnyContract, K, V> = RefBase<C> & { readonly variant: K } & {\n\treadonly [S in keyof StateOf<V>]: Readable<StaticOf<StateOf<V>[S]>>;\n} & {\n\treadonly [M in keyof MethodsOf<V>]: Call<MethodsOf<V>[M]>;\n};\n\ntype LocalImplementationMember<M, P> = M extends MethodSpec\n\t? MethodImplementation<M, P>\n\t: M extends OpaqueSpec<infer T>\n\t\t? T | Exposed<T>\n\t\t: M extends Schema\n\t\t\t? StateSource<Static<M>>\n\t\t\t: never;\ntype LocalRefMember<M> = M extends MethodSpec\n\t? Call<M>\n\t: M extends OpaqueSpec<infer T>\n\t\t? T | undefined\n\t\t: M extends Schema\n\t\t\t? Readable<Static<M>>\n\t\t\t: never;\ntype LocalMembers<D> = D extends { readonly members: infer M extends Readonly<Record<string, LocalMember>> }\n\t? M\n\t: Empty;\n\nexport type InputOf<C> = C extends { readonly def: { readonly input: infer I extends Schema } } ? Static<I> : never;\n\n/** What a factory returns for contract C; its methods' `ctx.principal` is `P`. */\nexport type ImplementationOf<C, P = unknown> = C extends RemoteContract<infer D>\n\t? { [K in keyof D[\"variants\"]]: VariantImplementation<K, D[\"variants\"][K], P> }[keyof D[\"variants\"]]\n\t: C extends LocalContract<infer D>\n\t\t? { readonly [K in keyof LocalMembers<D>]: LocalImplementationMember<LocalMembers<D>[K], P> } & Record<\n\t\t\t\tstring,\n\t\t\t\tunknown\n\t\t\t>\n\t\t: never;\n\n/**\n * What `get` returns for contract C. A remote type's reference is a union discriminated by `variant`: another variant's\n * members are reachable only after narrowing (`if (ref.variant === \"editor\") ref.add(…)`). A local type's reference has\n * its members.\n */\nexport type Ref<C extends AnyContract = AnyContract> = C extends RemoteContract<infer D>\n\t? { [K in keyof D[\"variants\"]]: VariantRef<C, K, D[\"variants\"][K]> }[keyof D[\"variants\"]]\n\t: C extends LocalContract<infer D>\n\t\t? RefBase<C> & { readonly [K in keyof LocalMembers<D>]: LocalRefMember<LocalMembers<D>[K]> }\n\t\t: never;\n"]}
|
|
@@ -87,10 +87,9 @@ function copyPath(root, path, length, owned) {
|
|
|
87
87
|
function shallowCopy(value) {
|
|
88
88
|
if (Array.isArray(value))
|
|
89
89
|
return Array.from(value);
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
return result;
|
|
90
|
+
// Spread and `Object.assign()` onto a null-prototype object define own data properties, `__proto__` included, as
|
|
91
|
+
// `defineData()` per key does, at a fraction of its cost.
|
|
92
|
+
return Object.getPrototypeOf(value) === null ? Object.assign(Object.create(null), value) : { ...value };
|
|
94
93
|
}
|
|
95
94
|
function read(target, key) {
|
|
96
95
|
return target[key];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply-immutable-trusted.js","sourceRoot":"","sources":["../../src/delta/apply-immutable-trusted.ts"],"names":[],"mappings":"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","sourcesContent":["import type { JsonValue } from \"../json.ts\";\nimport type { Op, Path, Seg } from \"./index.ts\";\n\ntype JsonContainer = JsonValue[] | Record<string, JsonValue>;\ntype CopiedPath = { root: JsonValue; target: JsonContainer };\n\nconst DATA_DESCRIPTOR: PropertyDescriptor = {\n\tvalue: undefined,\n\twritable: true,\n\tenumerable: true,\n\tconfigurable: true,\n};\n\n/** Apply self-produced trusted operations while copying each touched container once. */\nexport function applyImmutableTrusted<T>(target: T, operations: readonly Op[]): T {\n\tlet root = target as unknown as JsonValue;\n\tconst owned = new WeakSet<object>();\n\tfor (const operation of operations) {\n\t\tif (operation[0] === \"r\") {\n\t\t\troot = operation[1];\n\t\t\tcontinue;\n\t\t}\n\t\tif (operation[0] === \"p\" || operation[0] === \"m\") {\n\t\t\tconst copied = copyPath(root, operation[1], operation[1].length, owned);\n\t\t\troot = copied.root;\n\t\t\tif (!Array.isArray(copied.target)) throw new TypeError(\"Trusted array operation target is not an array\");\n\t\t\tif (operation[0] === \"p\") spliceTrusted(copied.target, operation[2], operation[3], operation[4]);\n\t\t\telse permuteTrusted(copied.target, operation[2]);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst path = operation[1];\n\t\tconst copied = copyPath(root, path, path.length - 1, owned);\n\t\troot = copied.root;\n\t\tconst key = path[path.length - 1]!;\n\t\tswitch (operation[0]) {\n\t\t\tcase \"s\":\n\t\t\t\tdefineData(copied.target, key, operation[2]);\n\t\t\t\tbreak;\n\t\t\tcase \"d\":\n\t\t\t\tif (Array.isArray(copied.target)) {\n\t\t\t\t\tif (typeof key !== \"number\") throw new TypeError(\"Trusted array deletion key is not numeric\");\n\t\t\t\t\tspliceTrusted(copied.target, key, 1, []);\n\t\t\t\t} else Reflect.deleteProperty(copied.target, key);\n\t\t\t\tbreak;\n\t\t\tcase \"a\": {\n\t\t\t\tconst current = read(copied.target, key);\n\t\t\t\tif (typeof current !== \"string\") throw new TypeError(\"Trusted append target is not a string\");\n\t\t\t\tdefineData(copied.target, key, `${current}${operation[2]}`);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"t\": {\n\t\t\t\tconst current = read(copied.target, key);\n\t\t\t\tif (typeof current !== \"string\") throw new TypeError(\"Trusted truncate target is not a string\");\n\t\t\t\tdefineData(copied.target, key, current.slice(operation[2]));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn root as unknown as T;\n}\n\nfunction copyPath(root: JsonValue, path: Path, length: number, owned: WeakSet<object>): CopiedPath {\n\tif (!isContainer(root)) throw new TypeError(\"Trusted operation root is not a container\");\n\tlet copiedRoot = root;\n\tif (!owned.has(root)) {\n\t\tcopiedRoot = shallowCopy(root);\n\t\towned.add(copiedRoot);\n\t}\n\tlet destination = copiedRoot as JsonContainer;\n\tfor (let index = 0; index < length; index++) {\n\t\tconst segment = path[index]!;\n\t\tconst child = read(destination, segment);\n\t\tif (!isContainer(child)) throw new TypeError(\"Trusted operation path is not a container\");\n\t\tif (owned.has(child)) {\n\t\t\tdestination = child;\n\t\t\tcontinue;\n\t\t}\n\t\tconst copy = shallowCopy(child);\n\t\tdefineData(destination, segment, copy);\n\t\towned.add(copy);\n\t\tdestination = copy;\n\t}\n\treturn { root: copiedRoot, target: destination };\n}\n\nfunction shallowCopy(value: JsonContainer): JsonContainer {\n\tif (Array.isArray(value)) return Array.from(value);\n\tconst result = Object.create(Object.getPrototypeOf(value) === null ? null : Object.prototype) as Record<\n\t\tstring,\n\t\tJsonValue\n\t>;\n\tfor (const key of Object.keys(value)) defineData(result, key, value[key]!);\n\treturn result;\n}\n\nfunction read(target: JsonContainer, key: Seg): JsonValue {\n\treturn (target as Record<Seg, JsonValue>)[key]!;\n}\n\nfunction defineData(target: JsonContainer, key: Seg, value: JsonValue): void {\n\tDATA_DESCRIPTOR.value = value;\n\tObject.defineProperty(target, key, DATA_DESCRIPTOR);\n\tDATA_DESCRIPTOR.value = undefined;\n}\n\nfunction spliceTrusted(target: JsonValue[], start: number, remove: number, items: readonly JsonValue[]): void {\n\tconst oldLength = target.length;\n\tconst delta = items.length - remove;\n\tif (delta > 0) {\n\t\ttarget.length = oldLength + delta;\n\t\ttarget.copyWithin(start + items.length, start + remove, oldLength);\n\t} else if (delta < 0) {\n\t\ttarget.copyWithin(start + items.length, start + remove, oldLength);\n\t\ttarget.length = oldLength + delta;\n\t}\n\tfor (let index = 0; index < items.length; index++) defineData(target, start + index, items[index]!);\n}\n\nfunction permuteTrusted(target: JsonValue[], permutation: readonly number[]): void {\n\tif (target.length !== permutation.length) throw new TypeError(\"Trusted permutation length mismatch\");\n\tconst previous = target.slice();\n\tfor (let index = 0; index < permutation.length; index++) target[index] = previous[permutation[index]!]!;\n}\n\nfunction isContainer(value: unknown): value is JsonContainer {\n\treturn value !== null && typeof value === \"object\";\n}\n"]}
|
|
1
|
+
{"version":3,"file":"apply-immutable-trusted.js","sourceRoot":"","sources":["../../src/delta/apply-immutable-trusted.ts"],"names":[],"mappings":"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","sourcesContent":["import type { JsonValue } from \"../json.ts\";\nimport type { Op, Path, Seg } from \"./index.ts\";\n\ntype JsonContainer = JsonValue[] | Record<string, JsonValue>;\ntype CopiedPath = { root: JsonValue; target: JsonContainer };\n\nconst DATA_DESCRIPTOR: PropertyDescriptor = {\n\tvalue: undefined,\n\twritable: true,\n\tenumerable: true,\n\tconfigurable: true,\n};\n\n/** Apply self-produced trusted operations while copying each touched container once. */\nexport function applyImmutableTrusted<T>(target: T, operations: readonly Op[]): T {\n\tlet root = target as unknown as JsonValue;\n\tconst owned = new WeakSet<object>();\n\tfor (const operation of operations) {\n\t\tif (operation[0] === \"r\") {\n\t\t\troot = operation[1];\n\t\t\tcontinue;\n\t\t}\n\t\tif (operation[0] === \"p\" || operation[0] === \"m\") {\n\t\t\tconst copied = copyPath(root, operation[1], operation[1].length, owned);\n\t\t\troot = copied.root;\n\t\t\tif (!Array.isArray(copied.target)) throw new TypeError(\"Trusted array operation target is not an array\");\n\t\t\tif (operation[0] === \"p\") spliceTrusted(copied.target, operation[2], operation[3], operation[4]);\n\t\t\telse permuteTrusted(copied.target, operation[2]);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst path = operation[1];\n\t\tconst copied = copyPath(root, path, path.length - 1, owned);\n\t\troot = copied.root;\n\t\tconst key = path[path.length - 1]!;\n\t\tswitch (operation[0]) {\n\t\t\tcase \"s\":\n\t\t\t\tdefineData(copied.target, key, operation[2]);\n\t\t\t\tbreak;\n\t\t\tcase \"d\":\n\t\t\t\tif (Array.isArray(copied.target)) {\n\t\t\t\t\tif (typeof key !== \"number\") throw new TypeError(\"Trusted array deletion key is not numeric\");\n\t\t\t\t\tspliceTrusted(copied.target, key, 1, []);\n\t\t\t\t} else Reflect.deleteProperty(copied.target, key);\n\t\t\t\tbreak;\n\t\t\tcase \"a\": {\n\t\t\t\tconst current = read(copied.target, key);\n\t\t\t\tif (typeof current !== \"string\") throw new TypeError(\"Trusted append target is not a string\");\n\t\t\t\tdefineData(copied.target, key, `${current}${operation[2]}`);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"t\": {\n\t\t\t\tconst current = read(copied.target, key);\n\t\t\t\tif (typeof current !== \"string\") throw new TypeError(\"Trusted truncate target is not a string\");\n\t\t\t\tdefineData(copied.target, key, current.slice(operation[2]));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn root as unknown as T;\n}\n\nfunction copyPath(root: JsonValue, path: Path, length: number, owned: WeakSet<object>): CopiedPath {\n\tif (!isContainer(root)) throw new TypeError(\"Trusted operation root is not a container\");\n\tlet copiedRoot = root;\n\tif (!owned.has(root)) {\n\t\tcopiedRoot = shallowCopy(root);\n\t\towned.add(copiedRoot);\n\t}\n\tlet destination = copiedRoot as JsonContainer;\n\tfor (let index = 0; index < length; index++) {\n\t\tconst segment = path[index]!;\n\t\tconst child = read(destination, segment);\n\t\tif (!isContainer(child)) throw new TypeError(\"Trusted operation path is not a container\");\n\t\tif (owned.has(child)) {\n\t\t\tdestination = child;\n\t\t\tcontinue;\n\t\t}\n\t\tconst copy = shallowCopy(child);\n\t\tdefineData(destination, segment, copy);\n\t\towned.add(copy);\n\t\tdestination = copy;\n\t}\n\treturn { root: copiedRoot, target: destination };\n}\n\nfunction shallowCopy(value: JsonContainer): JsonContainer {\n\tif (Array.isArray(value)) return Array.from(value);\n\t// Spread and `Object.assign()` onto a null-prototype object define own data properties, `__proto__` included, as\n\t// `defineData()` per key does, at a fraction of its cost.\n\treturn Object.getPrototypeOf(value) === null ? Object.assign(Object.create(null), value) : { ...value };\n}\n\nfunction read(target: JsonContainer, key: Seg): JsonValue {\n\treturn (target as Record<Seg, JsonValue>)[key]!;\n}\n\nfunction defineData(target: JsonContainer, key: Seg, value: JsonValue): void {\n\tDATA_DESCRIPTOR.value = value;\n\tObject.defineProperty(target, key, DATA_DESCRIPTOR);\n\tDATA_DESCRIPTOR.value = undefined;\n}\n\nfunction spliceTrusted(target: JsonValue[], start: number, remove: number, items: readonly JsonValue[]): void {\n\tconst oldLength = target.length;\n\tconst delta = items.length - remove;\n\tif (delta > 0) {\n\t\ttarget.length = oldLength + delta;\n\t\ttarget.copyWithin(start + items.length, start + remove, oldLength);\n\t} else if (delta < 0) {\n\t\ttarget.copyWithin(start + items.length, start + remove, oldLength);\n\t\ttarget.length = oldLength + delta;\n\t}\n\tfor (let index = 0; index < items.length; index++) defineData(target, start + index, items[index]!);\n}\n\nfunction permuteTrusted(target: JsonValue[], permutation: readonly number[]): void {\n\tif (target.length !== permutation.length) throw new TypeError(\"Trusted permutation length mismatch\");\n\tconst previous = target.slice();\n\tfor (let index = 0; index < permutation.length; index++) target[index] = previous[permutation[index]!]!;\n}\n\nfunction isContainer(value: unknown): value is JsonContainer {\n\treturn value !== null && typeof value === \"object\";\n}\n"]}
|
package/dist/delta/diff.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/delta/diff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAqB,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/delta/diff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAqB,KAAK,EAAE,EAA+D,MAAM,YAAY,CAAC;AAggBrH,2EAA2E;AAC3E,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,GAAG,EAAE,EAAE,CAUvE"}
|
package/dist/delta/diff.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { overlap, RESERVED_SEGMENTS } from "./index.js";
|
|
1
|
+
import { overlap, ownedSlice, RESERVED_SEGMENTS } from "./index.js";
|
|
2
2
|
const DEFAULT_OVERLAP_SCAN = 65_536;
|
|
3
3
|
const MAX_DELTA_OPERATIONS = 4_096;
|
|
4
4
|
const overflowedBatches = new WeakSet();
|
|
@@ -64,11 +64,13 @@ const permutation = (before, after) => {
|
|
|
64
64
|
}
|
|
65
65
|
return result;
|
|
66
66
|
};
|
|
67
|
+
// O(length): comparing two revisions reads both strings, and slicing a rope makes V8 flatten all of it. A writer that
|
|
68
|
+
// knows what it appended records it with appendText() instead of diffing.
|
|
67
69
|
const emitString = (before, after, path, operations) => {
|
|
68
70
|
if (before === after)
|
|
69
71
|
return;
|
|
70
72
|
if (after.length > before.length && after.slice(0, before.length) === before) {
|
|
71
|
-
emitOperation(operations, ["a", path, after
|
|
73
|
+
emitOperation(operations, ["a", path, ownedSlice(after, before.length)]);
|
|
72
74
|
return;
|
|
73
75
|
}
|
|
74
76
|
const shared = overlap(before, after, DEFAULT_OVERLAP_SCAN);
|
|
@@ -78,7 +80,7 @@ const emitString = (before, after, path, operations) => {
|
|
|
78
80
|
}
|
|
79
81
|
emitOperation(operations, ["t", path, before.length - shared]);
|
|
80
82
|
if (after.length > shared)
|
|
81
|
-
emitOperation(operations, ["a", path, after
|
|
83
|
+
emitOperation(operations, ["a", path, ownedSlice(after, shared)]);
|
|
82
84
|
};
|
|
83
85
|
const MAX_IDENTITY_CANDIDATES = 200_000;
|
|
84
86
|
const MAX_SEMANTIC_CELLS = 65_536;
|