@earendil-works/chord 1.4.0 → 1.5.1
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 +92 -0
- package/README.md +115 -90
- package/dist/context/index.d.ts +1 -1
- package/dist/context/index.d.ts.map +1 -1
- package/dist/context/index.js +1 -1
- package/dist/context/index.js.map +1 -1
- package/dist/contracts/accepts.d.ts +81 -0
- package/dist/contracts/accepts.d.ts.map +1 -0
- package/dist/contracts/accepts.js +123 -0
- package/dist/contracts/accepts.js.map +1 -0
- package/dist/contracts/contract.d.ts +121 -0
- package/dist/contracts/contract.d.ts.map +1 -0
- package/dist/contracts/contract.js +50 -0
- package/dist/contracts/contract.js.map +1 -0
- package/dist/contracts/declare.d.ts +107 -0
- package/dist/contracts/declare.d.ts.map +1 -0
- package/dist/contracts/declare.js +136 -0
- package/dist/contracts/declare.js.map +1 -0
- package/dist/contracts/evolve.d.ts +92 -0
- package/dist/contracts/evolve.d.ts.map +1 -0
- package/dist/contracts/evolve.js +179 -0
- package/dist/contracts/evolve.js.map +1 -0
- package/dist/contracts/fingerprint.d.ts +16 -0
- package/dist/contracts/fingerprint.d.ts.map +1 -0
- package/dist/contracts/fingerprint.js +50 -0
- package/dist/contracts/fingerprint.js.map +1 -0
- package/dist/contracts/history.d.ts +71 -0
- package/dist/contracts/history.d.ts.map +1 -0
- package/dist/contracts/history.js +3 -0
- package/dist/contracts/history.js.map +1 -0
- package/dist/contracts/host-kind.d.ts +40 -0
- package/dist/contracts/host-kind.d.ts.map +1 -0
- package/dist/contracts/host-kind.js +37 -0
- package/dist/contracts/host-kind.js.map +1 -0
- package/dist/contracts/index.d.ts +7 -0
- package/dist/contracts/index.d.ts.map +1 -0
- package/dist/contracts/index.js +6 -0
- package/dist/contracts/index.js.map +1 -0
- package/dist/contracts/internal.d.ts +10 -0
- package/dist/contracts/internal.d.ts.map +1 -0
- package/dist/contracts/internal.js +9 -0
- package/dist/contracts/internal.js.map +1 -0
- package/dist/contracts/names.d.ts +3 -0
- package/dist/contracts/names.d.ts.map +1 -0
- package/dist/contracts/names.js +13 -0
- package/dist/contracts/names.js.map +1 -0
- package/dist/contracts/params.d.ts +28 -0
- package/dist/contracts/params.d.ts.map +1 -0
- package/dist/contracts/params.js +50 -0
- package/dist/contracts/params.js.map +1 -0
- package/dist/contracts/schema.d.ts +102 -0
- package/dist/contracts/schema.d.ts.map +1 -0
- package/dist/contracts/schema.js +103 -0
- package/dist/contracts/schema.js.map +1 -0
- package/dist/contracts/snapshot.d.ts +16 -0
- package/dist/contracts/snapshot.d.ts.map +1 -0
- package/dist/contracts/snapshot.js +167 -0
- package/dist/contracts/snapshot.js.map +1 -0
- package/dist/data/args.d.ts +50 -0
- package/dist/data/args.d.ts.map +1 -0
- package/dist/data/args.js +83 -0
- package/dist/data/args.js.map +1 -0
- package/dist/data/errors.d.ts +80 -0
- package/dist/data/errors.d.ts.map +1 -0
- package/dist/data/errors.js +116 -0
- package/dist/data/errors.js.map +1 -0
- package/dist/data/failure.d.ts +26 -0
- package/dist/data/failure.d.ts.map +1 -0
- package/dist/data/failure.js +77 -0
- package/dist/data/failure.js.map +1 -0
- package/dist/data/index.d.ts +4 -0
- package/dist/data/index.d.ts.map +1 -0
- package/dist/data/index.js +5 -0
- package/dist/data/index.js.map +1 -0
- package/dist/data/internal.d.ts +7 -0
- package/dist/data/internal.d.ts.map +1 -0
- package/dist/data/internal.js +8 -0
- package/dist/data/internal.js.map +1 -0
- package/dist/data/params.d.ts +20 -0
- package/dist/data/params.d.ts.map +1 -0
- package/dist/data/params.js +31 -0
- package/dist/data/params.js.map +1 -0
- package/dist/data/principal.d.ts +22 -0
- package/dist/data/principal.d.ts.map +1 -0
- package/dist/data/principal.js +49 -0
- package/dist/data/principal.js.map +1 -0
- package/dist/data/validator.d.ts +12 -0
- package/dist/data/validator.d.ts.map +1 -0
- package/dist/data/validator.js +35 -0
- package/dist/data/validator.js.map +1 -0
- 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/documents/address-source.d.ts +20 -0
- package/dist/documents/address-source.d.ts.map +1 -0
- package/dist/documents/address-source.js +44 -0
- package/dist/documents/address-source.js.map +1 -0
- package/dist/documents/definition.d.ts +84 -0
- package/dist/documents/definition.d.ts.map +1 -0
- package/dist/documents/definition.js +74 -0
- package/dist/documents/definition.js.map +1 -0
- package/dist/documents/documents.d.ts +126 -0
- package/dist/documents/documents.d.ts.map +1 -0
- package/dist/documents/documents.js +248 -0
- package/dist/documents/documents.js.map +1 -0
- package/dist/documents/fence.d.ts +9 -0
- package/dist/documents/fence.d.ts.map +1 -0
- package/dist/documents/fence.js +15 -0
- package/dist/documents/fence.js.map +1 -0
- package/dist/documents/handles.d.ts +76 -0
- package/dist/documents/handles.d.ts.map +1 -0
- package/dist/documents/handles.js +66 -0
- package/dist/documents/handles.js.map +1 -0
- package/dist/documents/index.d.ts +4 -0
- package/dist/documents/index.d.ts.map +1 -0
- package/dist/documents/index.js +3 -0
- package/dist/documents/index.js.map +1 -0
- package/dist/documents/internal.d.ts +9 -0
- package/dist/documents/internal.d.ts.map +1 -0
- package/dist/documents/internal.js +9 -0
- package/dist/documents/internal.js.map +1 -0
- package/dist/documents/keyed-slot.d.ts +103 -0
- package/dist/documents/keyed-slot.d.ts.map +1 -0
- package/dist/documents/keyed-slot.js +395 -0
- package/dist/documents/keyed-slot.js.map +1 -0
- package/dist/documents/line.d.ts +7 -0
- package/dist/documents/line.d.ts.map +1 -0
- package/dist/documents/line.js +14 -0
- package/dist/documents/line.js.map +1 -0
- package/dist/documents/persistence.d.ts +104 -0
- package/dist/documents/persistence.d.ts.map +1 -0
- package/dist/documents/persistence.js +129 -0
- package/dist/documents/persistence.js.map +1 -0
- package/dist/documents/residency.d.ts +31 -0
- package/dist/documents/residency.d.ts.map +1 -0
- package/dist/documents/residency.js +93 -0
- package/dist/documents/residency.js.map +1 -0
- package/dist/documents/slot.d.ts +109 -0
- package/dist/documents/slot.d.ts.map +1 -0
- package/dist/documents/slot.js +181 -0
- package/dist/documents/slot.js.map +1 -0
- package/dist/documents/transaction.d.ts +143 -0
- package/dist/documents/transaction.d.ts.map +1 -0
- package/dist/documents/transaction.js +442 -0
- package/dist/documents/transaction.js.map +1 -0
- package/dist/host/activity.d.ts +31 -0
- package/dist/host/activity.d.ts.map +1 -0
- package/dist/host/activity.js +40 -0
- package/dist/host/activity.js.map +1 -0
- package/dist/host/adapted.d.ts +49 -0
- package/dist/host/adapted.d.ts.map +1 -0
- package/dist/host/adapted.js +214 -0
- package/dist/host/adapted.js.map +1 -0
- package/dist/host/attempt.d.ts +308 -0
- package/dist/host/attempt.d.ts.map +1 -0
- package/dist/host/attempt.js +1199 -0
- package/dist/host/attempt.js.map +1 -0
- package/dist/host/backoff.d.ts +29 -0
- package/dist/host/backoff.d.ts.map +1 -0
- package/dist/host/backoff.js +69 -0
- package/dist/host/backoff.js.map +1 -0
- package/dist/host/ctx.d.ts +94 -0
- package/dist/host/ctx.d.ts.map +1 -0
- package/dist/host/ctx.js +200 -0
- package/dist/host/ctx.js.map +1 -0
- package/dist/host/deadline.d.ts +12 -0
- package/dist/host/deadline.d.ts.map +1 -0
- package/dist/host/deadline.js +40 -0
- package/dist/host/deadline.js.map +1 -0
- package/dist/host/dependencies.d.ts +65 -0
- package/dist/host/dependencies.d.ts.map +1 -0
- package/dist/host/dependencies.js +115 -0
- package/dist/host/dependencies.js.map +1 -0
- package/dist/host/destination.d.ts +48 -0
- package/dist/host/destination.d.ts.map +1 -0
- package/dist/host/destination.js +101 -0
- package/dist/host/destination.js.map +1 -0
- package/dist/host/facet.d.ts +84 -0
- package/dist/host/facet.d.ts.map +1 -0
- package/dist/host/facet.js +55 -0
- package/dist/host/facet.js.map +1 -0
- package/dist/host/follow.d.ts +52 -0
- package/dist/host/follow.d.ts.map +1 -0
- package/dist/host/follow.js +207 -0
- package/dist/host/follow.js.map +1 -0
- package/dist/host/host.d.ts +571 -0
- package/dist/host/host.d.ts.map +1 -0
- package/dist/host/host.js +1318 -0
- package/dist/host/host.js.map +1 -0
- package/dist/host/index.d.ts +17 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +6 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/internal.d.ts +11 -0
- package/dist/host/internal.d.ts.map +1 -0
- package/dist/host/internal.js +9 -0
- package/dist/host/internal.js.map +1 -0
- package/dist/host/members.d.ts +50 -0
- package/dist/host/members.d.ts.map +1 -0
- package/dist/host/members.js +107 -0
- package/dist/host/members.js.map +1 -0
- package/dist/host/native.d.ts +64 -0
- package/dist/host/native.d.ts.map +1 -0
- package/dist/host/native.js +126 -0
- package/dist/host/native.js.map +1 -0
- package/dist/host/object.d.ts +331 -0
- package/dist/host/object.d.ts.map +1 -0
- package/dist/host/object.js +1296 -0
- package/dist/host/object.js.map +1 -0
- package/dist/host/old-work.d.ts +34 -0
- package/dist/host/old-work.d.ts.map +1 -0
- package/dist/host/old-work.js +52 -0
- package/dist/host/old-work.js.map +1 -0
- package/dist/host/parked.d.ts +23 -0
- package/dist/host/parked.d.ts.map +1 -0
- package/dist/host/parked.js +79 -0
- package/dist/host/parked.js.map +1 -0
- package/dist/host/presence.d.ts +34 -0
- package/dist/host/presence.d.ts.map +1 -0
- package/dist/host/presence.js +117 -0
- package/dist/host/presence.js.map +1 -0
- package/dist/host/readiness.d.ts +27 -0
- package/dist/host/readiness.d.ts.map +1 -0
- package/dist/host/readiness.js +134 -0
- package/dist/host/readiness.js.map +1 -0
- package/dist/host/ref-state.d.ts +53 -0
- package/dist/host/ref-state.d.ts.map +1 -0
- package/dist/host/ref-state.js +83 -0
- package/dist/host/ref-state.js.map +1 -0
- package/dist/host/reference-keys.d.ts +36 -0
- package/dist/host/reference-keys.d.ts.map +1 -0
- package/dist/host/reference-keys.js +168 -0
- package/dist/host/reference-keys.js.map +1 -0
- package/dist/host/reference-source.d.ts +65 -0
- package/dist/host/reference-source.d.ts.map +1 -0
- package/dist/host/reference-source.js +285 -0
- package/dist/host/reference-source.js.map +1 -0
- package/dist/host/reference.d.ts +321 -0
- package/dist/host/reference.d.ts.map +1 -0
- package/dist/host/reference.js +797 -0
- package/dist/host/reference.js.map +1 -0
- package/dist/host/reload-cycle.d.ts +16 -0
- package/dist/host/reload-cycle.d.ts.map +1 -0
- package/dist/host/reload-cycle.js +81 -0
- package/dist/host/reload-cycle.js.map +1 -0
- package/dist/host/retry-on.d.ts +28 -0
- package/dist/host/retry-on.d.ts.map +1 -0
- package/dist/host/retry-on.js +52 -0
- package/dist/host/retry-on.js.map +1 -0
- package/dist/host/revocation.d.ts +16 -0
- package/dist/host/revocation.d.ts.map +1 -0
- package/dist/host/revocation.js +27 -0
- package/dist/host/revocation.js.map +1 -0
- package/dist/host/root.d.ts +37 -0
- package/dist/host/root.d.ts.map +1 -0
- package/dist/host/root.js +68 -0
- package/dist/host/root.js.map +1 -0
- package/dist/host/route.d.ts +64 -0
- package/dist/host/route.d.ts.map +1 -0
- package/dist/host/route.js +227 -0
- package/dist/host/route.js.map +1 -0
- package/dist/host/routines.d.ts +78 -0
- package/dist/host/routines.d.ts.map +1 -0
- package/dist/host/routines.js +398 -0
- package/dist/host/routines.js.map +1 -0
- package/dist/host/sleep.d.ts +9 -0
- package/dist/host/sleep.d.ts.map +1 -0
- package/dist/host/sleep.js +40 -0
- package/dist/host/sleep.js.map +1 -0
- package/dist/host/staging.d.ts +94 -0
- package/dist/host/staging.d.ts.map +1 -0
- package/dist/host/staging.js +304 -0
- package/dist/host/staging.js.map +1 -0
- package/dist/host/unbound-clock.d.ts +23 -0
- package/dist/host/unbound-clock.d.ts.map +1 -0
- package/dist/host/unbound-clock.js +58 -0
- package/dist/host/unbound-clock.js.map +1 -0
- package/dist/host/unbound.d.ts +37 -0
- package/dist/host/unbound.d.ts.map +1 -0
- package/dist/host/unbound.js +88 -0
- package/dist/host/unbound.js.map +1 -0
- package/dist/host/uuid.d.ts +3 -0
- package/dist/host/uuid.d.ts.map +1 -0
- package/dist/host/uuid.js +38 -0
- package/dist/host/uuid.js.map +1 -0
- package/dist/index.d.ts +29 -18
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -9
- package/dist/index.js.map +1 -1
- package/dist/jobs/definition.d.ts +96 -0
- package/dist/jobs/definition.d.ts.map +1 -0
- package/dist/jobs/definition.js +83 -0
- package/dist/jobs/definition.js.map +1 -0
- package/dist/jobs/index.d.ts +5 -0
- package/dist/jobs/index.d.ts.map +1 -0
- package/dist/jobs/index.js +3 -0
- package/dist/jobs/index.js.map +1 -0
- package/dist/jobs/internal.d.ts +3 -0
- package/dist/jobs/internal.d.ts.map +1 -0
- package/dist/jobs/internal.js +4 -0
- package/dist/jobs/internal.js.map +1 -0
- package/dist/jobs/job.d.ts +149 -0
- package/dist/jobs/job.d.ts.map +1 -0
- package/dist/jobs/job.js +387 -0
- package/dist/jobs/job.js.map +1 -0
- package/dist/jobs/persisted.d.ts +38 -0
- package/dist/jobs/persisted.d.ts.map +1 -0
- package/dist/jobs/persisted.js +95 -0
- package/dist/jobs/persisted.js.map +1 -0
- package/dist/jobs/records.d.ts +231 -0
- package/dist/jobs/records.d.ts.map +1 -0
- package/dist/jobs/records.js +871 -0
- package/dist/jobs/records.js.map +1 -0
- package/dist/jobs/run-states.d.ts +69 -0
- package/dist/jobs/run-states.d.ts.map +1 -0
- package/dist/jobs/run-states.js +228 -0
- package/dist/jobs/run-states.js.map +1 -0
- package/dist/jobs/run.d.ts +117 -0
- package/dist/jobs/run.d.ts.map +1 -0
- package/dist/jobs/run.js +204 -0
- package/dist/jobs/run.js.map +1 -0
- package/dist/jobs/running.d.ts +44 -0
- package/dist/jobs/running.d.ts.map +1 -0
- package/dist/jobs/running.js +117 -0
- package/dist/jobs/running.js.map +1 -0
- package/dist/jobs/stored.d.ts +63 -0
- package/dist/jobs/stored.d.ts.map +1 -0
- package/dist/jobs/stored.js +55 -0
- package/dist/jobs/stored.js.map +1 -0
- package/dist/link/binary.d.ts +4 -0
- package/dist/link/binary.d.ts.map +1 -0
- package/dist/link/binary.js +544 -0
- package/dist/link/binary.js.map +1 -0
- package/dist/link/channel.d.ts +68 -0
- package/dist/link/channel.d.ts.map +1 -0
- package/dist/link/channel.js +215 -0
- package/dist/link/channel.js.map +1 -0
- package/dist/link/errors.d.ts +7 -0
- package/dist/link/errors.d.ts.map +1 -0
- package/dist/link/errors.js +21 -0
- package/dist/link/errors.js.map +1 -0
- package/dist/link/index.d.ts +8 -0
- package/dist/link/index.d.ts.map +1 -0
- package/dist/link/index.js +8 -0
- package/dist/link/index.js.map +1 -0
- package/dist/link/internal.d.ts +9 -0
- package/dist/link/internal.d.ts.map +1 -0
- package/dist/link/internal.js +10 -0
- package/dist/link/internal.js.map +1 -0
- package/dist/link/ipc.d.ts +22 -0
- package/dist/link/ipc.d.ts.map +1 -0
- package/dist/link/ipc.js +64 -0
- package/dist/link/ipc.js.map +1 -0
- package/dist/link/link.d.ts +34 -0
- package/dist/link/link.d.ts.map +1 -0
- package/dist/link/link.js +87 -0
- package/dist/link/link.js.map +1 -0
- package/dist/link/message.d.ts +262 -0
- package/dist/link/message.d.ts.map +1 -0
- package/dist/link/message.js +156 -0
- package/dist/link/message.js.map +1 -0
- package/dist/link/part.d.ts +80 -0
- package/dist/link/part.d.ts.map +1 -0
- package/dist/link/part.js +165 -0
- package/dist/link/part.js.map +1 -0
- package/dist/link/text.d.ts +6 -0
- package/dist/link/text.d.ts.map +1 -0
- package/dist/link/text.js +355 -0
- package/dist/link/text.js.map +1 -0
- package/dist/link/values.d.ts +40 -0
- package/dist/link/values.d.ts.map +1 -0
- package/dist/link/values.js +121 -0
- package/dist/link/values.js.map +1 -0
- package/dist/link/websocket.d.ts +26 -0
- package/dist/link/websocket.d.ts.map +1 -0
- package/dist/link/websocket.js +91 -0
- package/dist/link/websocket.js.map +1 -0
- package/dist/node/app/app.d.ts +269 -0
- package/dist/node/app/app.d.ts.map +1 -0
- package/dist/node/app/app.js +513 -0
- package/dist/node/app/app.js.map +1 -0
- package/dist/node/app/archive.d.ts +37 -0
- package/dist/node/app/archive.d.ts.map +1 -0
- package/dist/node/app/archive.js +204 -0
- package/dist/node/app/archive.js.map +1 -0
- package/dist/node/app/blobs.d.ts +23 -0
- package/dist/node/app/blobs.d.ts.map +1 -0
- package/dist/node/app/blobs.js +64 -0
- package/dist/node/app/blobs.js.map +1 -0
- package/dist/node/app/data.d.ts +35 -0
- package/dist/node/app/data.d.ts.map +1 -0
- package/dist/node/app/data.js +44 -0
- package/dist/node/app/data.js.map +1 -0
- package/dist/node/app/ephemeral-sessions.d.ts +20 -0
- package/dist/node/app/ephemeral-sessions.d.ts.map +1 -0
- package/dist/node/app/ephemeral-sessions.js +69 -0
- package/dist/node/app/ephemeral-sessions.js.map +1 -0
- package/dist/node/app/ephemeral.d.ts +11 -0
- package/dist/node/app/ephemeral.d.ts.map +1 -0
- package/dist/node/app/ephemeral.js +34 -0
- package/dist/node/app/ephemeral.js.map +1 -0
- package/dist/node/app/files-copy.d.ts +13 -0
- package/dist/node/app/files-copy.d.ts.map +1 -0
- package/dist/node/app/files-copy.js +86 -0
- package/dist/node/app/files-copy.js.map +1 -0
- package/dist/node/app/files-entry.d.ts +4 -0
- package/dist/node/app/files-entry.d.ts.map +1 -0
- package/dist/node/app/files-entry.js +7 -0
- package/dist/node/app/files-entry.js.map +1 -0
- package/dist/node/app/files-index.d.ts +180 -0
- package/dist/node/app/files-index.d.ts.map +1 -0
- package/dist/node/app/files-index.js +535 -0
- package/dist/node/app/files-index.js.map +1 -0
- package/dist/node/app/files.d.ts +363 -0
- package/dist/node/app/files.d.ts.map +1 -0
- package/dist/node/app/files.js +368 -0
- package/dist/node/app/files.js.map +1 -0
- package/dist/node/app/folder-views.d.ts +21 -0
- package/dist/node/app/folder-views.d.ts.map +1 -0
- package/dist/node/app/folder-views.js +55 -0
- package/dist/node/app/folder-views.js.map +1 -0
- package/dist/node/app/index.d.ts +12 -0
- package/dist/node/app/index.d.ts.map +1 -0
- package/dist/node/app/index.js +15 -0
- package/dist/node/app/index.js.map +1 -0
- package/dist/node/app/info.d.ts +66 -0
- package/dist/node/app/info.d.ts.map +1 -0
- package/dist/node/app/info.js +37 -0
- package/dist/node/app/info.js.map +1 -0
- package/dist/node/app/invite.d.ts +5 -0
- package/dist/node/app/invite.d.ts.map +1 -0
- package/dist/node/app/invite.js +64 -0
- package/dist/node/app/invite.js.map +1 -0
- package/dist/node/app/layout.d.ts +36 -0
- package/dist/node/app/layout.d.ts.map +1 -0
- package/dist/node/app/layout.js +87 -0
- package/dist/node/app/layout.js.map +1 -0
- package/dist/node/app/owner.d.ts +31 -0
- package/dist/node/app/owner.d.ts.map +1 -0
- package/dist/node/app/owner.js +104 -0
- package/dist/node/app/owner.js.map +1 -0
- package/dist/node/app/pairing.d.ts +55 -0
- package/dist/node/app/pairing.d.ts.map +1 -0
- package/dist/node/app/pairing.js +183 -0
- package/dist/node/app/pairing.js.map +1 -0
- package/dist/node/app/secrets.d.ts +16 -0
- package/dist/node/app/secrets.d.ts.map +1 -0
- package/dist/node/app/secrets.js +72 -0
- package/dist/node/app/secrets.js.map +1 -0
- package/dist/node/app/sessions.d.ts +72 -0
- package/dist/node/app/sessions.d.ts.map +1 -0
- package/dist/node/app/sessions.js +222 -0
- package/dist/node/app/sessions.js.map +1 -0
- package/dist/node/app/tar.d.ts +24 -0
- package/dist/node/app/tar.d.ts.map +1 -0
- package/dist/node/app/tar.js +167 -0
- package/dist/node/app/tar.js.map +1 -0
- package/dist/node/app/uploads.d.ts +37 -0
- package/dist/node/app/uploads.d.ts.map +1 -0
- package/dist/node/app/uploads.js +157 -0
- package/dist/node/app/uploads.js.map +1 -0
- package/dist/node/app/users.d.ts +37 -0
- package/dist/node/app/users.d.ts.map +1 -0
- package/dist/node/app/users.js +62 -0
- package/dist/node/app/users.js.map +1 -0
- package/dist/node/app/worker.d.ts +18 -0
- package/dist/node/app/worker.d.ts.map +1 -0
- package/dist/node/app/worker.js +84 -0
- package/dist/node/app/worker.js.map +1 -0
- package/dist/node/compression.d.ts +7 -0
- package/dist/node/compression.d.ts.map +1 -0
- package/dist/node/compression.js +25 -0
- package/dist/node/compression.js.map +1 -0
- package/dist/node/http/admission.d.ts +63 -0
- package/dist/node/http/admission.d.ts.map +1 -0
- package/dist/node/http/admission.js +134 -0
- package/dist/node/http/admission.js.map +1 -0
- package/dist/node/http/authenticate.d.ts +21 -0
- package/dist/node/http/authenticate.d.ts.map +1 -0
- package/dist/node/http/authenticate.js +34 -0
- package/dist/node/http/authenticate.js.map +1 -0
- package/dist/node/http/cookies.d.ts +32 -0
- package/dist/node/http/cookies.d.ts.map +1 -0
- package/dist/node/http/cookies.js +70 -0
- package/dist/node/http/cookies.js.map +1 -0
- package/dist/node/http/file.d.ts +23 -0
- package/dist/node/http/file.d.ts.map +1 -0
- package/dist/node/http/file.js +94 -0
- package/dist/node/http/file.js.map +1 -0
- package/dist/node/http/headers.d.ts +37 -0
- package/dist/node/http/headers.d.ts.map +1 -0
- package/dist/node/http/headers.js +136 -0
- package/dist/node/http/headers.js.map +1 -0
- package/dist/node/http/http.d.ts +111 -0
- package/dist/node/http/http.d.ts.map +1 -0
- package/dist/node/http/http.js +524 -0
- package/dist/node/http/http.js.map +1 -0
- package/dist/node/http/incoming.d.ts +19 -0
- package/dist/node/http/incoming.d.ts.map +1 -0
- package/dist/node/http/incoming.js +31 -0
- package/dist/node/http/incoming.js.map +1 -0
- package/dist/node/http/index.d.ts +11 -0
- package/dist/node/http/index.d.ts.map +1 -0
- package/dist/node/http/index.js +12 -0
- package/dist/node/http/index.js.map +1 -0
- package/dist/node/http/node.d.ts +78 -0
- package/dist/node/http/node.d.ts.map +1 -0
- package/dist/node/http/node.js +291 -0
- package/dist/node/http/node.js.map +1 -0
- package/dist/node/http/request.d.ts +60 -0
- package/dist/node/http/request.d.ts.map +1 -0
- package/dist/node/http/request.js +118 -0
- package/dist/node/http/request.js.map +1 -0
- package/dist/node/http/response.d.ts +63 -0
- package/dist/node/http/response.d.ts.map +1 -0
- package/dist/node/http/response.js +202 -0
- package/dist/node/http/response.js.map +1 -0
- package/dist/node/http/router.d.ts +132 -0
- package/dist/node/http/router.d.ts.map +1 -0
- package/dist/node/http/router.js +267 -0
- package/dist/node/http/router.js.map +1 -0
- package/dist/node/http/upgrades.d.ts +61 -0
- package/dist/node/http/upgrades.d.ts.map +1 -0
- package/dist/node/http/upgrades.js +192 -0
- package/dist/node/http/upgrades.js.map +1 -0
- package/dist/node/plugins/base-inputs.d.ts +14 -0
- package/dist/node/plugins/base-inputs.d.ts.map +1 -0
- package/dist/node/plugins/base-inputs.js +33 -0
- package/dist/node/plugins/base-inputs.js.map +1 -0
- package/dist/node/plugins/build.d.ts +77 -0
- package/dist/node/plugins/build.d.ts.map +1 -0
- package/dist/node/plugins/build.js +576 -0
- package/dist/node/plugins/build.js.map +1 -0
- package/dist/node/plugins/css-modules.d.ts +13 -0
- package/dist/node/plugins/css-modules.d.ts.map +1 -0
- package/dist/node/plugins/css-modules.js +58 -0
- package/dist/node/plugins/css-modules.js.map +1 -0
- package/dist/node/plugins/discover.d.ts +67 -0
- package/dist/node/plugins/discover.d.ts.map +1 -0
- package/dist/node/plugins/discover.js +369 -0
- package/dist/node/plugins/discover.js.map +1 -0
- package/dist/node/plugins/evaluate.d.ts +33 -0
- package/dist/node/plugins/evaluate.d.ts.map +1 -0
- package/dist/node/plugins/evaluate.js +121 -0
- package/dist/node/plugins/evaluate.js.map +1 -0
- package/dist/node/plugins/index.d.ts +11 -0
- package/dist/node/plugins/index.d.ts.map +1 -0
- package/dist/node/plugins/index.js +13 -0
- package/dist/node/plugins/index.js.map +1 -0
- package/dist/node/plugins/install.d.ts +38 -0
- package/dist/node/plugins/install.d.ts.map +1 -0
- package/dist/node/plugins/install.js +213 -0
- package/dist/node/plugins/install.js.map +1 -0
- package/dist/node/plugins/plugins.d.ts +162 -0
- package/dist/node/plugins/plugins.d.ts.map +1 -0
- package/dist/node/plugins/plugins.js +244 -0
- package/dist/node/plugins/plugins.js.map +1 -0
- package/dist/node/plugins/runtime.d.ts +57 -0
- package/dist/node/plugins/runtime.d.ts.map +1 -0
- package/dist/node/plugins/runtime.js +92 -0
- package/dist/node/plugins/runtime.js.map +1 -0
- package/dist/node/plugins/stack.d.ts +16 -0
- package/dist/node/plugins/stack.d.ts.map +1 -0
- package/dist/node/plugins/stack.js +61 -0
- package/dist/node/plugins/stack.js.map +1 -0
- package/dist/node/plugins/testing.d.ts +58 -0
- package/dist/node/plugins/testing.d.ts.map +1 -0
- package/dist/node/plugins/testing.js +210 -0
- package/dist/node/plugins/testing.js.map +1 -0
- package/dist/node/plugins/watcher.d.ts +69 -0
- package/dist/node/plugins/watcher.d.ts.map +1 -0
- package/dist/node/plugins/watcher.js +622 -0
- package/dist/node/plugins/watcher.js.map +1 -0
- package/dist/node/surfaces/bundle.d.ts +31 -0
- package/dist/node/surfaces/bundle.d.ts.map +1 -0
- package/dist/node/surfaces/bundle.js +118 -0
- package/dist/node/surfaces/bundle.js.map +1 -0
- package/dist/node/surfaces/current.d.ts +17 -0
- package/dist/node/surfaces/current.d.ts.map +1 -0
- package/dist/node/surfaces/current.js +54 -0
- package/dist/node/surfaces/current.js.map +1 -0
- package/dist/node/surfaces/index.d.ts +6 -0
- package/dist/node/surfaces/index.d.ts.map +1 -0
- package/dist/node/surfaces/index.js +6 -0
- package/dist/node/surfaces/index.js.map +1 -0
- package/dist/node/surfaces/published.d.ts +27 -0
- package/dist/node/surfaces/published.d.ts.map +1 -0
- package/dist/node/surfaces/published.js +142 -0
- package/dist/node/surfaces/published.js.map +1 -0
- package/dist/node/surfaces/served.d.ts +15 -0
- package/dist/node/surfaces/served.d.ts.map +1 -0
- package/dist/node/surfaces/served.js +42 -0
- package/dist/node/surfaces/served.js.map +1 -0
- package/dist/node/surfaces/surface-build.d.ts +53 -0
- package/dist/node/surfaces/surface-build.d.ts.map +1 -0
- package/dist/node/surfaces/surface-build.js +105 -0
- package/dist/node/surfaces/surface-build.js.map +1 -0
- package/dist/node/surfaces/tui.d.ts +40 -0
- package/dist/node/surfaces/tui.d.ts.map +1 -0
- package/dist/node/surfaces/tui.js +55 -0
- package/dist/node/surfaces/tui.js.map +1 -0
- package/dist/node/surfaces/web.d.ts +56 -0
- package/dist/node/surfaces/web.d.ts.map +1 -0
- package/dist/node/surfaces/web.js +108 -0
- package/dist/node/surfaces/web.js.map +1 -0
- package/dist/node/tui/actions.d.ts +49 -0
- package/dist/node/tui/actions.d.ts.map +1 -0
- package/dist/node/tui/actions.js +195 -0
- package/dist/node/tui/actions.js.map +1 -0
- package/dist/node/tui/credentials.d.ts +17 -0
- package/dist/node/tui/credentials.d.ts.map +1 -0
- package/dist/node/tui/credentials.js +54 -0
- package/dist/node/tui/credentials.js.map +1 -0
- package/dist/node/tui/filter.d.ts +5 -0
- package/dist/node/tui/filter.d.ts.map +1 -0
- package/dist/node/tui/filter.js +79 -0
- package/dist/node/tui/filter.js.map +1 -0
- package/dist/node/tui/index.d.ts +6 -0
- package/dist/node/tui/index.d.ts.map +1 -0
- package/dist/node/tui/index.js +6 -0
- package/dist/node/tui/index.js.map +1 -0
- package/dist/node/tui/launcher.d.ts +40 -0
- package/dist/node/tui/launcher.d.ts.map +1 -0
- package/dist/node/tui/launcher.js +439 -0
- package/dist/node/tui/launcher.js.map +1 -0
- package/dist/node/tui/pipe.d.ts +18 -0
- package/dist/node/tui/pipe.d.ts.map +1 -0
- package/dist/node/tui/pipe.js +134 -0
- package/dist/node/tui/pipe.js.map +1 -0
- package/dist/node/tui/sandbox.d.ts +54 -0
- package/dist/node/tui/sandbox.d.ts.map +1 -0
- package/dist/node/tui/sandbox.js +431 -0
- package/dist/node/tui/sandbox.js.map +1 -0
- package/dist/node/workers/base.d.ts +30 -0
- package/dist/node/workers/base.d.ts.map +1 -0
- package/dist/node/workers/base.js +255 -0
- package/dist/node/workers/base.js.map +1 -0
- package/dist/node/workers/child.d.ts +4 -0
- package/dist/node/workers/child.d.ts.map +1 -0
- package/dist/node/workers/child.js +6 -0
- package/dist/node/workers/child.js.map +1 -0
- package/dist/node/workers/control.d.ts +83 -0
- package/dist/node/workers/control.d.ts.map +1 -0
- package/dist/node/workers/control.js +77 -0
- package/dist/node/workers/control.js.map +1 -0
- package/dist/node/workers/index.d.ts +4 -0
- package/dist/node/workers/index.d.ts.map +1 -0
- package/dist/node/workers/index.js +7 -0
- package/dist/node/workers/index.js.map +1 -0
- package/dist/node/workers/lock.d.ts +30 -0
- package/dist/node/workers/lock.d.ts.map +1 -0
- package/dist/node/workers/lock.js +180 -0
- package/dist/node/workers/lock.js.map +1 -0
- package/dist/node/workers/main.d.ts +46 -0
- package/dist/node/workers/main.d.ts.map +1 -0
- package/dist/node/workers/main.js +230 -0
- package/dist/node/workers/main.js.map +1 -0
- package/dist/node/workers/process.d.ts +42 -0
- package/dist/node/workers/process.d.ts.map +1 -0
- package/dist/node/workers/process.js +125 -0
- package/dist/node/workers/process.js.map +1 -0
- package/dist/node/workers/workers.d.ts +122 -0
- package/dist/node/workers/workers.d.ts.map +1 -0
- package/dist/node/workers/workers.js +677 -0
- package/dist/node/workers/workers.js.map +1 -0
- package/dist/output.d.ts +1 -1
- package/dist/output.d.ts.map +1 -1
- package/dist/output.js +4 -2
- package/dist/output.js.map +1 -1
- package/dist/react/hooks.d.ts +43 -0
- package/dist/react/hooks.d.ts.map +1 -0
- package/dist/react/hooks.js +82 -0
- package/dist/react/hooks.js.map +1 -0
- package/dist/react/index.d.ts +3 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +4 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/stores.d.ts +9 -0
- package/dist/react/stores.d.ts.map +1 -0
- package/dist/react/stores.js +37 -0
- package/dist/react/stores.js.map +1 -0
- package/dist/registries/contribution.d.ts +50 -0
- package/dist/registries/contribution.d.ts.map +1 -0
- package/dist/registries/contribution.js +129 -0
- package/dist/registries/contribution.js.map +1 -0
- package/dist/registries/entries.d.ts +18 -0
- package/dist/registries/entries.d.ts.map +1 -0
- package/dist/registries/entries.js +42 -0
- package/dist/registries/entries.js.map +1 -0
- package/dist/registries/index.d.ts +3 -0
- package/dist/registries/index.d.ts.map +1 -0
- package/dist/registries/index.js +5 -0
- package/dist/registries/index.js.map +1 -0
- package/dist/registries/internal.d.ts +4 -0
- package/dist/registries/internal.d.ts.map +1 -0
- package/dist/registries/internal.js +5 -0
- package/dist/registries/internal.js.map +1 -0
- package/dist/registries/record.d.ts +115 -0
- package/dist/registries/record.d.ts.map +1 -0
- package/dist/registries/record.js +283 -0
- package/dist/registries/record.js.map +1 -0
- package/dist/registries/registry.d.ts +74 -0
- package/dist/registries/registry.d.ts.map +1 -0
- package/dist/registries/registry.js +14 -0
- package/dist/registries/registry.js.map +1 -0
- package/dist/registries/value.d.ts +48 -0
- package/dist/registries/value.d.ts.map +1 -0
- package/dist/registries/value.js +224 -0
- package/dist/registries/value.js.map +1 -0
- package/dist/remote/calls.d.ts +25 -0
- package/dist/remote/calls.d.ts.map +1 -0
- package/dist/remote/calls.js +62 -0
- package/dist/remote/calls.js.map +1 -0
- package/dist/remote/consumer.d.ts +43 -0
- package/dist/remote/consumer.d.ts.map +1 -0
- package/dist/remote/consumer.js +350 -0
- package/dist/remote/consumer.js.map +1 -0
- package/dist/remote/hold.d.ts +141 -0
- package/dist/remote/hold.d.ts.map +1 -0
- package/dist/remote/hold.js +579 -0
- package/dist/remote/hold.js.map +1 -0
- package/dist/remote/host-link.d.ts +77 -0
- package/dist/remote/host-link.d.ts.map +1 -0
- package/dist/remote/host-link.js +184 -0
- package/dist/remote/host-link.js.map +1 -0
- package/dist/remote/internal.d.ts +6 -0
- package/dist/remote/internal.d.ts.map +1 -0
- package/dist/remote/internal.js +6 -0
- package/dist/remote/internal.js.map +1 -0
- package/dist/remote/path.d.ts +46 -0
- package/dist/remote/path.d.ts.map +1 -0
- package/dist/remote/path.js +73 -0
- package/dist/remote/path.js.map +1 -0
- package/dist/remote/provider.d.ts +89 -0
- package/dist/remote/provider.d.ts.map +1 -0
- package/dist/remote/provider.js +597 -0
- package/dist/remote/provider.js.map +1 -0
- package/dist/remote/relay.d.ts +69 -0
- package/dist/remote/relay.d.ts.map +1 -0
- package/dist/remote/relay.js +219 -0
- package/dist/remote/relay.js.map +1 -0
- package/dist/remote/remote-object.d.ts +138 -0
- package/dist/remote/remote-object.d.ts.map +1 -0
- package/dist/remote/remote-object.js +492 -0
- package/dist/remote/remote-object.js.map +1 -0
- package/dist/remote/replica.d.ts +59 -0
- package/dist/remote/replica.d.ts.map +1 -0
- package/dist/remote/replica.js +125 -0
- package/dist/remote/replica.js.map +1 -0
- package/dist/sqlite/cloudflare.d.ts +2 -0
- package/dist/sqlite/cloudflare.d.ts.map +1 -1
- package/dist/sqlite/cloudflare.js +10 -0
- package/dist/sqlite/cloudflare.js.map +1 -1
- package/dist/sqlite/database.d.ts +5 -2
- package/dist/sqlite/database.d.ts.map +1 -1
- package/dist/sqlite/database.js.map +1 -1
- package/dist/sqlite/node.d.ts +13 -2
- package/dist/sqlite/node.d.ts.map +1 -1
- package/dist/sqlite/node.js +31 -8
- package/dist/sqlite/node.js.map +1 -1
- package/dist/state/batch.d.ts +64 -0
- package/dist/state/batch.d.ts.map +1 -0
- package/dist/state/batch.js +164 -0
- package/dist/state/batch.js.map +1 -0
- package/dist/state/derive.d.ts +52 -0
- package/dist/state/derive.d.ts.map +1 -0
- package/dist/state/derive.js +182 -0
- package/dist/state/derive.js.map +1 -0
- package/dist/state/index.d.ts +6 -0
- package/dist/state/index.d.ts.map +1 -0
- package/dist/state/index.js +4 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/internal.d.ts +6 -0
- package/dist/state/internal.d.ts.map +1 -0
- package/dist/state/internal.js +8 -0
- package/dist/state/internal.js.map +1 -0
- package/dist/state/native-source.d.ts +106 -0
- package/dist/state/native-source.d.ts.map +1 -0
- package/dist/state/native-source.js +240 -0
- package/dist/state/native-source.js.map +1 -0
- package/dist/state/watchable.d.ts +114 -0
- package/dist/state/watchable.d.ts.map +1 -0
- package/dist/state/watchable.js +156 -0
- package/dist/state/watchable.js.map +1 -0
- package/dist/state/writable.d.ts +32 -0
- package/dist/state/writable.d.ts.map +1 -0
- package/dist/state/writable.js +49 -0
- package/dist/state/writable.js.map +1 -0
- package/dist/store/adapter.d.ts +67 -0
- package/dist/store/adapter.d.ts.map +1 -0
- package/dist/store/adapter.js +118 -0
- package/dist/store/adapter.js.map +1 -0
- package/dist/store/allocator.d.ts +17 -0
- package/dist/store/allocator.d.ts.map +1 -0
- package/dist/store/allocator.js +30 -0
- package/dist/store/allocator.js.map +1 -0
- package/dist/store/applier.d.ts +8 -0
- package/dist/store/applier.d.ts.map +1 -0
- package/dist/store/applier.js +375 -0
- package/dist/store/applier.js.map +1 -0
- package/dist/store/apply-batch.d.ts +12 -0
- package/dist/store/apply-batch.d.ts.map +1 -0
- package/dist/store/apply-batch.js +83 -0
- package/dist/store/apply-batch.js.map +1 -0
- package/dist/store/archive.d.ts +32 -0
- package/dist/store/archive.d.ts.map +1 -0
- package/dist/store/archive.js +130 -0
- package/dist/store/archive.js.map +1 -0
- package/dist/store/backend.d.ts +10 -0
- package/dist/store/backend.d.ts.map +1 -0
- package/dist/store/backend.js +15 -0
- package/dist/store/backend.js.map +1 -0
- package/dist/store/catalog.d.ts +24 -0
- package/dist/store/catalog.d.ts.map +1 -0
- package/dist/store/catalog.js +17 -0
- package/dist/store/catalog.js.map +1 -0
- package/dist/store/claims.d.ts +23 -0
- package/dist/store/claims.d.ts.map +1 -0
- package/dist/store/claims.js +65 -0
- package/dist/store/claims.js.map +1 -0
- package/dist/store/columns.d.ts +77 -0
- package/dist/store/columns.d.ts.map +1 -0
- package/dist/store/columns.js +77 -0
- package/dist/store/columns.js.map +1 -0
- package/dist/store/engine.d.ts +176 -0
- package/dist/store/engine.d.ts.map +1 -0
- package/dist/store/engine.js +283 -0
- package/dist/store/engine.js.map +1 -0
- package/dist/store/evaluate.d.ts +17 -0
- package/dist/store/evaluate.d.ts.map +1 -0
- package/dist/store/evaluate.js +128 -0
- package/dist/store/evaluate.js.map +1 -0
- package/dist/store/export.d.ts +17 -0
- package/dist/store/export.d.ts.map +1 -0
- package/dist/store/export.js +200 -0
- package/dist/store/export.js.map +1 -0
- package/dist/store/expression.d.ts +150 -0
- package/dist/store/expression.d.ts.map +1 -0
- package/dist/store/expression.js +268 -0
- package/dist/store/expression.js.map +1 -0
- package/dist/store/import.d.ts +10 -0
- package/dist/store/import.d.ts.map +1 -0
- package/dist/store/import.js +276 -0
- package/dist/store/import.js.map +1 -0
- package/dist/store/index.d.ts +16 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +13 -0
- package/dist/store/index.js.map +1 -0
- package/dist/store/json-column.d.ts +33 -0
- package/dist/store/json-column.d.ts.map +1 -0
- package/dist/store/json-column.js +62 -0
- package/dist/store/json-column.js.map +1 -0
- package/dist/store/jsonl.d.ts +9 -0
- package/dist/store/jsonl.d.ts.map +1 -0
- package/dist/store/jsonl.js +61 -0
- package/dist/store/jsonl.js.map +1 -0
- package/dist/store/live-query.d.ts +108 -0
- package/dist/store/live-query.d.ts.map +1 -0
- package/dist/store/live-query.js +254 -0
- package/dist/store/live-query.js.map +1 -0
- package/dist/store/outbox.d.ts +26 -0
- package/dist/store/outbox.d.ts.map +1 -0
- package/dist/store/outbox.js +80 -0
- package/dist/store/outbox.js.map +1 -0
- package/dist/store/query.d.ts +39 -0
- package/dist/store/query.d.ts.map +1 -0
- package/dist/store/query.js +97 -0
- package/dist/store/query.js.map +1 -0
- package/dist/store/refusal.d.ts +15 -0
- package/dist/store/refusal.d.ts.map +1 -0
- package/dist/store/refusal.js +36 -0
- package/dist/store/refusal.js.map +1 -0
- package/dist/store/rows.d.ts +80 -0
- package/dist/store/rows.d.ts.map +1 -0
- package/dist/store/rows.js +183 -0
- package/dist/store/rows.js.map +1 -0
- package/dist/store/schema.d.ts +25 -0
- package/dist/store/schema.d.ts.map +1 -0
- package/dist/store/schema.js +115 -0
- package/dist/store/schema.js.map +1 -0
- package/dist/store/sql.d.ts +73 -0
- package/dist/store/sql.d.ts.map +1 -0
- package/dist/store/sql.js +234 -0
- package/dist/store/sql.js.map +1 -0
- package/dist/store/step.d.ts +50 -0
- package/dist/store/step.d.ts.map +1 -0
- package/dist/store/step.js +52 -0
- package/dist/store/step.js.map +1 -0
- package/dist/store/store.d.ts +171 -0
- package/dist/store/store.d.ts.map +1 -0
- package/dist/store/store.js +818 -0
- package/dist/store/store.js.map +1 -0
- package/dist/store/table-changes.d.ts +29 -0
- package/dist/store/table-changes.d.ts.map +1 -0
- package/dist/store/table-changes.js +102 -0
- package/dist/store/table-changes.js.map +1 -0
- package/dist/store/table-evolve.d.ts +74 -0
- package/dist/store/table-evolve.d.ts.map +1 -0
- package/dist/store/table-evolve.js +201 -0
- package/dist/store/table-evolve.js.map +1 -0
- package/dist/store/table-handle.d.ts +73 -0
- package/dist/store/table-handle.d.ts.map +1 -0
- package/dist/store/table-handle.js +101 -0
- package/dist/store/table-handle.js.map +1 -0
- package/dist/store/table-history.d.ts +75 -0
- package/dist/store/table-history.d.ts.map +1 -0
- package/dist/store/table-history.js +42 -0
- package/dist/store/table-history.js.map +1 -0
- package/dist/store/table-migration.d.ts +16 -0
- package/dist/store/table-migration.d.ts.map +1 -0
- package/dist/store/table-migration.js +202 -0
- package/dist/store/table-migration.js.map +1 -0
- package/dist/store/table-writes.d.ts +125 -0
- package/dist/store/table-writes.d.ts.map +1 -0
- package/dist/store/table-writes.js +170 -0
- package/dist/store/table-writes.js.map +1 -0
- package/dist/store/table.d.ts +80 -0
- package/dist/store/table.d.ts.map +1 -0
- package/dist/store/table.js +103 -0
- package/dist/store/table.js.map +1 -0
- package/dist/store/text.d.ts +14 -0
- package/dist/store/text.d.ts.map +1 -0
- package/dist/store/text.js +51 -0
- package/dist/store/text.js.map +1 -0
- package/dist/store/writes.d.ts +5 -0
- package/dist/store/writes.d.ts.map +1 -0
- package/dist/store/writes.js +4 -0
- package/dist/store/writes.js.map +1 -0
- package/dist/surfaces/active-language.d.ts +20 -0
- package/dist/surfaces/active-language.d.ts.map +1 -0
- package/dist/surfaces/active-language.js +78 -0
- package/dist/surfaces/active-language.js.map +1 -0
- package/dist/surfaces/active-theme.d.ts +16 -0
- package/dist/surfaces/active-theme.d.ts.map +1 -0
- package/dist/surfaces/active-theme.js +47 -0
- package/dist/surfaces/active-theme.js.map +1 -0
- package/dist/surfaces/client.d.ts +96 -0
- package/dist/surfaces/client.d.ts.map +1 -0
- package/dist/surfaces/client.js +264 -0
- package/dist/surfaces/client.js.map +1 -0
- package/dist/surfaces/connection.d.ts +49 -0
- package/dist/surfaces/connection.d.ts.map +1 -0
- package/dist/surfaces/connection.js +142 -0
- package/dist/surfaces/connection.js.map +1 -0
- package/dist/surfaces/format.d.ts +5 -0
- package/dist/surfaces/format.d.ts.map +1 -0
- package/dist/surfaces/format.js +37 -0
- package/dist/surfaces/format.js.map +1 -0
- package/dist/surfaces/index.d.ts +15 -0
- package/dist/surfaces/index.d.ts.map +1 -0
- package/dist/surfaces/index.js +18 -0
- package/dist/surfaces/index.js.map +1 -0
- package/dist/surfaces/language.d.ts +53 -0
- package/dist/surfaces/language.d.ts.map +1 -0
- package/dist/surfaces/language.js +74 -0
- package/dist/surfaces/language.js.map +1 -0
- package/dist/surfaces/loaded.d.ts +42 -0
- package/dist/surfaces/loaded.d.ts.map +1 -0
- package/dist/surfaces/loaded.js +116 -0
- package/dist/surfaces/loaded.js.map +1 -0
- package/dist/surfaces/locale-choice.d.ts +25 -0
- package/dist/surfaces/locale-choice.d.ts.map +1 -0
- package/dist/surfaces/locale-choice.js +14 -0
- package/dist/surfaces/locale-choice.js.map +1 -0
- package/dist/surfaces/messages.d.ts +67 -0
- package/dist/surfaces/messages.d.ts.map +1 -0
- package/dist/surfaces/messages.js +112 -0
- package/dist/surfaces/messages.js.map +1 -0
- package/dist/surfaces/page-state.d.ts +14 -0
- package/dist/surfaces/page-state.d.ts.map +1 -0
- package/dist/surfaces/page-state.js +43 -0
- package/dist/surfaces/page-state.js.map +1 -0
- package/dist/surfaces/preference.d.ts +32 -0
- package/dist/surfaces/preference.d.ts.map +1 -0
- package/dist/surfaces/preference.js +72 -0
- package/dist/surfaces/preference.js.map +1 -0
- package/dist/surfaces/registered.d.ts +33 -0
- package/dist/surfaces/registered.d.ts.map +1 -0
- package/dist/surfaces/registered.js +51 -0
- package/dist/surfaces/registered.js.map +1 -0
- package/dist/surfaces/scripts.d.ts +84 -0
- package/dist/surfaces/scripts.d.ts.map +1 -0
- package/dist/surfaces/scripts.js +28 -0
- package/dist/surfaces/scripts.js.map +1 -0
- package/dist/surfaces/theme-choice.d.ts +31 -0
- package/dist/surfaces/theme-choice.d.ts.map +1 -0
- package/dist/surfaces/theme-choice.js +18 -0
- package/dist/surfaces/theme-choice.js.map +1 -0
- package/dist/surfaces/themes.d.ts +43 -0
- package/dist/surfaces/themes.d.ts.map +1 -0
- package/dist/surfaces/themes.js +110 -0
- package/dist/surfaces/themes.js.map +1 -0
- package/dist/surfaces/translations.d.ts +29 -0
- package/dist/surfaces/translations.d.ts.map +1 -0
- package/dist/surfaces/translations.js +57 -0
- package/dist/surfaces/translations.js.map +1 -0
- package/dist/sync/batch.d.ts +18 -0
- package/dist/sync/batch.d.ts.map +1 -0
- package/dist/sync/batch.js +125 -0
- package/dist/sync/batch.js.map +1 -0
- package/dist/sync/client.d.ts +166 -0
- package/dist/sync/client.d.ts.map +1 -0
- package/dist/sync/client.js +438 -0
- package/dist/sync/client.js.map +1 -0
- package/dist/sync/files.d.ts +46 -0
- package/dist/sync/files.d.ts.map +1 -0
- package/dist/sync/files.js +13 -0
- package/dist/sync/files.js.map +1 -0
- package/dist/sync/filesystem.d.ts +37 -0
- package/dist/sync/filesystem.d.ts.map +1 -0
- package/dist/sync/filesystem.js +185 -0
- package/dist/sync/filesystem.js.map +1 -0
- package/dist/sync/index.d.ts +8 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +9 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/lines.d.ts +18 -0
- package/dist/sync/lines.d.ts.map +1 -0
- package/dist/sync/lines.js +46 -0
- package/dist/sync/lines.js.map +1 -0
- package/dist/sync/remote.d.ts +130 -0
- package/dist/sync/remote.d.ts.map +1 -0
- package/dist/sync/remote.js +46 -0
- package/dist/sync/remote.js.map +1 -0
- package/dist/sync/state.d.ts +17 -0
- package/dist/sync/state.d.ts.map +1 -0
- package/dist/sync/state.js +40 -0
- package/dist/sync/state.js.map +1 -0
- package/dist/telemetry-ingest/batch.d.ts +70 -0
- package/dist/telemetry-ingest/batch.d.ts.map +1 -0
- package/dist/telemetry-ingest/batch.js +110 -0
- package/dist/telemetry-ingest/batch.js.map +1 -0
- package/dist/telemetry-ingest/facet.d.ts +21 -0
- package/dist/telemetry-ingest/facet.d.ts.map +1 -0
- package/dist/telemetry-ingest/facet.js +96 -0
- package/dist/telemetry-ingest/facet.js.map +1 -0
- package/dist/telemetry-ingest/index.d.ts +5 -0
- package/dist/telemetry-ingest/index.d.ts.map +1 -0
- package/dist/telemetry-ingest/index.js +8 -0
- package/dist/telemetry-ingest/index.js.map +1 -0
- package/dist/telemetry-ingest/recorder.d.ts +50 -0
- package/dist/telemetry-ingest/recorder.d.ts.map +1 -0
- package/dist/telemetry-ingest/recorder.js +298 -0
- package/dist/telemetry-ingest/recorder.js.map +1 -0
- package/dist/telemetry-ingest/sender.d.ts +14 -0
- package/dist/telemetry-ingest/sender.d.ts.map +1 -0
- package/dist/telemetry-ingest/sender.js +64 -0
- package/dist/telemetry-ingest/sender.js.map +1 -0
- package/dist/telemetry-sqlite/index.d.ts +13 -4
- package/dist/telemetry-sqlite/index.d.ts.map +1 -1
- package/dist/telemetry-sqlite/index.js +81 -241
- package/dist/telemetry-sqlite/index.js.map +1 -1
- package/dist/telemetry-sqlite/node.d.ts +13 -0
- package/dist/telemetry-sqlite/node.d.ts.map +1 -0
- package/dist/telemetry-sqlite/node.js +27 -0
- package/dist/telemetry-sqlite/node.js.map +1 -0
- package/dist/telemetry-sqlite/schema.d.ts +9 -0
- package/dist/telemetry-sqlite/schema.d.ts.map +1 -0
- package/dist/telemetry-sqlite/schema.js +61 -0
- package/dist/telemetry-sqlite/schema.js.map +1 -0
- package/dist/telemetry-sqlite/store.d.ts +3 -0
- package/dist/telemetry-sqlite/store.d.ts.map +1 -1
- package/dist/telemetry-sqlite/store.js +24 -13
- package/dist/telemetry-sqlite/store.js.map +1 -1
- package/dist/telemetry.d.ts +937 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +470 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/tui/bridge.d.ts +112 -0
- package/dist/tui/bridge.d.ts.map +1 -0
- package/dist/tui/bridge.js +9 -0
- package/dist/tui/bridge.js.map +1 -0
- package/dist/tui/channel.d.ts +44 -0
- package/dist/tui/channel.d.ts.map +1 -0
- package/dist/tui/channel.js +150 -0
- package/dist/tui/channel.js.map +1 -0
- package/dist/tui/frames.d.ts +5 -0
- package/dist/tui/frames.d.ts.map +1 -0
- package/dist/tui/frames.js +52 -0
- package/dist/tui/frames.js.map +1 -0
- package/dist/tui/index.d.ts +7 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/index.js +8 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/runtime.d.ts +46 -0
- package/dist/tui/runtime.d.ts.map +1 -0
- package/dist/tui/runtime.js +101 -0
- package/dist/tui/runtime.js.map +1 -0
- package/dist/tui/scope.d.ts +46 -0
- package/dist/tui/scope.d.ts.map +1 -0
- package/dist/tui/scope.js +141 -0
- package/dist/tui/scope.js.map +1 -0
- package/dist/tui/terminal.d.ts +15 -0
- package/dist/tui/terminal.d.ts.map +1 -0
- package/dist/tui/terminal.js +37 -0
- package/dist/tui/terminal.js.map +1 -0
- package/dist/tui/theme.d.ts +17 -0
- package/dist/tui/theme.d.ts.map +1 -0
- package/dist/tui/theme.js +38 -0
- package/dist/tui/theme.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/web/environment.d.ts +4 -0
- package/dist/web/environment.d.ts.map +1 -0
- package/dist/web/environment.js +37 -0
- package/dist/web/environment.js.map +1 -0
- package/dist/web/index.d.ts +5 -0
- package/dist/web/index.d.ts.map +1 -0
- package/dist/web/index.js +7 -0
- package/dist/web/index.js.map +1 -0
- package/dist/web/language.d.ts +7 -0
- package/dist/web/language.d.ts.map +1 -0
- package/dist/web/language.js +21 -0
- package/dist/web/language.js.map +1 -0
- package/dist/web/page.d.ts +29 -0
- package/dist/web/page.d.ts.map +1 -0
- package/dist/web/page.js +92 -0
- package/dist/web/page.js.map +1 -0
- package/dist/web/scripts.d.ts +23 -0
- package/dist/web/scripts.d.ts.map +1 -0
- package/dist/web/scripts.js +50 -0
- package/dist/web/scripts.js.map +1 -0
- package/dist/web/styles.d.ts +17 -0
- package/dist/web/styles.d.ts.map +1 -0
- package/dist/web/styles.js +218 -0
- package/dist/web/styles.js.map +1 -0
- package/dist/web/themes.d.ts +6 -0
- package/dist/web/themes.d.ts.map +1 -0
- package/dist/web/themes.js +31 -0
- package/dist/web/themes.js.map +1 -0
- package/docs/benchmarks.md +1036 -0
- package/docs/decisions.md +3436 -0
- package/docs/dependencies/book.md +1671 -0
- package/docs/dependencies/index.html +2641 -0
- package/docs/dependencies/model.md +330 -0
- package/docs/design.md +3065 -0
- package/docs/durable-observers/book.md +432 -0
- package/docs/durable-observers/index.html +517 -0
- package/docs/flow-control/book.md +333 -0
- package/docs/flow-control/fold/index.html +265 -0
- package/docs/flow-control/index.html +548 -0
- package/docs/flow-control/window/index.html +228 -0
- package/docs/guide-plugins-hosts/book.md +957 -0
- package/docs/guide-plugins-hosts/index.html +952 -0
- package/docs/http-workers/book.md +378 -0
- package/docs/http-workers/index.html +515 -0
- package/docs/i18n/book.md +217 -0
- package/docs/i18n/index.html +344 -0
- package/docs/layer-1.md +311 -0
- package/docs/layer-2.md +216 -0
- package/docs/p3-features/README.md +6 -0
- package/docs/p3-features/book.md +478 -0
- package/docs/plugin-authoring.md +276 -0
- package/docs/plugin-model/book.md +186 -0
- package/docs/plugin-model/index.html +310 -0
- package/docs/plugin-primer/book.md +273 -0
- package/docs/plugin-primer/index.html +430 -0
- package/docs/slice-1.md +236 -0
- package/docs/slice-10.md +288 -0
- package/docs/slice-11.md +114 -0
- package/docs/slice-12.md +132 -0
- package/docs/slice-13.md +121 -0
- package/docs/slice-2.md +174 -0
- package/docs/slice-3a.md +296 -0
- package/docs/slice-3b.md +197 -0
- package/docs/slice-4.md +146 -0
- package/docs/slice-4a.md +418 -0
- package/docs/slice-4b.md +208 -0
- package/docs/slice-5.md +281 -0
- package/docs/slice-6a.md +676 -0
- package/docs/slice-6b.md +332 -0
- package/docs/slice-7a.md +130 -0
- package/docs/slice-7b/book.md +608 -0
- package/docs/slice-7b/index.html +842 -0
- package/docs/slice-7b.md +255 -0
- package/docs/slice-7c.md +165 -0
- package/docs/slice-8.md +194 -0
- package/docs/slice-9.md +110 -0
- package/docs/slices.md +241 -0
- package/docs/store/book.md +670 -0
- package/docs/store/index.html +861 -0
- package/docs/store/walkthrough.md +193 -0
- package/docs/theming/book.md +223 -0
- package/docs/theming/index.html +371 -0
- package/docs/tutorial/book.md +2169 -0
- package/docs/tutorial/index.html +2112 -0
- package/docs/tutorial/screens/click-after.png +0 -0
- package/docs/tutorial/screens/click-before.png +0 -0
- package/docs/tutorial/screens/edited.png +0 -0
- package/docs/tutorial/screens/french.png +0 -0
- package/docs/tutorial/screens/harbor.png +0 -0
- package/docs/tutorial/screens/page.png +0 -0
- package/docs/tutorial/screens/traces-ada.png +0 -0
- package/docs/tutorial/screens/traces.png +0 -0
- package/package.json +114 -20
- package/src/delta/README.md +69 -0
- package/dist/cell.d.ts +0 -122
- package/dist/cell.d.ts.map +0 -1
- package/dist/cell.js +0 -356
- package/dist/cell.js.map +0 -1
- package/dist/cluster.d.ts +0 -27
- package/dist/cluster.d.ts.map +0 -1
- package/dist/cluster.js +0 -230
- package/dist/cluster.js.map +0 -1
- package/dist/connection.d.ts +0 -270
- package/dist/connection.d.ts.map +0 -1
- package/dist/connection.js +0 -1216
- package/dist/connection.js.map +0 -1
- package/dist/contract.d.ts +0 -208
- package/dist/contract.d.ts.map +0 -1
- package/dist/contract.js +0 -246
- package/dist/contract.js.map +0 -1
- package/dist/declare.d.ts +0 -33
- package/dist/declare.d.ts.map +0 -1
- package/dist/declare.js +0 -2
- package/dist/declare.js.map +0 -1
- package/dist/errors.d.ts +0 -28
- package/dist/errors.d.ts.map +0 -1
- package/dist/errors.js +0 -59
- package/dist/errors.js.map +0 -1
- package/dist/host.d.ts +0 -348
- package/dist/host.d.ts.map +0 -1
- package/dist/host.js +0 -1000
- package/dist/host.js.map +0 -1
- package/dist/link.d.ts +0 -107
- package/dist/link.d.ts.map +0 -1
- package/dist/link.js +0 -355
- package/dist/link.js.map +0 -1
- package/dist/loader.d.ts +0 -4
- package/dist/loader.d.ts.map +0 -1
- package/dist/loader.js +0 -73
- package/dist/loader.js.map +0 -1
- package/dist/manager.d.ts +0 -115
- package/dist/manager.d.ts.map +0 -1
- package/dist/manager.js +0 -345
- package/dist/manager.js.map +0 -1
- package/dist/node.d.ts +0 -4
- package/dist/node.d.ts.map +0 -1
- package/dist/node.js +0 -4
- package/dist/node.js.map +0 -1
- package/dist/object.d.ts +0 -438
- package/dist/object.d.ts.map +0 -1
- package/dist/object.js +0 -1571
- package/dist/object.js.map +0 -1
- package/dist/publish.d.ts +0 -5
- package/dist/publish.d.ts.map +0 -1
- package/dist/publish.js +0 -40
- package/dist/publish.js.map +0 -1
- package/dist/registry.d.ts +0 -25
- package/dist/registry.d.ts.map +0 -1
- package/dist/registry.js +0 -6
- package/dist/registry.js.map +0 -1
- package/dist/reload.d.ts +0 -126
- package/dist/reload.d.ts.map +0 -1
- package/dist/reload.js +0 -653
- package/dist/reload.js.map +0 -1
- package/dist/remote.d.ts +0 -165
- package/dist/remote.d.ts.map +0 -1
- package/dist/remote.js +0 -612
- package/dist/remote.js.map +0 -1
- package/dist/schema.d.ts +0 -21
- package/dist/schema.d.ts.map +0 -1
- package/dist/schema.js +0 -228
- package/dist/schema.js.map +0 -1
- package/dist/state.d.ts +0 -92
- package/dist/state.d.ts.map +0 -1
- package/dist/state.js +0 -287
- package/dist/state.js.map +0 -1
- package/dist/types.d.ts +0 -88
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
- package/dist/websocket.d.ts +0 -15
- package/dist/websocket.d.ts.map +0 -1
- package/dist/websocket.js +0 -16
- package/dist/websocket.js.map +0 -1
- package/dist/wire.d.ts +0 -216
- package/dist/wire.d.ts.map +0 -1
- package/dist/wire.js +0 -165
- package/dist/wire.js.map +0 -1
- package/docs/guide.md +0 -814
- package/docs/spec.md +0 -288
- package/docs/tutorial.md +0 -931
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
// A client host with its plugins (slice 11 §2, §4, decisions "Slice 11, P4" to "P6"): what a page and a terminal's
|
|
2
|
+
// sandbox both run. A client host (no address) loads the plugin scripts it started with beside the app's core facets,
|
|
3
|
+
// keeps its link to the server with the connection loop, and holds the kind's scripts object: a new set fetches the
|
|
4
|
+
// changed scripts and reloads the host in place (a failed plugin keeps its old facet; a failed fetch is tried again),
|
|
5
|
+
// a page's new stylesheets loaded before the reload and each plugin left with the one of the code it runs; a new base
|
|
6
|
+
// bundle means this client's code is outdated, which the app answers by starting over (a page reloads). The surface
|
|
7
|
+
// specifics (how a socket opens, how a script is fetched, what is outdated, the stylesheets) are given.
|
|
8
|
+
import { BACKGROUND_CONTEXT, withAbortSignal } from "../context/index.js";
|
|
9
|
+
import { createHost } from "../host/index.js";
|
|
10
|
+
import { keepConnected } from "./connection.js";
|
|
11
|
+
import { LoadedFacets } from "./loaded.js";
|
|
12
|
+
import { evaluateRegistered } from "./registered.js";
|
|
13
|
+
/** Starts a client: its host loaded with the initial scripts, its link kept, its plugins kept current. */
|
|
14
|
+
export async function startClient(options) {
|
|
15
|
+
const context = BACKGROUND_CONTEXT;
|
|
16
|
+
let made;
|
|
17
|
+
// Read at the first span, which starts once the host exists (in its load at the earliest).
|
|
18
|
+
const telemetry = options.telemetry?.(() => made.incarnation);
|
|
19
|
+
const host = createHost({ telemetry, onError: (error) => options.onError({ kind: "host", error }) });
|
|
20
|
+
made = host;
|
|
21
|
+
const entries = options.initial.map((script) => entryOf(script, options.modules));
|
|
22
|
+
const { loaded, report } = await LoadedFacets.load(host, options.core, entries, context);
|
|
23
|
+
if (report.failed.length > 0)
|
|
24
|
+
options.onError({ kind: "plugins", failed: report.failed });
|
|
25
|
+
const updates = new Updates(host, loaded, new Set(report.failed.map(({ plugin }) => plugin)), options);
|
|
26
|
+
const loop = connect(host, options, (state) => {
|
|
27
|
+
if (state === "connected")
|
|
28
|
+
updates.reconnected(context);
|
|
29
|
+
});
|
|
30
|
+
await updates.follow(context);
|
|
31
|
+
return {
|
|
32
|
+
host,
|
|
33
|
+
stop: async (ctx) => {
|
|
34
|
+
loop.stop();
|
|
35
|
+
await updates.stop();
|
|
36
|
+
await host.close(ctx);
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Keeps `host`'s parent link to the server, asking `serverBase` and `canRetry` before every reconnect; `onState` hears
|
|
42
|
+
* each state after the app's `onConnection`.
|
|
43
|
+
*/
|
|
44
|
+
function connect(host, options, onState) {
|
|
45
|
+
return keepConnected({
|
|
46
|
+
open: (events) => {
|
|
47
|
+
// The loop and the host both follow the link's close; a link has one close listener.
|
|
48
|
+
const link = new SharedClose(options.open(events));
|
|
49
|
+
// A client's parent is the server; the principal only labels the link (a client serves no remote types).
|
|
50
|
+
host.connect(link, { principal: { kind: "server" } }, BACKGROUND_CONTEXT);
|
|
51
|
+
return link;
|
|
52
|
+
},
|
|
53
|
+
onState: (state) => {
|
|
54
|
+
options.onConnection?.(state);
|
|
55
|
+
onState(state);
|
|
56
|
+
},
|
|
57
|
+
canRetry: async () => {
|
|
58
|
+
const base = await options.serverBase();
|
|
59
|
+
if (base !== undefined && base !== options.base) {
|
|
60
|
+
options.outdated();
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
return (await options.canRetry?.()) ?? true;
|
|
64
|
+
},
|
|
65
|
+
environment: options.environment,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
/** A link whose close several follow (the host and the connection loop): each listener added runs once it closes. */
|
|
69
|
+
class SharedClose {
|
|
70
|
+
#link;
|
|
71
|
+
#listeners = [];
|
|
72
|
+
#closed = false;
|
|
73
|
+
constructor(link) {
|
|
74
|
+
this.#link = link;
|
|
75
|
+
link.onClose(() => {
|
|
76
|
+
this.#closed = true;
|
|
77
|
+
for (const listener of this.#listeners.splice(0))
|
|
78
|
+
listener();
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
send(message) {
|
|
82
|
+
this.#link.send(message);
|
|
83
|
+
}
|
|
84
|
+
onMessage(listener) {
|
|
85
|
+
this.#link.onMessage(listener);
|
|
86
|
+
}
|
|
87
|
+
close() {
|
|
88
|
+
this.#link.close();
|
|
89
|
+
}
|
|
90
|
+
onClose(listener) {
|
|
91
|
+
if (this.#closed)
|
|
92
|
+
listener();
|
|
93
|
+
else
|
|
94
|
+
this.#listeners.push(listener);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/** `script` as one plugin of a complete set: its digest, and its evaluation with `modules` when it is new. */
|
|
98
|
+
function entryOf(script, modules) {
|
|
99
|
+
return {
|
|
100
|
+
name: script.plugin,
|
|
101
|
+
digest: script.digest,
|
|
102
|
+
prepare: () => {
|
|
103
|
+
try {
|
|
104
|
+
return { kind: "facet", facet: evaluateRegistered(script, modules), digest: script.digest };
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
return { kind: "failed", error };
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/** The first pause before a failed update is tried again: 1 s, doubling from there. */
|
|
113
|
+
const UPDATE_RETRY_INITIAL_MS = 1000;
|
|
114
|
+
/** The longest pause between tries of a failed update: 30 s. */
|
|
115
|
+
const UPDATE_RETRY_MAX_MS = 30_000;
|
|
116
|
+
/**
|
|
117
|
+
* The client's plugin updates: it holds the scripts object and applies each new set in order (fetching the changed
|
|
118
|
+
* scripts, loading their stylesheets, reloading the host with the complete set, settling the stylesheets); a new base
|
|
119
|
+
* calls `outdated` instead. An update that failed (a script that did not load) is tried again after a growing pause (1 s
|
|
120
|
+
* doubling to 30 s) until it applies or a newer set replaces it: the scripts object shows nothing new until the next
|
|
121
|
+
* rollout or reconnect.
|
|
122
|
+
*/
|
|
123
|
+
class Updates {
|
|
124
|
+
#host;
|
|
125
|
+
#loaded;
|
|
126
|
+
#options;
|
|
127
|
+
/**
|
|
128
|
+
* The script each plugin runs, by plugin: a plugin whose new script failed keeps its old one here, so a later set
|
|
129
|
+
* with that script (a reconnect's snapshot) tries it again.
|
|
130
|
+
*/
|
|
131
|
+
#scripts = new Map();
|
|
132
|
+
#abort = new AbortController();
|
|
133
|
+
#release;
|
|
134
|
+
/** The newest set shown: a retry applies only it. */
|
|
135
|
+
#latest;
|
|
136
|
+
/** The updates in order: one at a time, a retry's among them. */
|
|
137
|
+
#applying = Promise.resolve();
|
|
138
|
+
/** The pending retry's cancel and the pause it waited (0: none waited yet). */
|
|
139
|
+
#retry;
|
|
140
|
+
#pause = 0;
|
|
141
|
+
constructor(host, loaded, left, options) {
|
|
142
|
+
this.#host = host;
|
|
143
|
+
this.#loaded = loaded;
|
|
144
|
+
this.#options = options;
|
|
145
|
+
for (const script of options.initial)
|
|
146
|
+
if (!left.has(script.plugin))
|
|
147
|
+
this.#scripts.set(script.plugin, script);
|
|
148
|
+
}
|
|
149
|
+
/** Holds the scripts object and applies every set it shows, the first included (a reconnect's snapshot too). */
|
|
150
|
+
async follow(context) {
|
|
151
|
+
const held = this.#host.hold(this.#options.scripts, {}, context);
|
|
152
|
+
this.#release = () => held.release();
|
|
153
|
+
const watch = await held.set.watch(withAbortSignal(this.#abort.signal, context));
|
|
154
|
+
watch.start(async (call, ctx) => {
|
|
155
|
+
if (call.kind !== "value")
|
|
156
|
+
return;
|
|
157
|
+
const set = call.value;
|
|
158
|
+
this.#latest = set;
|
|
159
|
+
this.#retry?.cancel();
|
|
160
|
+
this.#retry = undefined;
|
|
161
|
+
this.#pause = 0;
|
|
162
|
+
await this.#queue(set, ctx);
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* The link is back: the newest set is applied again when this client does not run all of it (a plugin kept its old
|
|
167
|
+
* code), since the scripts object shows an unchanged set no second time.
|
|
168
|
+
*/
|
|
169
|
+
reconnected(context) {
|
|
170
|
+
const set = this.#latest;
|
|
171
|
+
if (set !== undefined && !this.#runsAll(set))
|
|
172
|
+
void this.#queue(set, context);
|
|
173
|
+
}
|
|
174
|
+
/** Stops following: the watch ends, the hold is released, a pending retry is dropped. */
|
|
175
|
+
async stop() {
|
|
176
|
+
this.#abort.abort();
|
|
177
|
+
this.#retry?.cancel();
|
|
178
|
+
this.#retry = undefined;
|
|
179
|
+
this.#release?.();
|
|
180
|
+
}
|
|
181
|
+
/** Applies `set` after the updates before it, unless a newer set replaced it meanwhile. */
|
|
182
|
+
#queue(set, context) {
|
|
183
|
+
const applied = this.#applying.then(async () => {
|
|
184
|
+
if (this.#latest !== set || this.#abort.signal.aborted)
|
|
185
|
+
return;
|
|
186
|
+
if (!(await this.#apply(set, context)))
|
|
187
|
+
this.#retryLater(set, context);
|
|
188
|
+
});
|
|
189
|
+
this.#applying = applied;
|
|
190
|
+
return applied;
|
|
191
|
+
}
|
|
192
|
+
/** Tries `set` again after the next pause (1 s doubling to 30 s). */
|
|
193
|
+
#retryLater(set, context) {
|
|
194
|
+
this.#pause = this.#pause === 0 ? UPDATE_RETRY_INITIAL_MS : Math.min(this.#pause * 2, UPDATE_RETRY_MAX_MS);
|
|
195
|
+
this.#retry = {
|
|
196
|
+
cancel: this.#options.environment.after(this.#pause, () => {
|
|
197
|
+
this.#retry = undefined;
|
|
198
|
+
void this.#queue(set, context);
|
|
199
|
+
}),
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Applies `set`: a new base calls `outdated`; else the changed scripts fetched, their new stylesheets loaded, the
|
|
204
|
+
* host reloaded with all and the stylesheets settled. `false` when it failed (reported `update_failed`): it is tried
|
|
205
|
+
* again.
|
|
206
|
+
*/
|
|
207
|
+
async #apply(set, context) {
|
|
208
|
+
const options = this.#options;
|
|
209
|
+
if (set.base !== options.base) {
|
|
210
|
+
options.outdated();
|
|
211
|
+
return true;
|
|
212
|
+
}
|
|
213
|
+
// The first frame usually shows what this client runs already: nothing to reload.
|
|
214
|
+
const changed = !this.#runsAll(set);
|
|
215
|
+
try {
|
|
216
|
+
const scripts = [];
|
|
217
|
+
if (changed) {
|
|
218
|
+
for (const entry of set.plugins) {
|
|
219
|
+
const known = this.#scripts.get(entry.name);
|
|
220
|
+
scripts.push(known?.digest === entry.digest ? known : await options.fetchScript(entry));
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
await options.styles?.prepare(set, this.#abort.signal);
|
|
224
|
+
if (this.#abort.signal.aborted)
|
|
225
|
+
return true;
|
|
226
|
+
const kept = changed ? await this.#reload(scripts, context) : new Set();
|
|
227
|
+
options.styles?.settle(set, kept);
|
|
228
|
+
return true;
|
|
229
|
+
}
|
|
230
|
+
catch (error) {
|
|
231
|
+
options.onError({ kind: "update_failed", error });
|
|
232
|
+
return false;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
/** Whether this client runs every script of `set` and nothing else. */
|
|
236
|
+
#runsAll(set) {
|
|
237
|
+
const running = this.#scripts;
|
|
238
|
+
return (set.plugins.length === running.size &&
|
|
239
|
+
set.plugins.every((entry) => running.get(entry.name)?.digest === entry.digest));
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Reloads the host with `scripts`, the complete set, and records the script each plugin runs now; the plugins that
|
|
243
|
+
* kept their old code (or, added, were left out).
|
|
244
|
+
*/
|
|
245
|
+
async #reload(scripts, context) {
|
|
246
|
+
const options = this.#options;
|
|
247
|
+
const entries = scripts.map((script) => entryOf(script, options.modules));
|
|
248
|
+
const report = await this.#loaded.reload(this.#host, entries, context);
|
|
249
|
+
const kept = new Set(report.failed.map(({ plugin }) => plugin));
|
|
250
|
+
const running = new Map();
|
|
251
|
+
for (const script of scripts) {
|
|
252
|
+
const runs = kept.has(script.plugin) ? this.#scripts.get(script.plugin) : script;
|
|
253
|
+
if (runs !== undefined)
|
|
254
|
+
running.set(script.plugin, runs);
|
|
255
|
+
}
|
|
256
|
+
this.#scripts.clear();
|
|
257
|
+
for (const [plugin, script] of running)
|
|
258
|
+
this.#scripts.set(plugin, script);
|
|
259
|
+
if (report.failed.length > 0)
|
|
260
|
+
options.onError({ kind: "plugins", failed: report.failed });
|
|
261
|
+
return kept;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/surfaces/client.ts"],"names":[],"mappings":"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","sourcesContent":["// A client host with its plugins (slice 11 §2, §4, decisions \"Slice 11, P4\" to \"P6\"): what a page and a terminal's\n// sandbox both run. A client host (no address) loads the plugin scripts it started with beside the app's core facets,\n// keeps its link to the server with the connection loop, and holds the kind's scripts object: a new set fetches the\n// changed scripts and reloads the host in place (a failed plugin keeps its old facet; a failed fetch is tried again),\n// a page's new stylesheets loaded before the reload and each plugin left with the one of the code it runs; a new base\n// bundle means this client's code is outdated, which the app answers by starting over (a page reloads). The surface\n// specifics (how a socket opens, how a script is fetched, what is outdated, the stylesheets) are given.\n\nimport type { TelemetryContext } from \"@earendil-works/pi-telemetry\";\nimport { BACKGROUND_CONTEXT, type Context, withAbortSignal } from \"../context/index.ts\";\nimport type { Principal } from \"../data/index.ts\";\nimport { createHost, type Host, type HostError, type PluginFacet, type PluginFailure } from \"../host/index.ts\";\nimport type { Link } from \"../link/index.ts\";\nimport { type ConnectionState, keepConnected, type LoopEnvironment, type SocketEvents } from \"./connection.ts\";\nimport type { MessagesReport } from \"./language.ts\";\nimport { LoadedFacets, type SetEntry } from \"./loaded.ts\";\nimport { type ClientModules, evaluateRegistered, type RegisteredScript } from \"./registered.ts\";\nimport type { ScriptEntry, ScriptSet, ScriptsContract } from \"./scripts.ts\";\n\n/**\n * What a client reports: its host's errors, plugins left out at a load or kept old at a reload, a failed update, a\n * plugin's stylesheet that did not load (`error`) or not within 10 s (`timeout`; this does not itself prevent the\n * plugin's new code).\n */\nexport type ClientError =\n\t| { readonly kind: \"host\"; readonly error: HostError }\n\t| { readonly kind: \"plugins\"; readonly failed: readonly PluginFailure[] }\n\t| { readonly kind: \"update_failed\"; readonly error: unknown }\n\t| {\n\t\t\treadonly kind: \"stylesheet_failed\";\n\t\t\treadonly plugin: string;\n\t\t\treadonly url: string;\n\t\t\treadonly reason: \"error\" | \"timeout\";\n\t }\n\t/** A message rendered by a fallback, a contributed message that threw, a foreign message (each once). */\n\t| { readonly kind: \"messages\"; readonly report: MessagesReport };\n\n/** What `startClient` takes. */\nexport type ClientOptions<P extends Principal> = {\n\t/** The kind's scripts object (`WebScripts`, `TuiScripts`). */\n\treadonly scripts: ScriptsContract;\n\t/** The hash of the base bundle this client runs. */\n\treadonly base: string;\n\t/** The plugin scripts it started with (the combined file's), in any order. */\n\treadonly initial: readonly RegisteredScript[];\n\t/** The modules its plugin scripts import, by specifier. */\n\treadonly modules: ClientModules;\n\t/** The app's own facets, loaded with the plugins. */\n\treadonly core: readonly PluginFacet<P>[];\n\t/** Opens one socket to the server and its link; the socket reports to `events`. */\n\treadonly open: (events: SocketEvents) => Link;\n\t/** Fetches a plugin's script of a set (at its `url`), which registers itself. */\n\treadonly fetchScript: (entry: ScriptEntry) => Promise<RegisteredScript>;\n\t/**\n\t * The server's current base bundle hash, asked before each reconnect (`undefined`: unknown, try again): another one\n\t * means this client is outdated (a new protocol comes with a new base bundle).\n\t */\n\treadonly serverBase: () => Promise<string | undefined>;\n\t/** This client's code is outdated: the app starts it over (a page reloads); the loop has stopped. */\n\treadonly outdated: () => void;\n\t/** Asked before each reconnect; `false` stops the loop (a guest's ended share). */\n\treadonly canRetry?: () => Promise<boolean>;\n\treadonly onConnection?: (state: ConnectionState) => void;\n\t/** The plugins' stylesheets (a page's; a terminal has none). */\n\treadonly styles?: ClientStyles;\n\treadonly environment: LoopEnvironment;\n\t/**\n\t * Makes the host's telemetry adapter (none: NOOP); `incarnation` names the host's run (it is read at the adapter's\n\t * first span, after the host was made).\n\t */\n\treadonly telemetry?: (incarnation: () => string) => TelemetryContext;\n\treadonly onError: (error: ClientError) => void;\n};\n\n/**\n * A page's plugin stylesheets around each update: `prepare` before the host reloads, `settle` after it (or alone when\n * no script changed).\n */\nexport type ClientStyles = {\n\t/**\n\t * Fetches, without applying them, the stylesheets of `set` that differ from those of the code each plugin runs or\n\t * did not load; resolves once each loaded, failed or waited 10 s, or when `signal` aborts (the client stops: what it\n\t * prepared is removed, `settle` never follows).\n\t */\n\tprepare(set: ScriptSet, signal: AbortSignal): Promise<void>;\n\t/**\n\t * Applies each prepared stylesheet whose plugin runs its new code now and retires the one it replaces; a plugin that\n\t * `kept` names (its new script failed: it kept its old code) keeps its old one, its prepared one dropped unapplied;\n\t * the stylesheets of plugins no longer in `set` go.\n\t */\n\tsettle(set: ScriptSet, kept: ReadonlySet<string>): void;\n};\n\n/** A running client: its host, once its plugins are loaded, and its stop. */\nexport type Client<P extends Principal> = { readonly host: Host<P>; stop(context: Context): Promise<void> };\n\n/** Starts a client: its host loaded with the initial scripts, its link kept, its plugins kept current. */\nexport async function startClient<P extends Principal>(options: ClientOptions<P>): Promise<Client<P>> {\n\tconst context = BACKGROUND_CONTEXT;\n\tlet made: Host<P> | undefined;\n\t// Read at the first span, which starts once the host exists (in its load at the earliest).\n\tconst telemetry = options.telemetry?.(() => made!.incarnation);\n\tconst host = createHost<P>({ telemetry, onError: (error) => options.onError({ kind: \"host\", error }) });\n\tmade = host;\n\tconst entries = options.initial.map((script) => entryOf(script, options.modules));\n\tconst { loaded, report } = await LoadedFacets.load(host, options.core, entries, context);\n\tif (report.failed.length > 0) options.onError({ kind: \"plugins\", failed: report.failed });\n\tconst updates = new Updates(host, loaded, new Set(report.failed.map(({ plugin }) => plugin)), options);\n\tconst loop = connect(host, options, (state) => {\n\t\tif (state === \"connected\") updates.reconnected(context);\n\t});\n\tawait updates.follow(context);\n\treturn {\n\t\thost,\n\t\tstop: async (ctx) => {\n\t\t\tloop.stop();\n\t\t\tawait updates.stop();\n\t\t\tawait host.close(ctx);\n\t\t},\n\t};\n}\n\n/**\n * Keeps `host`'s parent link to the server, asking `serverBase` and `canRetry` before every reconnect; `onState` hears\n * each state after the app's `onConnection`.\n */\nfunction connect<P extends Principal>(\n\thost: Host<P>,\n\toptions: ClientOptions<P>,\n\tonState: (state: ConnectionState) => void,\n): { stop(): void } {\n\treturn keepConnected({\n\t\topen: (events) => {\n\t\t\t// The loop and the host both follow the link's close; a link has one close listener.\n\t\t\tconst link = new SharedClose(options.open(events));\n\t\t\t// A client's parent is the server; the principal only labels the link (a client serves no remote types).\n\t\t\thost.connect(link, { principal: { kind: \"server\" } as unknown as P }, BACKGROUND_CONTEXT);\n\t\t\treturn link;\n\t\t},\n\t\tonState: (state) => {\n\t\t\toptions.onConnection?.(state);\n\t\t\tonState(state);\n\t\t},\n\t\tcanRetry: async () => {\n\t\t\tconst base = await options.serverBase();\n\t\t\tif (base !== undefined && base !== options.base) {\n\t\t\t\toptions.outdated();\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn (await options.canRetry?.()) ?? true;\n\t\t},\n\t\tenvironment: options.environment,\n\t});\n}\n\n/** A link whose close several follow (the host and the connection loop): each listener added runs once it closes. */\nclass SharedClose implements Link {\n\treadonly #link: Link;\n\treadonly #listeners: (() => void)[] = [];\n\t#closed = false;\n\n\tconstructor(link: Link) {\n\t\tthis.#link = link;\n\t\tlink.onClose(() => {\n\t\t\tthis.#closed = true;\n\t\t\tfor (const listener of this.#listeners.splice(0)) listener();\n\t\t});\n\t}\n\n\tsend(message: Uint8Array): void {\n\t\tthis.#link.send(message);\n\t}\n\n\tonMessage(listener: (message: Uint8Array) => void): void {\n\t\tthis.#link.onMessage(listener);\n\t}\n\n\tclose(): void {\n\t\tthis.#link.close();\n\t}\n\n\tonClose(listener: () => void): void {\n\t\tif (this.#closed) listener();\n\t\telse this.#listeners.push(listener);\n\t}\n}\n\n/** `script` as one plugin of a complete set: its digest, and its evaluation with `modules` when it is new. */\nfunction entryOf(script: RegisteredScript, modules: ClientModules): SetEntry {\n\treturn {\n\t\tname: script.plugin,\n\t\tdigest: script.digest,\n\t\tprepare: () => {\n\t\t\ttry {\n\t\t\t\treturn { kind: \"facet\", facet: evaluateRegistered(script, modules), digest: script.digest };\n\t\t\t} catch (error) {\n\t\t\t\treturn { kind: \"failed\", error };\n\t\t\t}\n\t\t},\n\t};\n}\n\n/** The first pause before a failed update is tried again: 1 s, doubling from there. */\nconst UPDATE_RETRY_INITIAL_MS = 1000;\n\n/** The longest pause between tries of a failed update: 30 s. */\nconst UPDATE_RETRY_MAX_MS = 30_000;\n\n/**\n * The client's plugin updates: it holds the scripts object and applies each new set in order (fetching the changed\n * scripts, loading their stylesheets, reloading the host with the complete set, settling the stylesheets); a new base\n * calls `outdated` instead. An update that failed (a script that did not load) is tried again after a growing pause (1 s\n * doubling to 30 s) until it applies or a newer set replaces it: the scripts object shows nothing new until the next\n * rollout or reconnect.\n */\nclass Updates<P extends Principal> {\n\treadonly #host: Host<P>;\n\treadonly #loaded: LoadedFacets;\n\treadonly #options: ClientOptions<P>;\n\t/**\n\t * The script each plugin runs, by plugin: a plugin whose new script failed keeps its old one here, so a later set\n\t * with that script (a reconnect's snapshot) tries it again.\n\t */\n\treadonly #scripts = new Map<string, RegisteredScript>();\n\treadonly #abort = new AbortController();\n\t#release: (() => void) | undefined;\n\t/** The newest set shown: a retry applies only it. */\n\t#latest: ScriptSet | undefined;\n\t/** The updates in order: one at a time, a retry's among them. */\n\t#applying: Promise<void> = Promise.resolve();\n\t/** The pending retry's cancel and the pause it waited (0: none waited yet). */\n\t#retry: { cancel: () => void } | undefined;\n\t#pause = 0;\n\n\tconstructor(host: Host<P>, loaded: LoadedFacets, left: ReadonlySet<string>, options: ClientOptions<P>) {\n\t\tthis.#host = host;\n\t\tthis.#loaded = loaded;\n\t\tthis.#options = options;\n\t\tfor (const script of options.initial) if (!left.has(script.plugin)) this.#scripts.set(script.plugin, script);\n\t}\n\n\t/** Holds the scripts object and applies every set it shows, the first included (a reconnect's snapshot too). */\n\tasync follow(context: Context): Promise<void> {\n\t\tconst held = this.#host.hold(this.#options.scripts, {}, context);\n\t\tthis.#release = () => held.release();\n\t\tconst watch = await held.set.watch(withAbortSignal(this.#abort.signal, context));\n\t\twatch.start(async (call, ctx) => {\n\t\t\tif (call.kind !== \"value\") return;\n\t\t\tconst set = call.value as ScriptSet;\n\t\t\tthis.#latest = set;\n\t\t\tthis.#retry?.cancel();\n\t\t\tthis.#retry = undefined;\n\t\t\tthis.#pause = 0;\n\t\t\tawait this.#queue(set, ctx);\n\t\t});\n\t}\n\n\t/**\n\t * The link is back: the newest set is applied again when this client does not run all of it (a plugin kept its old\n\t * code), since the scripts object shows an unchanged set no second time.\n\t */\n\treconnected(context: Context): void {\n\t\tconst set = this.#latest;\n\t\tif (set !== undefined && !this.#runsAll(set)) void this.#queue(set, context);\n\t}\n\n\t/** Stops following: the watch ends, the hold is released, a pending retry is dropped. */\n\tasync stop(): Promise<void> {\n\t\tthis.#abort.abort();\n\t\tthis.#retry?.cancel();\n\t\tthis.#retry = undefined;\n\t\tthis.#release?.();\n\t}\n\n\t/** Applies `set` after the updates before it, unless a newer set replaced it meanwhile. */\n\t#queue(set: ScriptSet, context: Context): Promise<void> {\n\t\tconst applied = this.#applying.then(async () => {\n\t\t\tif (this.#latest !== set || this.#abort.signal.aborted) return;\n\t\t\tif (!(await this.#apply(set, context))) this.#retryLater(set, context);\n\t\t});\n\t\tthis.#applying = applied;\n\t\treturn applied;\n\t}\n\n\t/** Tries `set` again after the next pause (1 s doubling to 30 s). */\n\t#retryLater(set: ScriptSet, context: Context): void {\n\t\tthis.#pause = this.#pause === 0 ? UPDATE_RETRY_INITIAL_MS : Math.min(this.#pause * 2, UPDATE_RETRY_MAX_MS);\n\t\tthis.#retry = {\n\t\t\tcancel: this.#options.environment.after(this.#pause, () => {\n\t\t\t\tthis.#retry = undefined;\n\t\t\t\tvoid this.#queue(set, context);\n\t\t\t}),\n\t\t};\n\t}\n\n\t/**\n\t * Applies `set`: a new base calls `outdated`; else the changed scripts fetched, their new stylesheets loaded, the\n\t * host reloaded with all and the stylesheets settled. `false` when it failed (reported `update_failed`): it is tried\n\t * again.\n\t */\n\tasync #apply(set: ScriptSet, context: Context): Promise<boolean> {\n\t\tconst options = this.#options;\n\t\tif (set.base !== options.base) {\n\t\t\toptions.outdated();\n\t\t\treturn true;\n\t\t}\n\t\t// The first frame usually shows what this client runs already: nothing to reload.\n\t\tconst changed = !this.#runsAll(set);\n\t\ttry {\n\t\t\tconst scripts: RegisteredScript[] = [];\n\t\t\tif (changed) {\n\t\t\t\tfor (const entry of set.plugins) {\n\t\t\t\t\tconst known = this.#scripts.get(entry.name);\n\t\t\t\t\tscripts.push(known?.digest === entry.digest ? known : await options.fetchScript(entry));\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait options.styles?.prepare(set, this.#abort.signal);\n\t\t\tif (this.#abort.signal.aborted) return true;\n\t\t\tconst kept = changed ? await this.#reload(scripts, context) : new Set<string>();\n\t\t\toptions.styles?.settle(set, kept);\n\t\t\treturn true;\n\t\t} catch (error) {\n\t\t\toptions.onError({ kind: \"update_failed\", error });\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/** Whether this client runs every script of `set` and nothing else. */\n\t#runsAll(set: ScriptSet): boolean {\n\t\tconst running = this.#scripts;\n\t\treturn (\n\t\t\tset.plugins.length === running.size &&\n\t\t\tset.plugins.every((entry) => running.get(entry.name)?.digest === entry.digest)\n\t\t);\n\t}\n\n\t/**\n\t * Reloads the host with `scripts`, the complete set, and records the script each plugin runs now; the plugins that\n\t * kept their old code (or, added, were left out).\n\t */\n\tasync #reload(scripts: readonly RegisteredScript[], context: Context): Promise<ReadonlySet<string>> {\n\t\tconst options = this.#options;\n\t\tconst entries = scripts.map((script) => entryOf(script, options.modules));\n\t\tconst report = await this.#loaded.reload(this.#host, entries, context);\n\t\tconst kept = new Set(report.failed.map(({ plugin }) => plugin));\n\t\tconst running = new Map<string, RegisteredScript>();\n\t\tfor (const script of scripts) {\n\t\t\tconst runs = kept.has(script.plugin) ? this.#scripts.get(script.plugin) : script;\n\t\t\tif (runs !== undefined) running.set(script.plugin, runs);\n\t\t}\n\t\tthis.#scripts.clear();\n\t\tfor (const [plugin, script] of running) this.#scripts.set(plugin, script);\n\t\tif (report.failed.length > 0) options.onError({ kind: \"plugins\", failed: report.failed });\n\t\treturn kept;\n\t}\n}\n"]}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/** The first retry pause after a failed or short-lived connection: 250 ms, doubling from there. */
|
|
2
|
+
export declare const RETRY_INITIAL_MS = 250;
|
|
3
|
+
/** The longest retry pause: 5 s (and the pause while offline). */
|
|
4
|
+
export declare const RETRY_MAX_MS = 5000;
|
|
5
|
+
/** A connection that stayed open this long counted as working: the next retry starts at the initial pause again. */
|
|
6
|
+
export declare const STABLE_MS = 10000;
|
|
7
|
+
/** A socket not open after this long is given up (browsers have no handshake timeout). */
|
|
8
|
+
export declare const CONNECT_TIMEOUT_MS = 20000;
|
|
9
|
+
/** The server's heartbeat pings every 15 s: an open socket silent for longer than this is presumed dead on a wake. */
|
|
10
|
+
export declare const STALE_MS = 25000;
|
|
11
|
+
/** After a wake, messages held while the client was frozen get this long to arrive before the socket is judged. */
|
|
12
|
+
export declare const WAKE_GRACE_MS = 1000;
|
|
13
|
+
/** The connection as the app shows it: an attempt under way, open, or waiting for the next attempt. */
|
|
14
|
+
export type ConnectionState = "connecting" | "connected" | "waiting";
|
|
15
|
+
/** What one socket reports to the loop. */
|
|
16
|
+
export interface SocketEvents {
|
|
17
|
+
opened(): void;
|
|
18
|
+
/** Any frame: the server's pings keep an open socket from looking silent. */
|
|
19
|
+
received(): void;
|
|
20
|
+
}
|
|
21
|
+
/** One attempt's connection as the loop sees it: it closes once, and closing it ends it at once. */
|
|
22
|
+
export interface LoopLink {
|
|
23
|
+
onClose(listener: () => void): void;
|
|
24
|
+
close(): void;
|
|
25
|
+
}
|
|
26
|
+
/** What the loop runs in: the clock, timers, whether the device is online, and its wake events. */
|
|
27
|
+
export interface LoopEnvironment {
|
|
28
|
+
now(): number;
|
|
29
|
+
/** Runs `callback` after `ms`; returns its cancel. */
|
|
30
|
+
after(ms: number, callback: () => void): () => void;
|
|
31
|
+
/** `false` when the device is known to be offline. */
|
|
32
|
+
online(): boolean;
|
|
33
|
+
/** Calls `listener` when the client may have been away (visible again, online, network changed); returns its removal. */
|
|
34
|
+
onWake(listener: () => void): () => void;
|
|
35
|
+
}
|
|
36
|
+
/** What the loop takes. */
|
|
37
|
+
export type LoopOptions = {
|
|
38
|
+
/** Opens one socket and its link; the socket reports to `events`. */
|
|
39
|
+
readonly open: (events: SocketEvents) => LoopLink;
|
|
40
|
+
readonly onState: (state: ConnectionState) => void;
|
|
41
|
+
/** Asked after every close; `false` stops the loop. A rejection counts as `true` (unreachable, try again). */
|
|
42
|
+
readonly canRetry: () => Promise<boolean>;
|
|
43
|
+
readonly environment: LoopEnvironment;
|
|
44
|
+
};
|
|
45
|
+
/** Keeps a client connected until `stop`. */
|
|
46
|
+
export declare function keepConnected(options: LoopOptions): {
|
|
47
|
+
stop(): void;
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=connection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/surfaces/connection.ts"],"names":[],"mappings":"AAOA,mGAAmG;AACnG,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAEpC,kEAAkE;AAClE,eAAO,MAAM,YAAY,OAAO,CAAC;AAEjC,oHAAoH;AACpH,eAAO,MAAM,SAAS,QAAS,CAAC;AAEhC,0FAA0F;AAC1F,eAAO,MAAM,kBAAkB,QAAS,CAAC;AAEzC,sHAAsH;AACtH,eAAO,MAAM,QAAQ,QAAS,CAAC;AAE/B,mHAAmH;AACnH,eAAO,MAAM,aAAa,OAAO,CAAC;AAElC,uGAAuG;AACvG,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,WAAW,GAAG,SAAS,CAAC;AAErE,2CAA2C;AAC3C,MAAM,WAAW,YAAY;IAC5B,MAAM,IAAI,IAAI,CAAC;IACf,6EAA6E;IAC7E,QAAQ,IAAI,IAAI,CAAC;CACjB;AAED,oGAAoG;AACpG,MAAM,WAAW,QAAQ;IACxB,OAAO,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IACpC,KAAK,IAAI,IAAI,CAAC;CACd;AAED,mGAAmG;AACnG,MAAM,WAAW,eAAe;IAC/B,GAAG,IAAI,MAAM,CAAC;IACd,sDAAsD;IACtD,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;IACpD,sDAAsD;IACtD,MAAM,IAAI,OAAO,CAAC;IAClB,yHAAyH;IACzH,MAAM,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;CACzC;AAED,2BAA2B;AAC3B,MAAM,MAAM,WAAW,GAAG;IACzB,qEAAqE;IACrE,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,QAAQ,CAAC;IAClD,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IACnD,8GAA8G;IAC9G,QAAQ,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1C,QAAQ,CAAC,WAAW,EAAE,eAAe,CAAC;CACtC,CAAC;AAEF,6CAA6C;AAC7C,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG;IAAE,IAAI,IAAI,IAAI,CAAA;CAAE,CAIpE"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
// The connection loop (slice 11 §2, decision "Slice 11, P6"; p2's `keepConnected`): a client keeps one link to the
|
|
2
|
+
// server and replaces it when it ends. After a drop it reconnects after a growing pause (250 ms doubling to 5 s; a
|
|
3
|
+
// connection that stayed open 10 s resets it), at once on a wake (visible again, back online, network changed); it
|
|
4
|
+
// replaces an open socket silent past the server's ping interval on a wake, gives up a socket not open after 20 s, and
|
|
5
|
+
// stops when the app's `canRetry` says no (an outdated client, a guest's ended share). The environment (time, timers,
|
|
6
|
+
// wakes) is given, so the same loop runs in a page and in a terminal's sandbox.
|
|
7
|
+
/** The first retry pause after a failed or short-lived connection: 250 ms, doubling from there. */
|
|
8
|
+
export const RETRY_INITIAL_MS = 250;
|
|
9
|
+
/** The longest retry pause: 5 s (and the pause while offline). */
|
|
10
|
+
export const RETRY_MAX_MS = 5000;
|
|
11
|
+
/** A connection that stayed open this long counted as working: the next retry starts at the initial pause again. */
|
|
12
|
+
export const STABLE_MS = 10_000;
|
|
13
|
+
/** A socket not open after this long is given up (browsers have no handshake timeout). */
|
|
14
|
+
export const CONNECT_TIMEOUT_MS = 20_000;
|
|
15
|
+
/** The server's heartbeat pings every 15 s: an open socket silent for longer than this is presumed dead on a wake. */
|
|
16
|
+
export const STALE_MS = 25_000;
|
|
17
|
+
/** After a wake, messages held while the client was frozen get this long to arrive before the socket is judged. */
|
|
18
|
+
export const WAKE_GRACE_MS = 1000;
|
|
19
|
+
/** Keeps a client connected until `stop`. */
|
|
20
|
+
export function keepConnected(options) {
|
|
21
|
+
const loop = new Loop(options);
|
|
22
|
+
loop.connect();
|
|
23
|
+
return { stop: () => loop.stop() };
|
|
24
|
+
}
|
|
25
|
+
class Loop {
|
|
26
|
+
#options;
|
|
27
|
+
#env;
|
|
28
|
+
#removeWake;
|
|
29
|
+
#failures = 0;
|
|
30
|
+
#current;
|
|
31
|
+
#cancelRetry;
|
|
32
|
+
#cancelStaleCheck;
|
|
33
|
+
/** Between a close and `canRetry`'s answer; a wake meanwhile retries at once. */
|
|
34
|
+
#deciding = false;
|
|
35
|
+
#wokeWhileDeciding = false;
|
|
36
|
+
#stopped = false;
|
|
37
|
+
constructor(options) {
|
|
38
|
+
this.#options = options;
|
|
39
|
+
this.#env = options.environment;
|
|
40
|
+
this.#removeWake = this.#env.onWake(() => this.#wake());
|
|
41
|
+
}
|
|
42
|
+
/** Starts an attempt. */
|
|
43
|
+
connect() {
|
|
44
|
+
this.#cancelRetry = undefined;
|
|
45
|
+
const env = this.#env;
|
|
46
|
+
const attempt = {
|
|
47
|
+
link: undefined,
|
|
48
|
+
startedAt: env.now(),
|
|
49
|
+
openedAt: undefined,
|
|
50
|
+
lastFrame: env.now(),
|
|
51
|
+
cancelTimeout: () => { },
|
|
52
|
+
};
|
|
53
|
+
this.#current = attempt;
|
|
54
|
+
this.#options.onState("connecting");
|
|
55
|
+
const link = this.#options.open({
|
|
56
|
+
opened: () => {
|
|
57
|
+
if (this.#current !== attempt)
|
|
58
|
+
return;
|
|
59
|
+
attempt.openedAt = attempt.lastFrame = env.now();
|
|
60
|
+
attempt.cancelTimeout();
|
|
61
|
+
this.#options.onState("connected");
|
|
62
|
+
},
|
|
63
|
+
received: () => {
|
|
64
|
+
attempt.lastFrame = env.now();
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
attempt.link = link;
|
|
68
|
+
attempt.cancelTimeout = env.after(CONNECT_TIMEOUT_MS, () => {
|
|
69
|
+
if (attempt.openedAt === undefined)
|
|
70
|
+
link.close();
|
|
71
|
+
});
|
|
72
|
+
link.onClose(() => this.#closed(attempt));
|
|
73
|
+
}
|
|
74
|
+
/** Stops the loop and closes the current link. */
|
|
75
|
+
stop() {
|
|
76
|
+
if (this.#stopped)
|
|
77
|
+
return;
|
|
78
|
+
this.#stopped = true;
|
|
79
|
+
this.#removeWake();
|
|
80
|
+
this.#cancelRetry?.();
|
|
81
|
+
this.#cancelRetry = undefined;
|
|
82
|
+
this.#current?.link?.close();
|
|
83
|
+
}
|
|
84
|
+
/** `attempt`'s link closed: asks `canRetry`, then schedules the next attempt. */
|
|
85
|
+
#closed(attempt) {
|
|
86
|
+
if (this.#current !== attempt)
|
|
87
|
+
return;
|
|
88
|
+
this.#current = undefined;
|
|
89
|
+
attempt.cancelTimeout();
|
|
90
|
+
this.#cancelStaleCheck?.();
|
|
91
|
+
this.#cancelStaleCheck = undefined;
|
|
92
|
+
if (this.#stopped)
|
|
93
|
+
return;
|
|
94
|
+
this.#options.onState("waiting");
|
|
95
|
+
const { openedAt } = attempt;
|
|
96
|
+
if (openedAt !== undefined && this.#env.now() - openedAt >= STABLE_MS)
|
|
97
|
+
this.#failures = 0;
|
|
98
|
+
this.#deciding = true;
|
|
99
|
+
this.#wokeWhileDeciding = false;
|
|
100
|
+
const decided = (retry) => {
|
|
101
|
+
this.#deciding = false;
|
|
102
|
+
if (retry)
|
|
103
|
+
this.#schedule(this.#wokeWhileDeciding);
|
|
104
|
+
};
|
|
105
|
+
this.#options.canRetry().then(decided, () => decided(true));
|
|
106
|
+
}
|
|
107
|
+
/** Schedules the next attempt: at once (`now`), else after the backoff (offline: the longest pause). */
|
|
108
|
+
#schedule(now) {
|
|
109
|
+
if (this.#stopped)
|
|
110
|
+
return;
|
|
111
|
+
const backoff = Math.min(RETRY_MAX_MS, RETRY_INITIAL_MS * 2 ** this.#failures);
|
|
112
|
+
this.#failures += 1;
|
|
113
|
+
// Offline an attempt fails at once; the `online` wake retries sooner than this.
|
|
114
|
+
const delay = now ? 0 : this.#env.online() ? backoff : RETRY_MAX_MS;
|
|
115
|
+
this.#cancelRetry = this.#env.after(delay, () => this.connect());
|
|
116
|
+
}
|
|
117
|
+
/** A wake: a pending retry runs now; an open socket silent too long is replaced once its overdue ping is checked. */
|
|
118
|
+
#wake() {
|
|
119
|
+
if (this.#cancelRetry !== undefined) {
|
|
120
|
+
this.#cancelRetry();
|
|
121
|
+
this.connect();
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
if (this.#deciding) {
|
|
125
|
+
this.#wokeWhileDeciding = true;
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
const attempt = this.#current;
|
|
129
|
+
// A connecting attempt has its own timeout.
|
|
130
|
+
if (attempt?.openedAt === undefined)
|
|
131
|
+
return;
|
|
132
|
+
this.#cancelStaleCheck?.();
|
|
133
|
+
// After a network change the socket looks fine until the server's next ping is missing: check when it is due.
|
|
134
|
+
const due = Math.max(WAKE_GRACE_MS, attempt.lastFrame + STALE_MS + 1 - this.#env.now());
|
|
135
|
+
this.#cancelStaleCheck = this.#env.after(due, () => {
|
|
136
|
+
this.#cancelStaleCheck = undefined;
|
|
137
|
+
if (this.#current === attempt && this.#env.now() - attempt.lastFrame > STALE_MS)
|
|
138
|
+
attempt.link?.close();
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=connection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/surfaces/connection.ts"],"names":[],"mappings":"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","sourcesContent":["// The connection loop (slice 11 §2, decision \"Slice 11, P6\"; p2's `keepConnected`): a client keeps one link to the\n// server and replaces it when it ends. After a drop it reconnects after a growing pause (250 ms doubling to 5 s; a\n// connection that stayed open 10 s resets it), at once on a wake (visible again, back online, network changed); it\n// replaces an open socket silent past the server's ping interval on a wake, gives up a socket not open after 20 s, and\n// stops when the app's `canRetry` says no (an outdated client, a guest's ended share). The environment (time, timers,\n// wakes) is given, so the same loop runs in a page and in a terminal's sandbox.\n\n/** The first retry pause after a failed or short-lived connection: 250 ms, doubling from there. */\nexport const RETRY_INITIAL_MS = 250;\n\n/** The longest retry pause: 5 s (and the pause while offline). */\nexport const RETRY_MAX_MS = 5000;\n\n/** A connection that stayed open this long counted as working: the next retry starts at the initial pause again. */\nexport const STABLE_MS = 10_000;\n\n/** A socket not open after this long is given up (browsers have no handshake timeout). */\nexport const CONNECT_TIMEOUT_MS = 20_000;\n\n/** The server's heartbeat pings every 15 s: an open socket silent for longer than this is presumed dead on a wake. */\nexport const STALE_MS = 25_000;\n\n/** After a wake, messages held while the client was frozen get this long to arrive before the socket is judged. */\nexport const WAKE_GRACE_MS = 1000;\n\n/** The connection as the app shows it: an attempt under way, open, or waiting for the next attempt. */\nexport type ConnectionState = \"connecting\" | \"connected\" | \"waiting\";\n\n/** What one socket reports to the loop. */\nexport interface SocketEvents {\n\topened(): void;\n\t/** Any frame: the server's pings keep an open socket from looking silent. */\n\treceived(): void;\n}\n\n/** One attempt's connection as the loop sees it: it closes once, and closing it ends it at once. */\nexport interface LoopLink {\n\tonClose(listener: () => void): void;\n\tclose(): void;\n}\n\n/** What the loop runs in: the clock, timers, whether the device is online, and its wake events. */\nexport interface LoopEnvironment {\n\tnow(): number;\n\t/** Runs `callback` after `ms`; returns its cancel. */\n\tafter(ms: number, callback: () => void): () => void;\n\t/** `false` when the device is known to be offline. */\n\tonline(): boolean;\n\t/** Calls `listener` when the client may have been away (visible again, online, network changed); returns its removal. */\n\tonWake(listener: () => void): () => void;\n}\n\n/** What the loop takes. */\nexport type LoopOptions = {\n\t/** Opens one socket and its link; the socket reports to `events`. */\n\treadonly open: (events: SocketEvents) => LoopLink;\n\treadonly onState: (state: ConnectionState) => void;\n\t/** Asked after every close; `false` stops the loop. A rejection counts as `true` (unreachable, try again). */\n\treadonly canRetry: () => Promise<boolean>;\n\treadonly environment: LoopEnvironment;\n};\n\n/** Keeps a client connected until `stop`. */\nexport function keepConnected(options: LoopOptions): { stop(): void } {\n\tconst loop = new Loop(options);\n\tloop.connect();\n\treturn { stop: () => loop.stop() };\n}\n\n/** One attempt: its link, when it started and opened, its last frame, its timeout's cancel. */\ntype Attempt = {\n\tlink: LoopLink | undefined;\n\treadonly startedAt: number;\n\topenedAt: number | undefined;\n\tlastFrame: number;\n\tcancelTimeout: () => void;\n};\n\nclass Loop {\n\treadonly #options: LoopOptions;\n\treadonly #env: LoopEnvironment;\n\treadonly #removeWake: () => void;\n\t#failures = 0;\n\t#current: Attempt | undefined;\n\t#cancelRetry: (() => void) | undefined;\n\t#cancelStaleCheck: (() => void) | undefined;\n\t/** Between a close and `canRetry`'s answer; a wake meanwhile retries at once. */\n\t#deciding = false;\n\t#wokeWhileDeciding = false;\n\t#stopped = false;\n\n\tconstructor(options: LoopOptions) {\n\t\tthis.#options = options;\n\t\tthis.#env = options.environment;\n\t\tthis.#removeWake = this.#env.onWake(() => this.#wake());\n\t}\n\n\t/** Starts an attempt. */\n\tconnect(): void {\n\t\tthis.#cancelRetry = undefined;\n\t\tconst env = this.#env;\n\t\tconst attempt: Attempt = {\n\t\t\tlink: undefined,\n\t\t\tstartedAt: env.now(),\n\t\t\topenedAt: undefined,\n\t\t\tlastFrame: env.now(),\n\t\t\tcancelTimeout: () => {},\n\t\t};\n\t\tthis.#current = attempt;\n\t\tthis.#options.onState(\"connecting\");\n\t\tconst link = this.#options.open({\n\t\t\topened: () => {\n\t\t\t\tif (this.#current !== attempt) return;\n\t\t\t\tattempt.openedAt = attempt.lastFrame = env.now();\n\t\t\t\tattempt.cancelTimeout();\n\t\t\t\tthis.#options.onState(\"connected\");\n\t\t\t},\n\t\t\treceived: () => {\n\t\t\t\tattempt.lastFrame = env.now();\n\t\t\t},\n\t\t});\n\t\tattempt.link = link;\n\t\tattempt.cancelTimeout = env.after(CONNECT_TIMEOUT_MS, () => {\n\t\t\tif (attempt.openedAt === undefined) link.close();\n\t\t});\n\t\tlink.onClose(() => this.#closed(attempt));\n\t}\n\n\t/** Stops the loop and closes the current link. */\n\tstop(): void {\n\t\tif (this.#stopped) return;\n\t\tthis.#stopped = true;\n\t\tthis.#removeWake();\n\t\tthis.#cancelRetry?.();\n\t\tthis.#cancelRetry = undefined;\n\t\tthis.#current?.link?.close();\n\t}\n\n\t/** `attempt`'s link closed: asks `canRetry`, then schedules the next attempt. */\n\t#closed(attempt: Attempt): void {\n\t\tif (this.#current !== attempt) return;\n\t\tthis.#current = undefined;\n\t\tattempt.cancelTimeout();\n\t\tthis.#cancelStaleCheck?.();\n\t\tthis.#cancelStaleCheck = undefined;\n\t\tif (this.#stopped) return;\n\t\tthis.#options.onState(\"waiting\");\n\t\tconst { openedAt } = attempt;\n\t\tif (openedAt !== undefined && this.#env.now() - openedAt >= STABLE_MS) this.#failures = 0;\n\t\tthis.#deciding = true;\n\t\tthis.#wokeWhileDeciding = false;\n\t\tconst decided = (retry: boolean): void => {\n\t\t\tthis.#deciding = false;\n\t\t\tif (retry) this.#schedule(this.#wokeWhileDeciding);\n\t\t};\n\t\tthis.#options.canRetry().then(decided, () => decided(true));\n\t}\n\n\t/** Schedules the next attempt: at once (`now`), else after the backoff (offline: the longest pause). */\n\t#schedule(now: boolean): void {\n\t\tif (this.#stopped) return;\n\t\tconst backoff = Math.min(RETRY_MAX_MS, RETRY_INITIAL_MS * 2 ** this.#failures);\n\t\tthis.#failures += 1;\n\t\t// Offline an attempt fails at once; the `online` wake retries sooner than this.\n\t\tconst delay = now ? 0 : this.#env.online() ? backoff : RETRY_MAX_MS;\n\t\tthis.#cancelRetry = this.#env.after(delay, () => this.connect());\n\t}\n\n\t/** A wake: a pending retry runs now; an open socket silent too long is replaced once its overdue ping is checked. */\n\t#wake(): void {\n\t\tif (this.#cancelRetry !== undefined) {\n\t\t\tthis.#cancelRetry();\n\t\t\tthis.connect();\n\t\t\treturn;\n\t\t}\n\t\tif (this.#deciding) {\n\t\t\tthis.#wokeWhileDeciding = true;\n\t\t\treturn;\n\t\t}\n\t\tconst attempt = this.#current;\n\t\t// A connecting attempt has its own timeout.\n\t\tif (attempt?.openedAt === undefined) return;\n\t\tthis.#cancelStaleCheck?.();\n\t\t// After a network change the socket looks fine until the server's next ping is missing: check when it is due.\n\t\tconst due = Math.max(WAKE_GRACE_MS, attempt.lastFrame + STALE_MS + 1 - this.#env.now());\n\t\tthis.#cancelStaleCheck = this.#env.after(due, () => {\n\t\t\tthis.#cancelStaleCheck = undefined;\n\t\t\tif (this.#current === attempt && this.#env.now() - attempt.lastFrame > STALE_MS) attempt.link?.close();\n\t\t});\n\t}\n}\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** A time (a `Date`, milliseconds, or an ISO string as messages carry it) in the current locale; `14:05` by default. */
|
|
2
|
+
export declare function formatTime(at: Date | number | string, options?: Intl.DateTimeFormatOptions): string;
|
|
3
|
+
/** A number in the current locale (`1.234,5` in German). */
|
|
4
|
+
export declare function formatNumber(value: number, options?: Intl.NumberFormatOptions): string;
|
|
5
|
+
//# sourceMappingURL=format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/surfaces/format.ts"],"names":[],"mappings":"AAMA,wHAAwH;AACxH,wBAAgB,UAAU,CAAC,EAAE,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,qBAAqB,GAAG,MAAM,CAOnG;AAED,4DAA4D;AAC5D,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,mBAAmB,GAAG,MAAM,CAOtF"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// Dates, times and numbers in the viewer's locale (decision "Messages and languages in the app kit" (1)): `Intl` with
|
|
2
|
+
// the current language's locale, so a message function's `formatTime(at)` follows the language it renders in. Outside a
|
|
3
|
+
// render the platform's default locale applies. A language's default formatters are made once, kept as long as it is.
|
|
4
|
+
import { currentLanguage } from "./language.js";
|
|
5
|
+
/** A time (a `Date`, milliseconds, or an ISO string as messages carry it) in the current locale; `14:05` by default. */
|
|
6
|
+
export function formatTime(at, options) {
|
|
7
|
+
const language = currentLanguage();
|
|
8
|
+
const format = options === undefined && language !== undefined
|
|
9
|
+
? formattersOf(language).time
|
|
10
|
+
: new Intl.DateTimeFormat(language?.locale, options ?? TIME);
|
|
11
|
+
return format.format(new Date(at));
|
|
12
|
+
}
|
|
13
|
+
/** A number in the current locale (`1.234,5` in German). */
|
|
14
|
+
export function formatNumber(value, options) {
|
|
15
|
+
const language = currentLanguage();
|
|
16
|
+
const format = options === undefined && language !== undefined
|
|
17
|
+
? formattersOf(language).number
|
|
18
|
+
: new Intl.NumberFormat(language?.locale, options);
|
|
19
|
+
return format.format(value);
|
|
20
|
+
}
|
|
21
|
+
/** `formatTime`'s default: hours and minutes. */
|
|
22
|
+
const TIME = { timeStyle: "short" };
|
|
23
|
+
/** The default formatters of each language, made at its first use: a formatter costs far more than a format. */
|
|
24
|
+
const FORMATTERS = new WeakMap();
|
|
25
|
+
/** `language`'s default formatters. */
|
|
26
|
+
function formattersOf(language) {
|
|
27
|
+
let formatters = FORMATTERS.get(language);
|
|
28
|
+
if (formatters === undefined) {
|
|
29
|
+
formatters = {
|
|
30
|
+
time: new Intl.DateTimeFormat(language.locale, TIME),
|
|
31
|
+
number: new Intl.NumberFormat(language.locale),
|
|
32
|
+
};
|
|
33
|
+
FORMATTERS.set(language, formatters);
|
|
34
|
+
}
|
|
35
|
+
return formatters;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/surfaces/format.ts"],"names":[],"mappings":"AAAA,sHAAsH;AACtH,wHAAwH;AACxH,sHAAsH;AAEtH,OAAO,EAAE,eAAe,EAAiB,MAAM,eAAe,CAAC;AAE/D,wHAAwH;AACxH,MAAM,UAAU,UAAU,CAAC,EAA0B,EAAE,OAAoC;IAC1F,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IACnC,MAAM,MAAM,GACX,OAAO,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS;QAC9C,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,IAAI;QAC7B,CAAC,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,IAAI,IAAI,CAAC,CAAC;IAC/D,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,OAAkC;IAC7E,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IACnC,MAAM,MAAM,GACX,OAAO,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS;QAC9C,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,MAAM;QAC/B,CAAC,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACrD,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED,iDAAiD;AACjD,MAAM,IAAI,GAA+B,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;AAKhE,gHAAgH;AAChH,MAAM,UAAU,GAAG,IAAI,OAAO,EAAwB,CAAC;AAEvD,uCAAuC;AACvC,SAAS,YAAY,CAAC,QAAkB;IACvC,IAAI,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC1C,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC9B,UAAU,GAAG;YACZ,IAAI,EAAE,IAAI,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC;YACpD,MAAM,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC;SAC9C,CAAC;QACF,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,UAAU,CAAC;AACnB,CAAC","sourcesContent":["// Dates, times and numbers in the viewer's locale (decision \"Messages and languages in the app kit\" (1)): `Intl` with\n// the current language's locale, so a message function's `formatTime(at)` follows the language it renders in. Outside a\n// render the platform's default locale applies. A language's default formatters are made once, kept as long as it is.\n\nimport { currentLanguage, type Language } from \"./language.ts\";\n\n/** A time (a `Date`, milliseconds, or an ISO string as messages carry it) in the current locale; `14:05` by default. */\nexport function formatTime(at: Date | number | string, options?: Intl.DateTimeFormatOptions): string {\n\tconst language = currentLanguage();\n\tconst format =\n\t\toptions === undefined && language !== undefined\n\t\t\t? formattersOf(language).time\n\t\t\t: new Intl.DateTimeFormat(language?.locale, options ?? TIME);\n\treturn format.format(new Date(at));\n}\n\n/** A number in the current locale (`1.234,5` in German). */\nexport function formatNumber(value: number, options?: Intl.NumberFormatOptions): string {\n\tconst language = currentLanguage();\n\tconst format =\n\t\toptions === undefined && language !== undefined\n\t\t\t? formattersOf(language).number\n\t\t\t: new Intl.NumberFormat(language?.locale, options);\n\treturn format.format(value);\n}\n\n/** `formatTime`'s default: hours and minutes. */\nconst TIME: Intl.DateTimeFormatOptions = { timeStyle: \"short\" };\n\n/** A language's default formatters. */\ntype Formatters = { readonly time: Intl.DateTimeFormat; readonly number: Intl.NumberFormat };\n\n/** The default formatters of each language, made at its first use: a formatter costs far more than a format. */\nconst FORMATTERS = new WeakMap<Language, Formatters>();\n\n/** `language`'s default formatters. */\nfunction formattersOf(language: Language): Formatters {\n\tlet formatters = FORMATTERS.get(language);\n\tif (formatters === undefined) {\n\t\tformatters = {\n\t\t\ttime: new Intl.DateTimeFormat(language.locale, TIME),\n\t\t\tnumber: new Intl.NumberFormat(language.locale),\n\t\t};\n\t\tFORMATTERS.set(language, formatters);\n\t}\n\treturn formatters;\n}\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export { followActiveLanguage, hostLanguage, type LanguageFollower } from "./active-language.ts";
|
|
2
|
+
export { followActiveTheme, type ThemeFollower } from "./active-theme.ts";
|
|
3
|
+
export { type Client, type ClientError, type ClientOptions, type ClientStyles, startClient, } from "./client.ts";
|
|
4
|
+
export { type ConnectionState, keepConnected, type LoopEnvironment, type LoopLink, type LoopOptions, type SocketEvents, } from "./connection.ts";
|
|
5
|
+
export { formatNumber, formatTime } from "./format.ts";
|
|
6
|
+
export { createLanguage, type Language, type MessagesReport } from "./language.ts";
|
|
7
|
+
export { LoadedFacets, type Prepared, type SetEntry } from "./loaded.ts";
|
|
8
|
+
export { LocaleChoice, localeChoiceFacet } from "./locale-choice.ts";
|
|
9
|
+
export { type Catalog, type CatalogShape, type DataKeys, defineMessages, type MessageArgs, type MessageData, type MessageParam, MessageSchema, type Messages, type MessagesOf, type MessageValue, type Translator, } from "./messages.ts";
|
|
10
|
+
export { type ClientModules, evaluateRegistered, type FacetFunction, REGISTER, type RegisteredScript, registeredSource, } from "./registered.ts";
|
|
11
|
+
export { type ScriptEntry, ScriptSet, type ScriptsContract, TuiScripts, WebScripts } from "./scripts.ts";
|
|
12
|
+
export { ThemeChoice, themeChoiceFacet } from "./theme-choice.ts";
|
|
13
|
+
export { activeTheme, BASE_ROLES, type BaseRole, type ColorDepth, FALLBACK_THEMES, type Theme, type ThemePick, Themes, terminalColor, themesFacet, themeVariables, } from "./themes.ts";
|
|
14
|
+
export { type Translation, type TranslationIndex, Translations, translationsFacet, } from "./translations.ts";
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/surfaces/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACjG,OAAO,EAAE,iBAAiB,EAAE,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EACN,KAAK,MAAM,EACX,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,WAAW,GACX,MAAM,aAAa,CAAC;AACrB,OAAO,EACN,KAAK,eAAe,EACpB,aAAa,EACb,KAAK,eAAe,EACpB,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,KAAK,YAAY,GACjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,KAAK,QAAQ,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AACnF,OAAO,EAAE,YAAY,EAAE,KAAK,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EACN,KAAK,OAAO,EACZ,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,cAAc,EACd,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,aAAa,EACb,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,UAAU,GACf,MAAM,eAAe,CAAC;AACvB,OAAO,EACN,KAAK,aAAa,EAClB,kBAAkB,EAClB,KAAK,aAAa,EAClB,QAAQ,EACR,KAAK,gBAAgB,EACrB,gBAAgB,GAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,KAAK,WAAW,EAAE,SAAS,EAAE,KAAK,eAAe,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACzG,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EACN,WAAW,EACX,UAAU,EACV,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,eAAe,EACf,KAAK,KAAK,EACV,KAAK,SAAS,EACd,MAAM,EACN,aAAa,EACb,WAAW,EACX,cAAc,GACd,MAAM,aAAa,CAAC;AACrB,OAAO,EACN,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,YAAY,EACZ,iBAAiB,GACjB,MAAM,mBAAmB,CAAC"}
|