@earendil-works/chord 1.3.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +54 -0
- package/README.md +129 -10
- package/dist/cell.d.ts +7 -7
- package/dist/cell.d.ts.map +1 -1
- package/dist/cell.js.map +1 -1
- package/dist/context/index.d.ts +8 -0
- package/dist/context/index.d.ts.map +1 -1
- package/dist/context/index.js +15 -0
- package/dist/context/index.js.map +1 -1
- package/dist/contract.d.ts +51 -52
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js +19 -24
- package/dist/contract.js.map +1 -1
- package/dist/delta/apply-immutable-trusted.js +3 -4
- package/dist/delta/apply-immutable-trusted.js.map +1 -1
- package/dist/delta/diff.d.ts.map +1 -1
- package/dist/delta/diff.js +5 -3
- package/dist/delta/diff.js.map +1 -1
- package/dist/delta/index.d.ts +9 -1
- package/dist/delta/index.d.ts.map +1 -1
- package/dist/delta/index.js +15 -11
- package/dist/delta/index.js.map +1 -1
- package/dist/delta/pending.d.ts +36 -0
- package/dist/delta/pending.d.ts.map +1 -0
- package/dist/delta/pending.js +143 -0
- package/dist/delta/pending.js.map +1 -0
- package/dist/delta/tracker.d.ts +12 -0
- package/dist/delta/tracker.d.ts.map +1 -1
- package/dist/delta/tracker.js +109 -39
- package/dist/delta/tracker.js.map +1 -1
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +9 -7
- package/dist/host.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/next/contracts/accepts.d.ts +81 -0
- package/dist/next/contracts/accepts.d.ts.map +1 -0
- package/dist/next/contracts/accepts.js +123 -0
- package/dist/next/contracts/accepts.js.map +1 -0
- package/dist/next/contracts/contract.d.ts +121 -0
- package/dist/next/contracts/contract.d.ts.map +1 -0
- package/dist/next/contracts/contract.js +50 -0
- package/dist/next/contracts/contract.js.map +1 -0
- package/dist/next/contracts/declare.d.ts +107 -0
- package/dist/next/contracts/declare.d.ts.map +1 -0
- package/dist/next/contracts/declare.js +136 -0
- package/dist/next/contracts/declare.js.map +1 -0
- package/dist/next/contracts/evolve.d.ts +92 -0
- package/dist/next/contracts/evolve.d.ts.map +1 -0
- package/dist/next/contracts/evolve.js +179 -0
- package/dist/next/contracts/evolve.js.map +1 -0
- package/dist/next/contracts/fingerprint.d.ts +16 -0
- package/dist/next/contracts/fingerprint.d.ts.map +1 -0
- package/dist/next/contracts/fingerprint.js +50 -0
- package/dist/next/contracts/fingerprint.js.map +1 -0
- package/dist/next/contracts/history.d.ts +71 -0
- package/dist/next/contracts/history.d.ts.map +1 -0
- package/dist/next/contracts/history.js +3 -0
- package/dist/next/contracts/history.js.map +1 -0
- package/dist/next/contracts/host-kind.d.ts +40 -0
- package/dist/next/contracts/host-kind.d.ts.map +1 -0
- package/dist/next/contracts/host-kind.js +37 -0
- package/dist/next/contracts/host-kind.js.map +1 -0
- package/dist/next/contracts/index.d.ts +7 -0
- package/dist/next/contracts/index.d.ts.map +1 -0
- package/dist/next/contracts/index.js +6 -0
- package/dist/next/contracts/index.js.map +1 -0
- package/dist/next/contracts/internal.d.ts +10 -0
- package/dist/next/contracts/internal.d.ts.map +1 -0
- package/dist/next/contracts/internal.js +9 -0
- package/dist/next/contracts/internal.js.map +1 -0
- package/dist/next/contracts/names.d.ts +3 -0
- package/dist/next/contracts/names.d.ts.map +1 -0
- package/dist/next/contracts/names.js +13 -0
- package/dist/next/contracts/names.js.map +1 -0
- package/dist/next/contracts/params.d.ts +28 -0
- package/dist/next/contracts/params.d.ts.map +1 -0
- package/dist/next/contracts/params.js +50 -0
- package/dist/next/contracts/params.js.map +1 -0
- package/dist/next/contracts/schema.d.ts +102 -0
- package/dist/next/contracts/schema.d.ts.map +1 -0
- package/dist/next/contracts/schema.js +103 -0
- package/dist/next/contracts/schema.js.map +1 -0
- package/dist/next/contracts/snapshot.d.ts +16 -0
- package/dist/next/contracts/snapshot.d.ts.map +1 -0
- package/dist/next/contracts/snapshot.js +167 -0
- package/dist/next/contracts/snapshot.js.map +1 -0
- package/dist/next/data/args.d.ts +50 -0
- package/dist/next/data/args.d.ts.map +1 -0
- package/dist/next/data/args.js +83 -0
- package/dist/next/data/args.js.map +1 -0
- package/dist/next/data/errors.d.ts +73 -0
- package/dist/next/data/errors.d.ts.map +1 -0
- package/dist/next/data/errors.js +107 -0
- package/dist/next/data/errors.js.map +1 -0
- package/dist/next/data/failure.d.ts +26 -0
- package/dist/next/data/failure.d.ts.map +1 -0
- package/dist/next/data/failure.js +72 -0
- package/dist/next/data/failure.js.map +1 -0
- package/dist/next/data/index.d.ts +4 -0
- package/dist/next/data/index.d.ts.map +1 -0
- package/dist/next/data/index.js +4 -0
- package/dist/next/data/index.js.map +1 -0
- package/dist/next/data/internal.d.ts +7 -0
- package/dist/next/data/internal.d.ts.map +1 -0
- package/dist/next/data/internal.js +8 -0
- package/dist/next/data/internal.js.map +1 -0
- package/dist/next/data/params.d.ts +20 -0
- package/dist/next/data/params.d.ts.map +1 -0
- package/dist/next/data/params.js +31 -0
- package/dist/next/data/params.js.map +1 -0
- package/dist/next/data/principal.d.ts +17 -0
- package/dist/next/data/principal.d.ts.map +1 -0
- package/dist/next/data/principal.js +41 -0
- package/dist/next/data/principal.js.map +1 -0
- package/dist/next/data/validator.d.ts +12 -0
- package/dist/next/data/validator.d.ts.map +1 -0
- package/dist/next/data/validator.js +34 -0
- package/dist/next/data/validator.js.map +1 -0
- package/dist/next/documents/address-source.d.ts +20 -0
- package/dist/next/documents/address-source.d.ts.map +1 -0
- package/dist/next/documents/address-source.js +44 -0
- package/dist/next/documents/address-source.js.map +1 -0
- package/dist/next/documents/definition.d.ts +84 -0
- package/dist/next/documents/definition.d.ts.map +1 -0
- package/dist/next/documents/definition.js +73 -0
- package/dist/next/documents/definition.js.map +1 -0
- package/dist/next/documents/documents.d.ts +106 -0
- package/dist/next/documents/documents.d.ts.map +1 -0
- package/dist/next/documents/documents.js +224 -0
- package/dist/next/documents/documents.js.map +1 -0
- package/dist/next/documents/fence.d.ts +9 -0
- package/dist/next/documents/fence.d.ts.map +1 -0
- package/dist/next/documents/fence.js +15 -0
- package/dist/next/documents/fence.js.map +1 -0
- package/dist/next/documents/handles.d.ts +76 -0
- package/dist/next/documents/handles.d.ts.map +1 -0
- package/dist/next/documents/handles.js +66 -0
- package/dist/next/documents/handles.js.map +1 -0
- package/dist/next/documents/index.d.ts +4 -0
- package/dist/next/documents/index.d.ts.map +1 -0
- package/dist/next/documents/index.js +3 -0
- package/dist/next/documents/index.js.map +1 -0
- package/dist/next/documents/internal.d.ts +9 -0
- package/dist/next/documents/internal.d.ts.map +1 -0
- package/dist/next/documents/internal.js +9 -0
- package/dist/next/documents/internal.js.map +1 -0
- package/dist/next/documents/keyed-slot.d.ts +103 -0
- package/dist/next/documents/keyed-slot.d.ts.map +1 -0
- package/dist/next/documents/keyed-slot.js +395 -0
- package/dist/next/documents/keyed-slot.js.map +1 -0
- package/dist/next/documents/line.d.ts +7 -0
- package/dist/next/documents/line.d.ts.map +1 -0
- package/dist/next/documents/line.js +14 -0
- package/dist/next/documents/line.js.map +1 -0
- package/dist/next/documents/persistence.d.ts +104 -0
- package/dist/next/documents/persistence.d.ts.map +1 -0
- package/dist/next/documents/persistence.js +128 -0
- package/dist/next/documents/persistence.js.map +1 -0
- package/dist/next/documents/residency.d.ts +31 -0
- package/dist/next/documents/residency.d.ts.map +1 -0
- package/dist/next/documents/residency.js +93 -0
- package/dist/next/documents/residency.js.map +1 -0
- package/dist/next/documents/slot.d.ts +109 -0
- package/dist/next/documents/slot.d.ts.map +1 -0
- package/dist/next/documents/slot.js +181 -0
- package/dist/next/documents/slot.js.map +1 -0
- package/dist/next/documents/transaction.d.ts +133 -0
- package/dist/next/documents/transaction.d.ts.map +1 -0
- package/dist/next/documents/transaction.js +409 -0
- package/dist/next/documents/transaction.js.map +1 -0
- package/dist/next/host/activity.d.ts +31 -0
- package/dist/next/host/activity.d.ts.map +1 -0
- package/dist/next/host/activity.js +40 -0
- package/dist/next/host/activity.js.map +1 -0
- package/dist/next/host/adapted.d.ts +49 -0
- package/dist/next/host/adapted.d.ts.map +1 -0
- package/dist/next/host/adapted.js +214 -0
- package/dist/next/host/adapted.js.map +1 -0
- package/dist/next/host/attempt.d.ts +278 -0
- package/dist/next/host/attempt.d.ts.map +1 -0
- package/dist/next/host/attempt.js +1072 -0
- package/dist/next/host/attempt.js.map +1 -0
- package/dist/next/host/backoff.d.ts +29 -0
- package/dist/next/host/backoff.d.ts.map +1 -0
- package/dist/next/host/backoff.js +69 -0
- package/dist/next/host/backoff.js.map +1 -0
- package/dist/next/host/ctx.d.ts +47 -0
- package/dist/next/host/ctx.d.ts.map +1 -0
- package/dist/next/host/ctx.js +108 -0
- package/dist/next/host/ctx.js.map +1 -0
- package/dist/next/host/deadline.d.ts +12 -0
- package/dist/next/host/deadline.d.ts.map +1 -0
- package/dist/next/host/deadline.js +40 -0
- package/dist/next/host/deadline.js.map +1 -0
- package/dist/next/host/dependencies.d.ts +65 -0
- package/dist/next/host/dependencies.d.ts.map +1 -0
- package/dist/next/host/dependencies.js +115 -0
- package/dist/next/host/dependencies.js.map +1 -0
- package/dist/next/host/destination.d.ts +48 -0
- package/dist/next/host/destination.d.ts.map +1 -0
- package/dist/next/host/destination.js +101 -0
- package/dist/next/host/destination.js.map +1 -0
- package/dist/next/host/facet.d.ts +79 -0
- package/dist/next/host/facet.d.ts.map +1 -0
- package/dist/next/host/facet.js +55 -0
- package/dist/next/host/facet.js.map +1 -0
- package/dist/next/host/follow.d.ts +52 -0
- package/dist/next/host/follow.d.ts.map +1 -0
- package/dist/next/host/follow.js +207 -0
- package/dist/next/host/follow.js.map +1 -0
- package/dist/next/host/host.d.ts +495 -0
- package/dist/next/host/host.d.ts.map +1 -0
- package/dist/next/host/host.js +1075 -0
- package/dist/next/host/host.js.map +1 -0
- package/dist/next/host/index.d.ts +17 -0
- package/dist/next/host/index.d.ts.map +1 -0
- package/dist/next/host/index.js +6 -0
- package/dist/next/host/index.js.map +1 -0
- package/dist/next/host/internal.d.ts +10 -0
- package/dist/next/host/internal.d.ts.map +1 -0
- package/dist/next/host/internal.js +8 -0
- package/dist/next/host/internal.js.map +1 -0
- package/dist/next/host/members.d.ts +50 -0
- package/dist/next/host/members.d.ts.map +1 -0
- package/dist/next/host/members.js +107 -0
- package/dist/next/host/members.js.map +1 -0
- package/dist/next/host/native.d.ts +55 -0
- package/dist/next/host/native.d.ts.map +1 -0
- package/dist/next/host/native.js +92 -0
- package/dist/next/host/native.js.map +1 -0
- package/dist/next/host/object.d.ts +290 -0
- package/dist/next/host/object.d.ts.map +1 -0
- package/dist/next/host/object.js +1127 -0
- package/dist/next/host/object.js.map +1 -0
- package/dist/next/host/parked.d.ts +23 -0
- package/dist/next/host/parked.d.ts.map +1 -0
- package/dist/next/host/parked.js +79 -0
- package/dist/next/host/parked.js.map +1 -0
- package/dist/next/host/presence.d.ts +34 -0
- package/dist/next/host/presence.d.ts.map +1 -0
- package/dist/next/host/presence.js +117 -0
- package/dist/next/host/presence.js.map +1 -0
- package/dist/next/host/ref-state.d.ts +53 -0
- package/dist/next/host/ref-state.d.ts.map +1 -0
- package/dist/next/host/ref-state.js +83 -0
- package/dist/next/host/ref-state.js.map +1 -0
- package/dist/next/host/reference-keys.d.ts +36 -0
- package/dist/next/host/reference-keys.d.ts.map +1 -0
- package/dist/next/host/reference-keys.js +168 -0
- package/dist/next/host/reference-keys.js.map +1 -0
- package/dist/next/host/reference-source.d.ts +65 -0
- package/dist/next/host/reference-source.d.ts.map +1 -0
- package/dist/next/host/reference-source.js +285 -0
- package/dist/next/host/reference-source.js.map +1 -0
- package/dist/next/host/reference.d.ts +308 -0
- package/dist/next/host/reference.d.ts.map +1 -0
- package/dist/next/host/reference.js +775 -0
- package/dist/next/host/reference.js.map +1 -0
- package/dist/next/host/retry-on.d.ts +28 -0
- package/dist/next/host/retry-on.d.ts.map +1 -0
- package/dist/next/host/retry-on.js +52 -0
- package/dist/next/host/retry-on.js.map +1 -0
- package/dist/next/host/revocation.d.ts +16 -0
- package/dist/next/host/revocation.d.ts.map +1 -0
- package/dist/next/host/revocation.js +27 -0
- package/dist/next/host/revocation.js.map +1 -0
- package/dist/next/host/root.d.ts +27 -0
- package/dist/next/host/root.d.ts.map +1 -0
- package/dist/next/host/root.js +68 -0
- package/dist/next/host/root.js.map +1 -0
- package/dist/next/host/route.d.ts +64 -0
- package/dist/next/host/route.d.ts.map +1 -0
- package/dist/next/host/route.js +190 -0
- package/dist/next/host/route.js.map +1 -0
- package/dist/next/host/routines.d.ts +76 -0
- package/dist/next/host/routines.d.ts.map +1 -0
- package/dist/next/host/routines.js +350 -0
- package/dist/next/host/routines.js.map +1 -0
- package/dist/next/host/sleep.d.ts +9 -0
- package/dist/next/host/sleep.d.ts.map +1 -0
- package/dist/next/host/sleep.js +40 -0
- package/dist/next/host/sleep.js.map +1 -0
- package/dist/next/host/staging.d.ts +94 -0
- package/dist/next/host/staging.d.ts.map +1 -0
- package/dist/next/host/staging.js +302 -0
- package/dist/next/host/staging.js.map +1 -0
- package/dist/next/host/unbound.d.ts +30 -0
- package/dist/next/host/unbound.d.ts.map +1 -0
- package/dist/next/host/unbound.js +67 -0
- package/dist/next/host/unbound.js.map +1 -0
- package/dist/next/host/uuid.d.ts +3 -0
- package/dist/next/host/uuid.d.ts.map +1 -0
- package/dist/next/host/uuid.js +38 -0
- package/dist/next/host/uuid.js.map +1 -0
- package/dist/next/index.d.ts +28 -0
- package/dist/next/index.d.ts.map +1 -0
- package/dist/next/index.js +18 -0
- package/dist/next/index.js.map +1 -0
- package/dist/next/jobs/definition.d.ts +96 -0
- package/dist/next/jobs/definition.d.ts.map +1 -0
- package/dist/next/jobs/definition.js +83 -0
- package/dist/next/jobs/definition.js.map +1 -0
- package/dist/next/jobs/index.d.ts +5 -0
- package/dist/next/jobs/index.d.ts.map +1 -0
- package/dist/next/jobs/index.js +3 -0
- package/dist/next/jobs/index.js.map +1 -0
- package/dist/next/jobs/internal.d.ts +3 -0
- package/dist/next/jobs/internal.d.ts.map +1 -0
- package/dist/next/jobs/internal.js +4 -0
- package/dist/next/jobs/internal.js.map +1 -0
- package/dist/next/jobs/job.d.ts +152 -0
- package/dist/next/jobs/job.d.ts.map +1 -0
- package/dist/next/jobs/job.js +320 -0
- package/dist/next/jobs/job.js.map +1 -0
- package/dist/next/jobs/persisted.d.ts +38 -0
- package/dist/next/jobs/persisted.d.ts.map +1 -0
- package/dist/next/jobs/persisted.js +95 -0
- package/dist/next/jobs/persisted.js.map +1 -0
- package/dist/next/jobs/records.d.ts +231 -0
- package/dist/next/jobs/records.d.ts.map +1 -0
- package/dist/next/jobs/records.js +869 -0
- package/dist/next/jobs/records.js.map +1 -0
- package/dist/next/jobs/run-states.d.ts +69 -0
- package/dist/next/jobs/run-states.d.ts.map +1 -0
- package/dist/next/jobs/run-states.js +228 -0
- package/dist/next/jobs/run-states.js.map +1 -0
- package/dist/next/jobs/run.d.ts +113 -0
- package/dist/next/jobs/run.d.ts.map +1 -0
- package/dist/next/jobs/run.js +200 -0
- package/dist/next/jobs/run.js.map +1 -0
- package/dist/next/jobs/running.d.ts +44 -0
- package/dist/next/jobs/running.d.ts.map +1 -0
- package/dist/next/jobs/running.js +117 -0
- package/dist/next/jobs/running.js.map +1 -0
- package/dist/next/jobs/stored.d.ts +63 -0
- package/dist/next/jobs/stored.d.ts.map +1 -0
- package/dist/next/jobs/stored.js +55 -0
- package/dist/next/jobs/stored.js.map +1 -0
- package/dist/next/link/binary.d.ts +4 -0
- package/dist/next/link/binary.d.ts.map +1 -0
- package/dist/next/link/binary.js +534 -0
- package/dist/next/link/binary.js.map +1 -0
- package/dist/next/link/channel.d.ts +63 -0
- package/dist/next/link/channel.d.ts.map +1 -0
- package/dist/next/link/channel.js +202 -0
- package/dist/next/link/channel.js.map +1 -0
- package/dist/next/link/errors.d.ts +7 -0
- package/dist/next/link/errors.d.ts.map +1 -0
- package/dist/next/link/errors.js +21 -0
- package/dist/next/link/errors.js.map +1 -0
- package/dist/next/link/index.d.ts +8 -0
- package/dist/next/link/index.d.ts.map +1 -0
- package/dist/next/link/index.js +8 -0
- package/dist/next/link/index.js.map +1 -0
- package/dist/next/link/internal.d.ts +9 -0
- package/dist/next/link/internal.d.ts.map +1 -0
- package/dist/next/link/internal.js +10 -0
- package/dist/next/link/internal.js.map +1 -0
- package/dist/next/link/ipc.d.ts +22 -0
- package/dist/next/link/ipc.d.ts.map +1 -0
- package/dist/next/link/ipc.js +64 -0
- package/dist/next/link/ipc.js.map +1 -0
- package/dist/next/link/link.d.ts +34 -0
- package/dist/next/link/link.d.ts.map +1 -0
- package/dist/next/link/link.js +87 -0
- package/dist/next/link/link.js.map +1 -0
- package/dist/next/link/message.d.ts +249 -0
- package/dist/next/link/message.d.ts.map +1 -0
- package/dist/next/link/message.js +123 -0
- package/dist/next/link/message.js.map +1 -0
- package/dist/next/link/part.d.ts +80 -0
- package/dist/next/link/part.d.ts.map +1 -0
- package/dist/next/link/part.js +164 -0
- package/dist/next/link/part.js.map +1 -0
- package/dist/next/link/text.d.ts +6 -0
- package/dist/next/link/text.d.ts.map +1 -0
- package/dist/next/link/text.js +335 -0
- package/dist/next/link/text.js.map +1 -0
- package/dist/next/link/values.d.ts +40 -0
- package/dist/next/link/values.d.ts.map +1 -0
- package/dist/next/link/values.js +117 -0
- package/dist/next/link/values.js.map +1 -0
- package/dist/next/link/websocket.d.ts +26 -0
- package/dist/next/link/websocket.d.ts.map +1 -0
- package/dist/next/link/websocket.js +91 -0
- package/dist/next/link/websocket.js.map +1 -0
- package/dist/next/registries/contribution.d.ts +50 -0
- package/dist/next/registries/contribution.d.ts.map +1 -0
- package/dist/next/registries/contribution.js +129 -0
- package/dist/next/registries/contribution.js.map +1 -0
- package/dist/next/registries/entries.d.ts +18 -0
- package/dist/next/registries/entries.d.ts.map +1 -0
- package/dist/next/registries/entries.js +42 -0
- package/dist/next/registries/entries.js.map +1 -0
- package/dist/next/registries/index.d.ts +3 -0
- package/dist/next/registries/index.d.ts.map +1 -0
- package/dist/next/registries/index.js +5 -0
- package/dist/next/registries/index.js.map +1 -0
- package/dist/next/registries/internal.d.ts +4 -0
- package/dist/next/registries/internal.d.ts.map +1 -0
- package/dist/next/registries/internal.js +5 -0
- package/dist/next/registries/internal.js.map +1 -0
- package/dist/next/registries/record.d.ts +94 -0
- package/dist/next/registries/record.d.ts.map +1 -0
- package/dist/next/registries/record.js +253 -0
- package/dist/next/registries/record.js.map +1 -0
- package/dist/next/registries/registry.d.ts +74 -0
- package/dist/next/registries/registry.d.ts.map +1 -0
- package/dist/next/registries/registry.js +14 -0
- package/dist/next/registries/registry.js.map +1 -0
- package/dist/next/registries/value.d.ts +48 -0
- package/dist/next/registries/value.d.ts.map +1 -0
- package/dist/next/registries/value.js +199 -0
- package/dist/next/registries/value.js.map +1 -0
- package/dist/next/remote/calls.d.ts +25 -0
- package/dist/next/remote/calls.d.ts.map +1 -0
- package/dist/next/remote/calls.js +62 -0
- package/dist/next/remote/calls.js.map +1 -0
- package/dist/next/remote/consumer.d.ts +42 -0
- package/dist/next/remote/consumer.d.ts.map +1 -0
- package/dist/next/remote/consumer.js +343 -0
- package/dist/next/remote/consumer.js.map +1 -0
- package/dist/next/remote/hold.d.ts +130 -0
- package/dist/next/remote/hold.d.ts.map +1 -0
- package/dist/next/remote/hold.js +537 -0
- package/dist/next/remote/hold.js.map +1 -0
- package/dist/next/remote/host-link.d.ts +77 -0
- package/dist/next/remote/host-link.d.ts.map +1 -0
- package/dist/next/remote/host-link.js +182 -0
- package/dist/next/remote/host-link.js.map +1 -0
- package/dist/next/remote/internal.d.ts +6 -0
- package/dist/next/remote/internal.d.ts.map +1 -0
- package/dist/next/remote/internal.js +6 -0
- package/dist/next/remote/internal.js.map +1 -0
- package/dist/next/remote/path.d.ts +46 -0
- package/dist/next/remote/path.d.ts.map +1 -0
- package/dist/next/remote/path.js +73 -0
- package/dist/next/remote/path.js.map +1 -0
- package/dist/next/remote/provider.d.ts +76 -0
- package/dist/next/remote/provider.d.ts.map +1 -0
- package/dist/next/remote/provider.js +506 -0
- package/dist/next/remote/provider.js.map +1 -0
- package/dist/next/remote/relay.d.ts +58 -0
- package/dist/next/remote/relay.d.ts.map +1 -0
- package/dist/next/remote/relay.js +117 -0
- package/dist/next/remote/relay.js.map +1 -0
- package/dist/next/remote/remote-object.d.ts +133 -0
- package/dist/next/remote/remote-object.d.ts.map +1 -0
- package/dist/next/remote/remote-object.js +411 -0
- package/dist/next/remote/remote-object.js.map +1 -0
- package/dist/next/remote/replica.d.ts +59 -0
- package/dist/next/remote/replica.d.ts.map +1 -0
- package/dist/next/remote/replica.js +125 -0
- package/dist/next/remote/replica.js.map +1 -0
- package/dist/next/state/batch.d.ts +64 -0
- package/dist/next/state/batch.d.ts.map +1 -0
- package/dist/next/state/batch.js +163 -0
- package/dist/next/state/batch.js.map +1 -0
- package/dist/next/state/derive.d.ts +52 -0
- package/dist/next/state/derive.d.ts.map +1 -0
- package/dist/next/state/derive.js +182 -0
- package/dist/next/state/derive.js.map +1 -0
- package/dist/next/state/index.d.ts +6 -0
- package/dist/next/state/index.d.ts.map +1 -0
- package/dist/next/state/index.js +4 -0
- package/dist/next/state/index.js.map +1 -0
- package/dist/next/state/internal.d.ts +6 -0
- package/dist/next/state/internal.d.ts.map +1 -0
- package/dist/next/state/internal.js +8 -0
- package/dist/next/state/internal.js.map +1 -0
- package/dist/next/state/native-source.d.ts +106 -0
- package/dist/next/state/native-source.d.ts.map +1 -0
- package/dist/next/state/native-source.js +240 -0
- package/dist/next/state/native-source.js.map +1 -0
- package/dist/next/state/watchable.d.ts +114 -0
- package/dist/next/state/watchable.d.ts.map +1 -0
- package/dist/next/state/watchable.js +156 -0
- package/dist/next/state/watchable.js.map +1 -0
- package/dist/next/state/writable.d.ts +32 -0
- package/dist/next/state/writable.d.ts.map +1 -0
- package/dist/next/state/writable.js +49 -0
- package/dist/next/state/writable.js.map +1 -0
- package/dist/next/store/adapter.d.ts +67 -0
- package/dist/next/store/adapter.d.ts.map +1 -0
- package/dist/next/store/adapter.js +118 -0
- package/dist/next/store/adapter.js.map +1 -0
- package/dist/next/store/allocator.d.ts +17 -0
- package/dist/next/store/allocator.d.ts.map +1 -0
- package/dist/next/store/allocator.js +30 -0
- package/dist/next/store/allocator.js.map +1 -0
- package/dist/next/store/applier.d.ts +8 -0
- package/dist/next/store/applier.d.ts.map +1 -0
- package/dist/next/store/applier.js +375 -0
- package/dist/next/store/applier.js.map +1 -0
- package/dist/next/store/apply-batch.d.ts +12 -0
- package/dist/next/store/apply-batch.d.ts.map +1 -0
- package/dist/next/store/apply-batch.js +83 -0
- package/dist/next/store/apply-batch.js.map +1 -0
- package/dist/next/store/archive.d.ts +32 -0
- package/dist/next/store/archive.d.ts.map +1 -0
- package/dist/next/store/archive.js +129 -0
- package/dist/next/store/archive.js.map +1 -0
- package/dist/next/store/backend.d.ts +10 -0
- package/dist/next/store/backend.d.ts.map +1 -0
- package/dist/next/store/backend.js +15 -0
- package/dist/next/store/backend.js.map +1 -0
- package/dist/next/store/catalog.d.ts +24 -0
- package/dist/next/store/catalog.d.ts.map +1 -0
- package/dist/next/store/catalog.js +17 -0
- package/dist/next/store/catalog.js.map +1 -0
- package/dist/next/store/claims.d.ts +23 -0
- package/dist/next/store/claims.d.ts.map +1 -0
- package/dist/next/store/claims.js +65 -0
- package/dist/next/store/claims.js.map +1 -0
- package/dist/next/store/columns.d.ts +77 -0
- package/dist/next/store/columns.d.ts.map +1 -0
- package/dist/next/store/columns.js +77 -0
- package/dist/next/store/columns.js.map +1 -0
- package/dist/next/store/engine.d.ts +176 -0
- package/dist/next/store/engine.d.ts.map +1 -0
- package/dist/next/store/engine.js +283 -0
- package/dist/next/store/engine.js.map +1 -0
- package/dist/next/store/evaluate.d.ts +17 -0
- package/dist/next/store/evaluate.d.ts.map +1 -0
- package/dist/next/store/evaluate.js +128 -0
- package/dist/next/store/evaluate.js.map +1 -0
- package/dist/next/store/export.d.ts +17 -0
- package/dist/next/store/export.d.ts.map +1 -0
- package/dist/next/store/export.js +200 -0
- package/dist/next/store/export.js.map +1 -0
- package/dist/next/store/expression.d.ts +150 -0
- package/dist/next/store/expression.d.ts.map +1 -0
- package/dist/next/store/expression.js +268 -0
- package/dist/next/store/expression.js.map +1 -0
- package/dist/next/store/import.d.ts +10 -0
- package/dist/next/store/import.d.ts.map +1 -0
- package/dist/next/store/import.js +276 -0
- package/dist/next/store/import.js.map +1 -0
- package/dist/next/store/index.d.ts +16 -0
- package/dist/next/store/index.d.ts.map +1 -0
- package/dist/next/store/index.js +13 -0
- package/dist/next/store/index.js.map +1 -0
- package/dist/next/store/json-column.d.ts +33 -0
- package/dist/next/store/json-column.d.ts.map +1 -0
- package/dist/next/store/json-column.js +61 -0
- package/dist/next/store/json-column.js.map +1 -0
- package/dist/next/store/jsonl.d.ts +9 -0
- package/dist/next/store/jsonl.d.ts.map +1 -0
- package/dist/next/store/jsonl.js +61 -0
- package/dist/next/store/jsonl.js.map +1 -0
- package/dist/next/store/outbox.d.ts +26 -0
- package/dist/next/store/outbox.d.ts.map +1 -0
- package/dist/next/store/outbox.js +80 -0
- package/dist/next/store/outbox.js.map +1 -0
- package/dist/next/store/query.d.ts +39 -0
- package/dist/next/store/query.d.ts.map +1 -0
- package/dist/next/store/query.js +97 -0
- package/dist/next/store/query.js.map +1 -0
- package/dist/next/store/refusal.d.ts +15 -0
- package/dist/next/store/refusal.d.ts.map +1 -0
- package/dist/next/store/refusal.js +36 -0
- package/dist/next/store/refusal.js.map +1 -0
- package/dist/next/store/rows.d.ts +80 -0
- package/dist/next/store/rows.d.ts.map +1 -0
- package/dist/next/store/rows.js +183 -0
- package/dist/next/store/rows.js.map +1 -0
- package/dist/next/store/schema.d.ts +25 -0
- package/dist/next/store/schema.d.ts.map +1 -0
- package/dist/next/store/schema.js +115 -0
- package/dist/next/store/schema.js.map +1 -0
- package/dist/next/store/sql.d.ts +73 -0
- package/dist/next/store/sql.d.ts.map +1 -0
- package/dist/next/store/sql.js +234 -0
- package/dist/next/store/sql.js.map +1 -0
- package/dist/next/store/step.d.ts +48 -0
- package/dist/next/store/step.d.ts.map +1 -0
- package/dist/next/store/step.js +50 -0
- package/dist/next/store/step.js.map +1 -0
- package/dist/next/store/store.d.ts +161 -0
- package/dist/next/store/store.d.ts.map +1 -0
- package/dist/next/store/store.js +627 -0
- package/dist/next/store/store.js.map +1 -0
- package/dist/next/store/table-changes.d.ts +29 -0
- package/dist/next/store/table-changes.d.ts.map +1 -0
- package/dist/next/store/table-changes.js +102 -0
- package/dist/next/store/table-changes.js.map +1 -0
- package/dist/next/store/table-evolve.d.ts +74 -0
- package/dist/next/store/table-evolve.d.ts.map +1 -0
- package/dist/next/store/table-evolve.js +201 -0
- package/dist/next/store/table-evolve.js.map +1 -0
- package/dist/next/store/table-handle.d.ts +67 -0
- package/dist/next/store/table-handle.d.ts.map +1 -0
- package/dist/next/store/table-handle.js +101 -0
- package/dist/next/store/table-handle.js.map +1 -0
- package/dist/next/store/table-history.d.ts +75 -0
- package/dist/next/store/table-history.d.ts.map +1 -0
- package/dist/next/store/table-history.js +42 -0
- package/dist/next/store/table-history.js.map +1 -0
- package/dist/next/store/table-migration.d.ts +16 -0
- package/dist/next/store/table-migration.d.ts.map +1 -0
- package/dist/next/store/table-migration.js +202 -0
- package/dist/next/store/table-migration.js.map +1 -0
- package/dist/next/store/table-writes.d.ts +125 -0
- package/dist/next/store/table-writes.d.ts.map +1 -0
- package/dist/next/store/table-writes.js +165 -0
- package/dist/next/store/table-writes.js.map +1 -0
- package/dist/next/store/table.d.ts +80 -0
- package/dist/next/store/table.d.ts.map +1 -0
- package/dist/next/store/table.js +103 -0
- package/dist/next/store/table.js.map +1 -0
- package/dist/next/store/text.d.ts +14 -0
- package/dist/next/store/text.d.ts.map +1 -0
- package/dist/next/store/text.js +51 -0
- package/dist/next/store/text.js.map +1 -0
- package/dist/next/store/writes.d.ts +5 -0
- package/dist/next/store/writes.d.ts.map +1 -0
- package/dist/next/store/writes.js +4 -0
- package/dist/next/store/writes.js.map +1 -0
- package/dist/next-node/compression.d.ts +7 -0
- package/dist/next-node/compression.d.ts.map +1 -0
- package/dist/next-node/compression.js +24 -0
- package/dist/next-node/compression.js.map +1 -0
- package/dist/next-node/http/admission.d.ts +63 -0
- package/dist/next-node/http/admission.d.ts.map +1 -0
- package/dist/next-node/http/admission.js +134 -0
- package/dist/next-node/http/admission.js.map +1 -0
- package/dist/next-node/http/authenticate.d.ts +21 -0
- package/dist/next-node/http/authenticate.d.ts.map +1 -0
- package/dist/next-node/http/authenticate.js +34 -0
- package/dist/next-node/http/authenticate.js.map +1 -0
- package/dist/next-node/http/cookies.d.ts +24 -0
- package/dist/next-node/http/cookies.d.ts.map +1 -0
- package/dist/next-node/http/cookies.js +62 -0
- package/dist/next-node/http/cookies.js.map +1 -0
- package/dist/next-node/http/file.d.ts +23 -0
- package/dist/next-node/http/file.d.ts.map +1 -0
- package/dist/next-node/http/file.js +94 -0
- package/dist/next-node/http/file.js.map +1 -0
- package/dist/next-node/http/headers.d.ts +37 -0
- package/dist/next-node/http/headers.d.ts.map +1 -0
- package/dist/next-node/http/headers.js +129 -0
- package/dist/next-node/http/headers.js.map +1 -0
- package/dist/next-node/http/http.d.ts +100 -0
- package/dist/next-node/http/http.d.ts.map +1 -0
- package/dist/next-node/http/http.js +462 -0
- package/dist/next-node/http/http.js.map +1 -0
- package/dist/next-node/http/incoming.d.ts +19 -0
- package/dist/next-node/http/incoming.d.ts.map +1 -0
- package/dist/next-node/http/incoming.js +31 -0
- package/dist/next-node/http/incoming.js.map +1 -0
- package/dist/next-node/http/index.d.ts +11 -0
- package/dist/next-node/http/index.d.ts.map +1 -0
- package/dist/next-node/http/index.js +12 -0
- package/dist/next-node/http/index.js.map +1 -0
- package/dist/next-node/http/node.d.ts +78 -0
- package/dist/next-node/http/node.d.ts.map +1 -0
- package/dist/next-node/http/node.js +291 -0
- package/dist/next-node/http/node.js.map +1 -0
- package/dist/next-node/http/request.d.ts +54 -0
- package/dist/next-node/http/request.d.ts.map +1 -0
- package/dist/next-node/http/request.js +116 -0
- package/dist/next-node/http/request.js.map +1 -0
- package/dist/next-node/http/response.d.ts +63 -0
- package/dist/next-node/http/response.d.ts.map +1 -0
- package/dist/next-node/http/response.js +202 -0
- package/dist/next-node/http/response.js.map +1 -0
- package/dist/next-node/http/router.d.ts +114 -0
- package/dist/next-node/http/router.d.ts.map +1 -0
- package/dist/next-node/http/router.js +261 -0
- package/dist/next-node/http/router.js.map +1 -0
- package/dist/next-node/http/upgrades.d.ts +58 -0
- package/dist/next-node/http/upgrades.d.ts.map +1 -0
- package/dist/next-node/http/upgrades.js +184 -0
- package/dist/next-node/http/upgrades.js.map +1 -0
- package/dist/next-node/plugins/build.d.ts +57 -0
- package/dist/next-node/plugins/build.d.ts.map +1 -0
- package/dist/next-node/plugins/build.js +334 -0
- package/dist/next-node/plugins/build.js.map +1 -0
- package/dist/next-node/plugins/discover.d.ts +36 -0
- package/dist/next-node/plugins/discover.d.ts.map +1 -0
- package/dist/next-node/plugins/discover.js +91 -0
- package/dist/next-node/plugins/discover.js.map +1 -0
- package/dist/next-node/plugins/evaluate.d.ts +33 -0
- package/dist/next-node/plugins/evaluate.d.ts.map +1 -0
- package/dist/next-node/plugins/evaluate.js +98 -0
- package/dist/next-node/plugins/evaluate.js.map +1 -0
- package/dist/next-node/plugins/index.d.ts +9 -0
- package/dist/next-node/plugins/index.d.ts.map +1 -0
- package/dist/next-node/plugins/index.js +11 -0
- package/dist/next-node/plugins/index.js.map +1 -0
- package/dist/next-node/plugins/install.d.ts +13 -0
- package/dist/next-node/plugins/install.d.ts.map +1 -0
- package/dist/next-node/plugins/install.js +37 -0
- package/dist/next-node/plugins/install.js.map +1 -0
- package/dist/next-node/plugins/plugins.d.ts +135 -0
- package/dist/next-node/plugins/plugins.d.ts.map +1 -0
- package/dist/next-node/plugins/plugins.js +206 -0
- package/dist/next-node/plugins/plugins.js.map +1 -0
- package/dist/next-node/plugins/runtime.d.ts +41 -0
- package/dist/next-node/plugins/runtime.d.ts.map +1 -0
- package/dist/next-node/plugins/runtime.js +136 -0
- package/dist/next-node/plugins/runtime.js.map +1 -0
- package/dist/next-node/plugins/stack.d.ts +16 -0
- package/dist/next-node/plugins/stack.d.ts.map +1 -0
- package/dist/next-node/plugins/stack.js +61 -0
- package/dist/next-node/plugins/stack.js.map +1 -0
- package/dist/next-node/plugins/watcher.d.ts +58 -0
- package/dist/next-node/plugins/watcher.d.ts.map +1 -0
- package/dist/next-node/plugins/watcher.js +281 -0
- package/dist/next-node/plugins/watcher.js.map +1 -0
- package/dist/next-node/workers/control.d.ts +83 -0
- package/dist/next-node/workers/control.d.ts.map +1 -0
- package/dist/next-node/workers/control.js +77 -0
- package/dist/next-node/workers/control.js.map +1 -0
- package/dist/next-node/workers/index.d.ts +5 -0
- package/dist/next-node/workers/index.d.ts.map +1 -0
- package/dist/next-node/workers/index.js +7 -0
- package/dist/next-node/workers/index.js.map +1 -0
- package/dist/next-node/workers/lock.d.ts +21 -0
- package/dist/next-node/workers/lock.d.ts.map +1 -0
- package/dist/next-node/workers/lock.js +137 -0
- package/dist/next-node/workers/lock.js.map +1 -0
- package/dist/next-node/workers/main.d.ts +46 -0
- package/dist/next-node/workers/main.d.ts.map +1 -0
- package/dist/next-node/workers/main.js +230 -0
- package/dist/next-node/workers/main.js.map +1 -0
- package/dist/next-node/workers/process.d.ts +42 -0
- package/dist/next-node/workers/process.d.ts.map +1 -0
- package/dist/next-node/workers/process.js +125 -0
- package/dist/next-node/workers/process.js.map +1 -0
- package/dist/next-node/workers/workers.d.ts +80 -0
- package/dist/next-node/workers/workers.d.ts.map +1 -0
- package/dist/next-node/workers/workers.js +572 -0
- package/dist/next-node/workers/workers.js.map +1 -0
- package/dist/object.d.ts +4 -4
- package/dist/object.d.ts.map +1 -1
- package/dist/object.js +3 -4
- package/dist/object.js.map +1 -1
- package/dist/output.d.ts +9 -3
- package/dist/output.d.ts.map +1 -1
- package/dist/output.js +21 -9
- package/dist/output.js.map +1 -1
- package/dist/remote.d.ts.map +1 -1
- package/dist/remote.js +2 -2
- package/dist/remote.js.map +1 -1
- package/dist/schema.d.ts +8 -4
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +180 -5
- package/dist/schema.js.map +1 -1
- package/dist/sqlite/cloudflare.d.ts +54 -0
- package/dist/sqlite/cloudflare.d.ts.map +1 -0
- package/dist/sqlite/cloudflare.js +144 -0
- package/dist/sqlite/cloudflare.js.map +1 -0
- package/dist/sqlite/database.d.ts +40 -0
- package/dist/sqlite/database.d.ts.map +1 -0
- package/dist/sqlite/database.js +2 -0
- package/dist/sqlite/database.js.map +1 -0
- package/dist/sqlite/index.d.ts +4 -0
- package/dist/sqlite/index.d.ts.map +1 -0
- package/dist/sqlite/index.js +3 -0
- package/dist/sqlite/index.js.map +1 -0
- package/dist/sqlite/migrations.d.ts +10 -0
- package/dist/sqlite/migrations.d.ts.map +1 -0
- package/dist/sqlite/migrations.js +33 -0
- package/dist/sqlite/migrations.js.map +1 -0
- package/dist/sqlite/node.d.ts +41 -0
- package/dist/sqlite/node.d.ts.map +1 -0
- package/dist/sqlite/node.js +191 -0
- package/dist/sqlite/node.js.map +1 -0
- package/dist/sqlite/schema.d.ts +3 -0
- package/dist/sqlite/schema.d.ts.map +1 -0
- package/dist/sqlite/schema.js +10 -0
- package/dist/sqlite/schema.js.map +1 -0
- package/dist/telemetry-sqlite/index.d.ts +24 -0
- package/dist/telemetry-sqlite/index.d.ts.map +1 -0
- package/dist/telemetry-sqlite/index.js +273 -0
- package/dist/telemetry-sqlite/index.js.map +1 -0
- package/dist/telemetry-sqlite/store.d.ts +9 -0
- package/dist/telemetry-sqlite/store.d.ts.map +1 -0
- package/dist/telemetry-sqlite/store.js +110 -0
- package/dist/telemetry-sqlite/store.js.map +1 -0
- package/dist/watch.d.ts +194 -0
- package/dist/watch.d.ts.map +1 -0
- package/dist/watch.js +383 -0
- package/dist/watch.js.map +1 -0
- package/dist/wire.d.ts +174 -193
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +81 -80
- package/dist/wire.js.map +1 -1
- package/docs/guide.md +15 -15
- package/docs/next/benchmarks.md +959 -0
- package/docs/next/decisions.md +2957 -0
- package/docs/next/dependencies/book.md +1671 -0
- package/docs/next/dependencies/index.html +2641 -0
- package/docs/next/dependencies/model.md +330 -0
- package/docs/next/design.md +2554 -0
- package/docs/next/durable-observers/book.md +432 -0
- package/docs/next/durable-observers/index.html +517 -0
- package/docs/next/flow-control/book.md +333 -0
- package/docs/next/flow-control/fold/index.html +265 -0
- package/docs/next/flow-control/index.html +548 -0
- package/docs/next/flow-control/window/index.html +228 -0
- package/docs/next/guide-plugins-hosts/book.md +607 -0
- package/docs/next/guide-plugins-hosts/index.html +652 -0
- package/docs/next/http-workers/book.md +378 -0
- package/docs/next/http-workers/index.html +515 -0
- package/docs/next/layer-1.md +311 -0
- package/docs/next/layer-2.md +216 -0
- package/docs/next/plugin-model/book.md +186 -0
- package/docs/next/plugin-model/index.html +310 -0
- package/docs/next/plugin-primer/book.md +273 -0
- package/docs/next/plugin-primer/index.html +430 -0
- package/docs/next/slice-1.md +236 -0
- package/docs/next/slice-10.md +285 -0
- package/docs/next/slice-11.md +93 -0
- package/docs/next/slice-2.md +174 -0
- package/docs/next/slice-3a.md +296 -0
- package/docs/next/slice-3b.md +197 -0
- package/docs/next/slice-4.md +146 -0
- package/docs/next/slice-4a.md +418 -0
- package/docs/next/slice-4b.md +208 -0
- package/docs/next/slice-5.md +281 -0
- package/docs/next/slice-6a.md +676 -0
- package/docs/next/slice-6b.md +332 -0
- package/docs/next/slice-7a.md +130 -0
- package/docs/next/slice-7b/book.md +608 -0
- package/docs/next/slice-7b/index.html +842 -0
- package/docs/next/slice-7b.md +255 -0
- package/docs/next/slice-7c.md +165 -0
- package/docs/next/slice-8.md +194 -0
- package/docs/next/slices.md +230 -0
- package/docs/next/store/book.md +665 -0
- package/docs/next/store/index.html +861 -0
- package/docs/next/store/walkthrough.md +193 -0
- package/docs/spec.md +9 -9
- package/docs/tutorial.md +26 -25
- package/package.json +42 -5
- package/src/delta/README.md +69 -0
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
// The watcher and its marks (slice 7c §5): `fs.watch` on every directory of the plugin roots and the app's base code,
|
|
2
|
+
// `node_modules` and `.git` never watched (a directory appearing later gets its watch), marks what changed and never
|
|
3
|
+
// applies it. A changed file dirties every plugin whose facets used it (a copied contract every user) or whose directory
|
|
4
|
+
// contains it; a changed `package.json` asks for an install (and for its metadata to be read again); a plugin directory
|
|
5
|
+
// or facet file added or removed asks for discovery again; a file of base code asks the app to restart its hosts. The
|
|
6
|
+
// marks are a JSON watchable; each mark records the generation of its latest change (generations only increase), so a
|
|
7
|
+
// change during a build keeps its mark, however late an older build's rollout clears.
|
|
8
|
+
import { lstatSync, readdirSync, realpathSync, watch } from "node:fs";
|
|
9
|
+
import { basename, dirname, join, resolve, sep } from "node:path";
|
|
10
|
+
import { BACKGROUND_CONTEXT } from "../../context/index.js";
|
|
11
|
+
import { Source } from "../../next/state/internal.js";
|
|
12
|
+
import { inside } from "./build.js";
|
|
13
|
+
import { FACET_EXTENSIONS } from "./discover.js";
|
|
14
|
+
/** Directories never watched, and changes under them never marked. */
|
|
15
|
+
const IGNORED = new Set(["node_modules", ".git"]);
|
|
16
|
+
/**
|
|
17
|
+
* The watcher and the marks (`state`), a JSON watchable published at most once per microtask turn with changes. It
|
|
18
|
+
* marks for the plugins of the last discovery (`know`) and the files their last builds read (`used`).
|
|
19
|
+
*/
|
|
20
|
+
export class PluginWatcher extends Source {
|
|
21
|
+
#options;
|
|
22
|
+
#roots;
|
|
23
|
+
#baseDirs;
|
|
24
|
+
/** The trees it watches: the roots, the base code, and plugin directories linked from outside the roots. */
|
|
25
|
+
#trees = new Set();
|
|
26
|
+
/** Its watches, one per directory of its trees. */
|
|
27
|
+
#watchers = new Map();
|
|
28
|
+
/** A failure to watch was reported (once). */
|
|
29
|
+
#reported = false;
|
|
30
|
+
/** The generation the next change gets: every mark records a newer one than any before it. */
|
|
31
|
+
#generation = 1;
|
|
32
|
+
/** Each dirty plugin's latest change, by generation. */
|
|
33
|
+
#dirty = new Map();
|
|
34
|
+
#install = new Set();
|
|
35
|
+
/** The latest change of the plugin set since the last discovery (0: none). */
|
|
36
|
+
#set = 0;
|
|
37
|
+
/** The latest change of a known plugin's `package.json` since the last discovery (0: none). */
|
|
38
|
+
#manifest = 0;
|
|
39
|
+
#baseChanged = false;
|
|
40
|
+
#discovery = { plugins: [], problems: [] };
|
|
41
|
+
/** The files each built facet read (its inputs and copies), by plugin and kind. */
|
|
42
|
+
#used = new Map();
|
|
43
|
+
#value;
|
|
44
|
+
#scheduled = false;
|
|
45
|
+
constructor(options, batch) {
|
|
46
|
+
super(batch);
|
|
47
|
+
this.#options = options;
|
|
48
|
+
// Events name paths under the directories as watched: by their real paths, as discovery names plugins.
|
|
49
|
+
this.#roots = options.roots.map(real);
|
|
50
|
+
this.#baseDirs = options.base.map(real);
|
|
51
|
+
for (const dir of [...this.#roots, ...this.#baseDirs])
|
|
52
|
+
this.#watchTree(dir);
|
|
53
|
+
}
|
|
54
|
+
get value() {
|
|
55
|
+
this.#value ??= {
|
|
56
|
+
dirty: [...this.#dirty.keys()].sort(),
|
|
57
|
+
install: [...this.#install].sort(),
|
|
58
|
+
set: this.#set > 0,
|
|
59
|
+
base: this.#baseChanged,
|
|
60
|
+
};
|
|
61
|
+
return this.#value;
|
|
62
|
+
}
|
|
63
|
+
deliver(context) {
|
|
64
|
+
const value = this.value;
|
|
65
|
+
this.publish(value, [["r", value]], false, context);
|
|
66
|
+
}
|
|
67
|
+
/** Whether the next build discovers again: the plugin set or a plugin's `package.json` changed. */
|
|
68
|
+
get needsDiscovery() {
|
|
69
|
+
return this.#set > 0 || this.#manifest > 0;
|
|
70
|
+
}
|
|
71
|
+
/** What a discovery that starts now has seen. */
|
|
72
|
+
discoverySnapshot() {
|
|
73
|
+
return { set: this.#set, manifest: this.#manifest };
|
|
74
|
+
}
|
|
75
|
+
/** The plugins discovery found: marks are for them (a removed one's install clears); the changes it had seen clear. */
|
|
76
|
+
know(discovery, seen) {
|
|
77
|
+
this.#discovery = discovery;
|
|
78
|
+
if (this.#set === seen.set)
|
|
79
|
+
this.#set = 0;
|
|
80
|
+
if (this.#manifest === seen.manifest)
|
|
81
|
+
this.#manifest = 0;
|
|
82
|
+
// A removed plugin has nothing to install (its directory went, its package.json with it).
|
|
83
|
+
for (const name of this.#install)
|
|
84
|
+
if (!discovery.plugins.some((plugin) => plugin.name === name))
|
|
85
|
+
this.#install.delete(name);
|
|
86
|
+
// A plugin directory linked from outside the roots: a tree of its own (a symlink is not followed).
|
|
87
|
+
const linked = discovery.plugins.filter(({ dir }) => !this.#roots.some((root) => inside(root, dir)));
|
|
88
|
+
for (const { dir } of linked)
|
|
89
|
+
this.#watchTree(dir);
|
|
90
|
+
for (const tree of this.#trees) {
|
|
91
|
+
const kept = this.#roots.includes(tree) || this.#baseDirs.includes(tree) || linked.some((each) => each.dir === tree);
|
|
92
|
+
if (!kept)
|
|
93
|
+
this.#unwatchTree(tree);
|
|
94
|
+
}
|
|
95
|
+
this.#changed();
|
|
96
|
+
}
|
|
97
|
+
/** What `built` facets read: a later change of one of these files dirties their plugins. */
|
|
98
|
+
used(built) {
|
|
99
|
+
for (const facet of built) {
|
|
100
|
+
if (facet.kind !== "script")
|
|
101
|
+
continue;
|
|
102
|
+
const files = new Set([...facet.inputs.map(({ file }) => file), ...facet.copied]);
|
|
103
|
+
this.#used.set(`${facet.plugin}\u0000${facet.facet}`, { plugin: facet.plugin, files });
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/** The marks a build of `names` starts from: each one's latest change. */
|
|
107
|
+
snapshot(names) {
|
|
108
|
+
const plugins = new Map();
|
|
109
|
+
for (const name of names)
|
|
110
|
+
plugins.set(name, this.#dirty.get(name) ?? 0);
|
|
111
|
+
return { plugins };
|
|
112
|
+
}
|
|
113
|
+
/** `names` were applied everywhere: their marks clear unless a change came after `snapshot`. */
|
|
114
|
+
applied(names, snapshot) {
|
|
115
|
+
for (const name of names) {
|
|
116
|
+
const latest = this.#dirty.get(name);
|
|
117
|
+
if (latest !== undefined && latest <= (snapshot.plugins.get(name) ?? 0))
|
|
118
|
+
this.#dirty.delete(name);
|
|
119
|
+
}
|
|
120
|
+
this.#changed();
|
|
121
|
+
}
|
|
122
|
+
/** Plugin `name`'s dependencies were installed: its install mark clears and it is dirty (its packages changed). */
|
|
123
|
+
installed(name) {
|
|
124
|
+
this.#install.delete(name);
|
|
125
|
+
this.#dirty.set(name, this.#generation++);
|
|
126
|
+
this.#changed();
|
|
127
|
+
}
|
|
128
|
+
/** Marks what a change of the file or directory at `path` (absolute) asks for. */
|
|
129
|
+
mark(path) {
|
|
130
|
+
if (path.split(sep).some((part) => IGNORED.has(part)))
|
|
131
|
+
return;
|
|
132
|
+
if (this.#baseDirs.some((dir) => inside(dir, path))) {
|
|
133
|
+
this.#baseChanged = true;
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
this.#markPlugin(path, this.#generation++);
|
|
137
|
+
}
|
|
138
|
+
this.#changed();
|
|
139
|
+
}
|
|
140
|
+
/** Stops watching. */
|
|
141
|
+
close() {
|
|
142
|
+
for (const watcher of this.#watchers.values())
|
|
143
|
+
watcher.close();
|
|
144
|
+
this.#watchers.clear();
|
|
145
|
+
this.#trees.clear();
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* A change under a root, at `generation`: in a plugin's directory, it dirties that plugin (and asks for an install
|
|
149
|
+
* and a new reading of its metadata for its `package.json`, for discovery for a facet file at its top); elsewhere
|
|
150
|
+
* under a root (a directory added or removed, a directory that is no plugin yet), discovery; every plugin whose
|
|
151
|
+
* facets read the file is dirty too.
|
|
152
|
+
*/
|
|
153
|
+
#markPlugin(path, generation) {
|
|
154
|
+
const plugin = this.#discovery.plugins.find((each) => each.dir === path || inside(each.dir, path));
|
|
155
|
+
if (plugin === undefined) {
|
|
156
|
+
if (this.#roots.some((root) => inside(root, path)))
|
|
157
|
+
this.#set = generation;
|
|
158
|
+
}
|
|
159
|
+
else if (path === join(plugin.dir, "package.json")) {
|
|
160
|
+
this.#install.add(plugin.name);
|
|
161
|
+
this.#manifest = generation;
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
if (path === plugin.dir || (dirname(path) === plugin.dir && this.#isFacetFile(basename(path)))) {
|
|
165
|
+
this.#set = generation;
|
|
166
|
+
}
|
|
167
|
+
this.#dirty.set(plugin.name, generation);
|
|
168
|
+
}
|
|
169
|
+
for (const { plugin: user, files } of this.#used.values())
|
|
170
|
+
if (files.has(path))
|
|
171
|
+
this.#dirty.set(user, generation);
|
|
172
|
+
}
|
|
173
|
+
/** Whether `file` (at a plugin's top) is named as a facet file of one of the app's kinds. */
|
|
174
|
+
#isFacetFile(file) {
|
|
175
|
+
return this.#options.kinds.some((kind) => FACET_EXTENSIONS.some((extension) => file === `${kind}${extension}`));
|
|
176
|
+
}
|
|
177
|
+
/** Watches the tree at `dir` (once): it and every directory under it but ignored ones; a missing one is skipped. */
|
|
178
|
+
#watchTree(dir) {
|
|
179
|
+
if (this.#trees.has(dir))
|
|
180
|
+
return;
|
|
181
|
+
this.#trees.add(dir);
|
|
182
|
+
this.#watchDirs(dir);
|
|
183
|
+
}
|
|
184
|
+
/** Stops watching the tree at `dir`. */
|
|
185
|
+
#unwatchTree(dir) {
|
|
186
|
+
this.#trees.delete(dir);
|
|
187
|
+
this.#unwatchDirs(dir);
|
|
188
|
+
}
|
|
189
|
+
/** Watches `dir` and, walking down, every directory under it but ignored ones (each not watched yet). */
|
|
190
|
+
#watchDirs(dir) {
|
|
191
|
+
if (this.#watchers.has(dir) || this.#reported)
|
|
192
|
+
return;
|
|
193
|
+
let watcher;
|
|
194
|
+
try {
|
|
195
|
+
watcher = watch(dir, (_event, file) => {
|
|
196
|
+
if (file !== null)
|
|
197
|
+
this.#changedIn(join(dir, file));
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
if (error.code !== "ENOENT")
|
|
202
|
+
this.#failed(error);
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
watcher.on("error", (error) => this.#failed(error));
|
|
206
|
+
this.#watchers.set(dir, watcher);
|
|
207
|
+
let entries;
|
|
208
|
+
try {
|
|
209
|
+
entries = readdirSync(dir, { withFileTypes: true });
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
// Removed meanwhile: its parent's event says so.
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
for (const entry of entries) {
|
|
216
|
+
if (entry.isDirectory() && !IGNORED.has(entry.name))
|
|
217
|
+
this.#watchDirs(join(dir, entry.name));
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/** An event for `path` in a watched directory: a new directory gets its watches, a removed one loses them; marked. */
|
|
221
|
+
#changedIn(path) {
|
|
222
|
+
const name = basename(path);
|
|
223
|
+
if (!IGNORED.has(name)) {
|
|
224
|
+
if (isDirectory(path))
|
|
225
|
+
this.#watchDirs(path);
|
|
226
|
+
else if (this.#watchers.has(path))
|
|
227
|
+
this.#unwatchDirs(path);
|
|
228
|
+
}
|
|
229
|
+
this.mark(path);
|
|
230
|
+
}
|
|
231
|
+
/** Stops watching `dir` and the directories under it (it was removed, or its tree is not watched any more). */
|
|
232
|
+
#unwatchDirs(dir) {
|
|
233
|
+
for (const [watched, watcher] of this.#watchers) {
|
|
234
|
+
if (watched !== dir && !inside(dir, watched))
|
|
235
|
+
continue;
|
|
236
|
+
watcher.close();
|
|
237
|
+
this.#watchers.delete(watched);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
/** Watching failed: reported once; every watch stops (the app builds on demand). */
|
|
241
|
+
#failed(error) {
|
|
242
|
+
this.close();
|
|
243
|
+
if (this.#reported)
|
|
244
|
+
return;
|
|
245
|
+
this.#reported = true;
|
|
246
|
+
this.#options.failed(error);
|
|
247
|
+
}
|
|
248
|
+
/** The marks changed: one publication per microtask turn while someone watches or derives from them. */
|
|
249
|
+
#changed() {
|
|
250
|
+
this.#value = undefined;
|
|
251
|
+
if (this.#scheduled || (!this.watched && this.dependents.size === 0))
|
|
252
|
+
return;
|
|
253
|
+
this.#scheduled = true;
|
|
254
|
+
queueMicrotask(() => {
|
|
255
|
+
this.#scheduled = false;
|
|
256
|
+
this.batch.within(() => this.changed(), BACKGROUND_CONTEXT);
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Whether `path` is a directory, never following a link (as the scan of a tree does not); one that cannot be read (gone,
|
|
262
|
+
* a link loop, no access) is none: a watch callback must not throw.
|
|
263
|
+
*/
|
|
264
|
+
function isDirectory(path) {
|
|
265
|
+
try {
|
|
266
|
+
return lstatSync(path, { throwIfNoEntry: false })?.isDirectory() === true;
|
|
267
|
+
}
|
|
268
|
+
catch {
|
|
269
|
+
return false;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
/** `dir` absolute and by its real path; as given (absolute) when it does not exist. */
|
|
273
|
+
function real(dir) {
|
|
274
|
+
try {
|
|
275
|
+
return realpathSync(dir);
|
|
276
|
+
}
|
|
277
|
+
catch {
|
|
278
|
+
return resolve(dir);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=watcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../../src/next-node/plugins/watcher.ts"],"names":[],"mappings":"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","sourcesContent":["// The watcher and its marks (slice 7c §5): `fs.watch` on every directory of the plugin roots and the app's base code,\n// `node_modules` and `.git` never watched (a directory appearing later gets its watch), marks what changed and never\n// applies it. A changed file dirties every plugin whose facets used it (a copied contract every user) or whose directory\n// contains it; a changed `package.json` asks for an install (and for its metadata to be read again); a plugin directory\n// or facet file added or removed asks for discovery again; a file of base code asks the app to restart its hosts. The\n// marks are a JSON watchable; each mark records the generation of its latest change (generations only increase), so a\n// change during a build keeps its mark, however late an older build's rollout clears.\n\nimport { type Dirent, type FSWatcher, lstatSync, readdirSync, realpathSync, watch } from \"node:fs\";\nimport { basename, dirname, join, resolve, sep } from \"node:path\";\nimport { BACKGROUND_CONTEXT, type Context } from \"../../context/index.ts\";\nimport type { JsonValue } from \"../../json.ts\";\nimport { type Batch, Source } from \"../../next/state/internal.ts\";\nimport { type BuiltFacet, inside } from \"./build.ts\";\nimport { type Discovery, FACET_EXTENSIONS } from \"./discover.ts\";\n\n/** The marks: plugins to rebuild, plugins to install, whether to discover again, whether base code changed. */\nexport type PluginsState = {\n\treadonly dirty: readonly string[];\n\treadonly install: readonly string[];\n\treadonly set: boolean;\n\treadonly base: boolean;\n};\n\n/** The generation of each dirty plugin's latest change when a build started: what its rollout may clear. */\nexport type MarkSnapshot = { readonly plugins: ReadonlyMap<string, number> };\n\n/** The generations of the latest change of the plugin set and of a `package.json` when a discovery started. */\nexport type DiscoverySnapshot = { readonly set: number; readonly manifest: number };\n\n/** What the watcher watches and how it reports: the roots, the base code, the facet kinds, a failure to watch. */\nexport type WatcherOptions = {\n\treadonly roots: readonly string[];\n\treadonly base: readonly string[];\n\treadonly kinds: readonly string[];\n\t/** The watcher cannot watch (the system's limit): reported once, after which the app builds on demand. */\n\treadonly failed: (error: unknown) => void;\n};\n\n/** Directories never watched, and changes under them never marked. */\nconst IGNORED = new Set([\"node_modules\", \".git\"]);\n\n/**\n * The watcher and the marks (`state`), a JSON watchable published at most once per microtask turn with changes. It\n * marks for the plugins of the last discovery (`know`) and the files their last builds read (`used`).\n */\nexport class PluginWatcher extends Source {\n\treadonly #options: WatcherOptions;\n\treadonly #roots: readonly string[];\n\treadonly #baseDirs: readonly string[];\n\t/** The trees it watches: the roots, the base code, and plugin directories linked from outside the roots. */\n\treadonly #trees = new Set<string>();\n\t/** Its watches, one per directory of its trees. */\n\treadonly #watchers = new Map<string, FSWatcher>();\n\t/** A failure to watch was reported (once). */\n\t#reported = false;\n\t/** The generation the next change gets: every mark records a newer one than any before it. */\n\t#generation = 1;\n\t/** Each dirty plugin's latest change, by generation. */\n\treadonly #dirty = new Map<string, number>();\n\treadonly #install = new Set<string>();\n\t/** The latest change of the plugin set since the last discovery (0: none). */\n\t#set = 0;\n\t/** The latest change of a known plugin's `package.json` since the last discovery (0: none). */\n\t#manifest = 0;\n\t#baseChanged = false;\n\t#discovery: Discovery = { plugins: [], problems: [] };\n\t/** The files each built facet read (its inputs and copies), by plugin and kind. */\n\treadonly #used = new Map<string, { readonly plugin: string; readonly files: ReadonlySet<string> }>();\n\t#value: JsonValue | undefined;\n\t#scheduled = false;\n\n\tconstructor(options: WatcherOptions, batch: Batch) {\n\t\tsuper(batch);\n\t\tthis.#options = options;\n\t\t// Events name paths under the directories as watched: by their real paths, as discovery names plugins.\n\t\tthis.#roots = options.roots.map(real);\n\t\tthis.#baseDirs = options.base.map(real);\n\t\tfor (const dir of [...this.#roots, ...this.#baseDirs]) this.#watchTree(dir);\n\t}\n\n\tget value(): JsonValue {\n\t\tthis.#value ??= {\n\t\t\tdirty: [...this.#dirty.keys()].sort(),\n\t\t\tinstall: [...this.#install].sort(),\n\t\t\tset: this.#set > 0,\n\t\t\tbase: this.#baseChanged,\n\t\t};\n\t\treturn this.#value;\n\t}\n\n\tdeliver(context: Context): void {\n\t\tconst value = this.value;\n\t\tthis.publish(value, [[\"r\", value]], false, context);\n\t}\n\n\t/** Whether the next build discovers again: the plugin set or a plugin's `package.json` changed. */\n\tget needsDiscovery(): boolean {\n\t\treturn this.#set > 0 || this.#manifest > 0;\n\t}\n\n\t/** What a discovery that starts now has seen. */\n\tdiscoverySnapshot(): DiscoverySnapshot {\n\t\treturn { set: this.#set, manifest: this.#manifest };\n\t}\n\n\t/** The plugins discovery found: marks are for them (a removed one's install clears); the changes it had seen clear. */\n\tknow(discovery: Discovery, seen: DiscoverySnapshot): void {\n\t\tthis.#discovery = discovery;\n\t\tif (this.#set === seen.set) this.#set = 0;\n\t\tif (this.#manifest === seen.manifest) this.#manifest = 0;\n\t\t// A removed plugin has nothing to install (its directory went, its package.json with it).\n\t\tfor (const name of this.#install)\n\t\t\tif (!discovery.plugins.some((plugin) => plugin.name === name)) this.#install.delete(name);\n\t\t// A plugin directory linked from outside the roots: a tree of its own (a symlink is not followed).\n\t\tconst linked = discovery.plugins.filter(({ dir }) => !this.#roots.some((root) => inside(root, dir)));\n\t\tfor (const { dir } of linked) this.#watchTree(dir);\n\t\tfor (const tree of this.#trees) {\n\t\t\tconst kept =\n\t\t\t\tthis.#roots.includes(tree) || this.#baseDirs.includes(tree) || linked.some((each) => each.dir === tree);\n\t\t\tif (!kept) this.#unwatchTree(tree);\n\t\t}\n\t\tthis.#changed();\n\t}\n\n\t/** What `built` facets read: a later change of one of these files dirties their plugins. */\n\tused(built: readonly BuiltFacet[]): void {\n\t\tfor (const facet of built) {\n\t\t\tif (facet.kind !== \"script\") continue;\n\t\t\tconst files = new Set([...facet.inputs.map(({ file }) => file), ...facet.copied]);\n\t\t\tthis.#used.set(`${facet.plugin}\\u0000${facet.facet}`, { plugin: facet.plugin, files });\n\t\t}\n\t}\n\n\t/** The marks a build of `names` starts from: each one's latest change. */\n\tsnapshot(names: Iterable<string>): MarkSnapshot {\n\t\tconst plugins = new Map<string, number>();\n\t\tfor (const name of names) plugins.set(name, this.#dirty.get(name) ?? 0);\n\t\treturn { plugins };\n\t}\n\n\t/** `names` were applied everywhere: their marks clear unless a change came after `snapshot`. */\n\tapplied(names: Iterable<string>, snapshot: MarkSnapshot): void {\n\t\tfor (const name of names) {\n\t\t\tconst latest = this.#dirty.get(name);\n\t\t\tif (latest !== undefined && latest <= (snapshot.plugins.get(name) ?? 0)) this.#dirty.delete(name);\n\t\t}\n\t\tthis.#changed();\n\t}\n\n\t/** Plugin `name`'s dependencies were installed: its install mark clears and it is dirty (its packages changed). */\n\tinstalled(name: string): void {\n\t\tthis.#install.delete(name);\n\t\tthis.#dirty.set(name, this.#generation++);\n\t\tthis.#changed();\n\t}\n\n\t/** Marks what a change of the file or directory at `path` (absolute) asks for. */\n\tmark(path: string): void {\n\t\tif (path.split(sep).some((part) => IGNORED.has(part))) return;\n\t\tif (this.#baseDirs.some((dir) => inside(dir, path))) {\n\t\t\tthis.#baseChanged = true;\n\t\t} else {\n\t\t\tthis.#markPlugin(path, this.#generation++);\n\t\t}\n\t\tthis.#changed();\n\t}\n\n\t/** Stops watching. */\n\tclose(): void {\n\t\tfor (const watcher of this.#watchers.values()) watcher.close();\n\t\tthis.#watchers.clear();\n\t\tthis.#trees.clear();\n\t}\n\n\t/**\n\t * A change under a root, at `generation`: in a plugin's directory, it dirties that plugin (and asks for an install\n\t * and a new reading of its metadata for its `package.json`, for discovery for a facet file at its top); elsewhere\n\t * under a root (a directory added or removed, a directory that is no plugin yet), discovery; every plugin whose\n\t * facets read the file is dirty too.\n\t */\n\t#markPlugin(path: string, generation: number): void {\n\t\tconst plugin = this.#discovery.plugins.find((each) => each.dir === path || inside(each.dir, path));\n\t\tif (plugin === undefined) {\n\t\t\tif (this.#roots.some((root) => inside(root, path))) this.#set = generation;\n\t\t} else if (path === join(plugin.dir, \"package.json\")) {\n\t\t\tthis.#install.add(plugin.name);\n\t\t\tthis.#manifest = generation;\n\t\t} else {\n\t\t\tif (path === plugin.dir || (dirname(path) === plugin.dir && this.#isFacetFile(basename(path)))) {\n\t\t\t\tthis.#set = generation;\n\t\t\t}\n\t\t\tthis.#dirty.set(plugin.name, generation);\n\t\t}\n\t\tfor (const { plugin: user, files } of this.#used.values()) if (files.has(path)) this.#dirty.set(user, generation);\n\t}\n\n\t/** Whether `file` (at a plugin's top) is named as a facet file of one of the app's kinds. */\n\t#isFacetFile(file: string): boolean {\n\t\treturn this.#options.kinds.some((kind) => FACET_EXTENSIONS.some((extension) => file === `${kind}${extension}`));\n\t}\n\n\t/** Watches the tree at `dir` (once): it and every directory under it but ignored ones; a missing one is skipped. */\n\t#watchTree(dir: string): void {\n\t\tif (this.#trees.has(dir)) return;\n\t\tthis.#trees.add(dir);\n\t\tthis.#watchDirs(dir);\n\t}\n\n\t/** Stops watching the tree at `dir`. */\n\t#unwatchTree(dir: string): void {\n\t\tthis.#trees.delete(dir);\n\t\tthis.#unwatchDirs(dir);\n\t}\n\n\t/** Watches `dir` and, walking down, every directory under it but ignored ones (each not watched yet). */\n\t#watchDirs(dir: string): void {\n\t\tif (this.#watchers.has(dir) || this.#reported) return;\n\t\tlet watcher: FSWatcher;\n\t\ttry {\n\t\t\twatcher = watch(dir, (_event, file) => {\n\t\t\t\tif (file !== null) this.#changedIn(join(dir, file));\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code !== \"ENOENT\") this.#failed(error);\n\t\t\treturn;\n\t\t}\n\t\twatcher.on(\"error\", (error) => this.#failed(error));\n\t\tthis.#watchers.set(dir, watcher);\n\t\tlet entries: Dirent[];\n\t\ttry {\n\t\t\tentries = readdirSync(dir, { withFileTypes: true });\n\t\t} catch {\n\t\t\t// Removed meanwhile: its parent's event says so.\n\t\t\treturn;\n\t\t}\n\t\tfor (const entry of entries) {\n\t\t\tif (entry.isDirectory() && !IGNORED.has(entry.name)) this.#watchDirs(join(dir, entry.name));\n\t\t}\n\t}\n\n\t/** An event for `path` in a watched directory: a new directory gets its watches, a removed one loses them; marked. */\n\t#changedIn(path: string): void {\n\t\tconst name = basename(path);\n\t\tif (!IGNORED.has(name)) {\n\t\t\tif (isDirectory(path)) this.#watchDirs(path);\n\t\t\telse if (this.#watchers.has(path)) this.#unwatchDirs(path);\n\t\t}\n\t\tthis.mark(path);\n\t}\n\n\t/** Stops watching `dir` and the directories under it (it was removed, or its tree is not watched any more). */\n\t#unwatchDirs(dir: string): void {\n\t\tfor (const [watched, watcher] of this.#watchers) {\n\t\t\tif (watched !== dir && !inside(dir, watched)) continue;\n\t\t\twatcher.close();\n\t\t\tthis.#watchers.delete(watched);\n\t\t}\n\t}\n\n\t/** Watching failed: reported once; every watch stops (the app builds on demand). */\n\t#failed(error: unknown): void {\n\t\tthis.close();\n\t\tif (this.#reported) return;\n\t\tthis.#reported = true;\n\t\tthis.#options.failed(error);\n\t}\n\n\t/** The marks changed: one publication per microtask turn while someone watches or derives from them. */\n\t#changed(): void {\n\t\tthis.#value = undefined;\n\t\tif (this.#scheduled || (!this.watched && this.dependents.size === 0)) return;\n\t\tthis.#scheduled = true;\n\t\tqueueMicrotask(() => {\n\t\t\tthis.#scheduled = false;\n\t\t\tthis.batch.within(() => this.changed(), BACKGROUND_CONTEXT);\n\t\t});\n\t}\n}\n\n/**\n * Whether `path` is a directory, never following a link (as the scan of a tree does not); one that cannot be read (gone,\n * a link loop, no access) is none: a watch callback must not throw.\n */\nfunction isDirectory(path: string): boolean {\n\ttry {\n\t\treturn lstatSync(path, { throwIfNoEntry: false })?.isDirectory() === true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/** `dir` absolute and by its real path; as given (absolute) when it does not exist. */\nfunction real(dir: string): string {\n\ttry {\n\t\treturn realpathSync(dir);\n\t} catch {\n\t\treturn resolve(dir);\n\t}\n}\n"]}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import type { JsonValue } from "../../json.ts";
|
|
2
|
+
import type { Address } from "../../next/contracts/index.ts";
|
|
3
|
+
import { type FailureCause } from "../../next/data/index.ts";
|
|
4
|
+
import type { ReloadReport } from "../../next/host/index.ts";
|
|
5
|
+
import type { PluginScript } from "../plugins/runtime.ts";
|
|
6
|
+
/** An error as it crosses: its message, and a ChordError's code and reason. */
|
|
7
|
+
export type CrossedError = {
|
|
8
|
+
readonly message: string;
|
|
9
|
+
readonly code?: string;
|
|
10
|
+
readonly reason?: string;
|
|
11
|
+
};
|
|
12
|
+
/** A reload report as it crosses: its errors crossed. */
|
|
13
|
+
export type CrossedReport = {
|
|
14
|
+
readonly plugins: ReloadReport["plugins"];
|
|
15
|
+
readonly failed: readonly {
|
|
16
|
+
readonly plugin: string;
|
|
17
|
+
readonly error: CrossedError;
|
|
18
|
+
}[];
|
|
19
|
+
readonly objects: readonly {
|
|
20
|
+
readonly object: string;
|
|
21
|
+
readonly kind: string;
|
|
22
|
+
readonly cause?: CrossedCause;
|
|
23
|
+
}[];
|
|
24
|
+
};
|
|
25
|
+
/** A failure cause as it crosses. */
|
|
26
|
+
type CrossedCause = {
|
|
27
|
+
readonly kind: FailureCause["kind"];
|
|
28
|
+
readonly error: CrossedError;
|
|
29
|
+
};
|
|
30
|
+
/** What the server sends a worker. */
|
|
31
|
+
export type ToWorker = {
|
|
32
|
+
readonly kind: "start";
|
|
33
|
+
readonly address: Address;
|
|
34
|
+
readonly start: JsonValue;
|
|
35
|
+
readonly scripts: readonly PluginScript[];
|
|
36
|
+
readonly lock: string;
|
|
37
|
+
} | {
|
|
38
|
+
readonly kind: "shutdown";
|
|
39
|
+
} | {
|
|
40
|
+
readonly kind: "reload";
|
|
41
|
+
readonly scripts: readonly PluginScript[];
|
|
42
|
+
};
|
|
43
|
+
/** What a worker sends the server. */
|
|
44
|
+
export type FromWorker = {
|
|
45
|
+
readonly kind: "started";
|
|
46
|
+
} | {
|
|
47
|
+
readonly kind: "ready";
|
|
48
|
+
readonly idle: boolean;
|
|
49
|
+
readonly report: CrossedReport;
|
|
50
|
+
} | {
|
|
51
|
+
readonly kind: "idle";
|
|
52
|
+
readonly idle: boolean;
|
|
53
|
+
} | {
|
|
54
|
+
readonly kind: "fatal";
|
|
55
|
+
readonly error: CrossedError;
|
|
56
|
+
} | {
|
|
57
|
+
readonly kind: "reloaded";
|
|
58
|
+
readonly report: CrossedReport;
|
|
59
|
+
} | {
|
|
60
|
+
readonly kind: "reloaded";
|
|
61
|
+
readonly error: CrossedError;
|
|
62
|
+
};
|
|
63
|
+
/** `message` in its envelope, as it goes over the IPC channel. */
|
|
64
|
+
export declare function envelope(message: ToWorker | FromWorker): {
|
|
65
|
+
readonly [ENVELOPE]: ToWorker | FromWorker;
|
|
66
|
+
};
|
|
67
|
+
/** The envelope's key: a control message is `{ "chord.workers": message }`. */
|
|
68
|
+
declare const ENVELOPE = "chord.workers";
|
|
69
|
+
/**
|
|
70
|
+
* The control message in an IPC message, or `undefined` for anything else (a link frame, the app's own). A trust
|
|
71
|
+
* boundary in name only: both ends are the app's processes, so only the envelope is checked.
|
|
72
|
+
*/
|
|
73
|
+
export declare function controlOf<M extends ToWorker | FromWorker>(message: unknown): M | undefined;
|
|
74
|
+
/** `error` as it crosses. */
|
|
75
|
+
export declare function crossed(error: unknown): CrossedError;
|
|
76
|
+
/** A crossed error as an error again: a ChordError when its code is one, an `Error` otherwise. */
|
|
77
|
+
export declare function uncrossed(error: CrossedError): Error;
|
|
78
|
+
/** `report` as it crosses. */
|
|
79
|
+
export declare function crossedReport(report: ReloadReport): CrossedReport;
|
|
80
|
+
/** A crossed report as a report again. */
|
|
81
|
+
export declare function uncrossedReport(report: CrossedReport): ReloadReport;
|
|
82
|
+
export {};
|
|
83
|
+
//# sourceMappingURL=control.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control.d.ts","sourceRoot":"","sources":["../../../src/next-node/workers/control.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// The control channel between the server and a worker (slice 10 §3): JSON messages beside the link's `Uint8Array`
|
|
2
|
+
// frames on one IPC channel (the IPC link skips them), and errors as they cross it (`{ message, code?, reason? }`,
|
|
3
|
+
// never a stack or a cause).
|
|
4
|
+
import { ChordError, isChordError } from "../../next/data/index.js";
|
|
5
|
+
import { chordErrorFromJson } from "../../next/data/internal.js";
|
|
6
|
+
/** `message` in its envelope, as it goes over the IPC channel. */
|
|
7
|
+
export function envelope(message) {
|
|
8
|
+
return { [ENVELOPE]: message };
|
|
9
|
+
}
|
|
10
|
+
/** The envelope's key: a control message is `{ "chord.workers": message }`. */
|
|
11
|
+
const ENVELOPE = "chord.workers";
|
|
12
|
+
/**
|
|
13
|
+
* The control message in an IPC message, or `undefined` for anything else (a link frame, the app's own). A trust
|
|
14
|
+
* boundary in name only: both ends are the app's processes, so only the envelope is checked.
|
|
15
|
+
*/
|
|
16
|
+
export function controlOf(message) {
|
|
17
|
+
if (typeof message !== "object" || message === null || !(ENVELOPE in message))
|
|
18
|
+
return undefined;
|
|
19
|
+
// Sent by the other end of this channel through `envelope`.
|
|
20
|
+
return message[ENVELOPE];
|
|
21
|
+
}
|
|
22
|
+
/** `error` as it crosses. */
|
|
23
|
+
export function crossed(error) {
|
|
24
|
+
if (isChordError(error)) {
|
|
25
|
+
return {
|
|
26
|
+
message: error.message,
|
|
27
|
+
code: error.code,
|
|
28
|
+
...(error.reason === undefined ? {} : { reason: error.reason }),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
return { message: error instanceof Error ? error.message : String(error) };
|
|
32
|
+
}
|
|
33
|
+
/** A crossed error as an error again: a ChordError when its code is one, an `Error` otherwise. */
|
|
34
|
+
export function uncrossed(error) {
|
|
35
|
+
if (error.code === undefined)
|
|
36
|
+
return new Error(error.message);
|
|
37
|
+
try {
|
|
38
|
+
return chordErrorFromJson({
|
|
39
|
+
code: error.code,
|
|
40
|
+
message: error.message,
|
|
41
|
+
...(error.reason === undefined ? {} : { reason: error.reason }),
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return new Error(error.message);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/** `report` as it crosses. */
|
|
49
|
+
export function crossedReport(report) {
|
|
50
|
+
return {
|
|
51
|
+
plugins: report.plugins,
|
|
52
|
+
failed: report.failed.map(({ plugin, error }) => ({ plugin, error: crossed(error) })),
|
|
53
|
+
objects: report.objects.map((each) => each.kind === "parked"
|
|
54
|
+
? {
|
|
55
|
+
object: each.object,
|
|
56
|
+
kind: each.kind,
|
|
57
|
+
cause: { kind: each.cause.kind, error: crossed(each.cause.error) },
|
|
58
|
+
}
|
|
59
|
+
: each),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/** A crossed report as a report again. */
|
|
63
|
+
export function uncrossedReport(report) {
|
|
64
|
+
return {
|
|
65
|
+
plugins: report.plugins,
|
|
66
|
+
failed: report.failed.map(({ plugin, error }) => ({ plugin, error: uncrossed(error) })),
|
|
67
|
+
objects: report.objects.map(({ object, kind, cause }) => {
|
|
68
|
+
if (cause === undefined)
|
|
69
|
+
return { object, kind: kind };
|
|
70
|
+
const error = uncrossed(cause.error);
|
|
71
|
+
// A parked object's cause is a ChordError on the worker; one that crossed without a code is wrapped as one.
|
|
72
|
+
const chord = isChordError(error) ? error : new ChordError({ code: "unavailable", message: error.message });
|
|
73
|
+
return { object, kind: "parked", cause: { kind: cause.kind, error: chord } };
|
|
74
|
+
}),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=control.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control.js","sourceRoot":"","sources":["../../../src/next-node/workers/control.ts"],"names":[],"mappings":"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","sourcesContent":["// The control channel between the server and a worker (slice 10 §3): JSON messages beside the link's `Uint8Array`\n// frames on one IPC channel (the IPC link skips them), and errors as they cross it (`{ message, code?, reason? }`,\n// never a stack or a cause).\n\nimport type { JsonValue } from \"../../json.ts\";\nimport type { Address } from \"../../next/contracts/index.ts\";\nimport { ChordError, type FailureCause, isChordError } from \"../../next/data/index.ts\";\nimport { chordErrorFromJson } from \"../../next/data/internal.ts\";\nimport type { ReloadReport } from \"../../next/host/index.ts\";\nimport type { PluginScript } from \"../plugins/runtime.ts\";\n\n/** An error as it crosses: its message, and a ChordError's code and reason. */\nexport type CrossedError = { readonly message: string; readonly code?: string; readonly reason?: string };\n\n/** A reload report as it crosses: its errors crossed. */\nexport type CrossedReport = {\n\treadonly plugins: ReloadReport[\"plugins\"];\n\treadonly failed: readonly { readonly plugin: string; readonly error: CrossedError }[];\n\treadonly objects: readonly { readonly object: string; readonly kind: string; readonly cause?: CrossedCause }[];\n};\n\n/** A failure cause as it crosses. */\ntype CrossedCause = { readonly kind: FailureCause[\"kind\"]; readonly error: CrossedError };\n\n/** What the server sends a worker. */\nexport type ToWorker =\n\t| {\n\t\t\treadonly kind: \"start\";\n\t\t\treadonly address: Address;\n\t\t\treadonly start: JsonValue;\n\t\t\treadonly scripts: readonly PluginScript[];\n\t\t\treadonly lock: string;\n\t }\n\t| { readonly kind: \"shutdown\" }\n\t| { readonly kind: \"reload\"; readonly scripts: readonly PluginScript[] };\n\n/** What a worker sends the server. */\nexport type FromWorker =\n\t| { readonly kind: \"started\" }\n\t| { readonly kind: \"ready\"; readonly idle: boolean; readonly report: CrossedReport }\n\t| { readonly kind: \"idle\"; readonly idle: boolean }\n\t| { readonly kind: \"fatal\"; readonly error: CrossedError }\n\t| { readonly kind: \"reloaded\"; readonly report: CrossedReport }\n\t| { readonly kind: \"reloaded\"; readonly error: CrossedError };\n\n/** `message` in its envelope, as it goes over the IPC channel. */\nexport function envelope(message: ToWorker | FromWorker): { readonly [ENVELOPE]: ToWorker | FromWorker } {\n\treturn { [ENVELOPE]: message };\n}\n\n/** The envelope's key: a control message is `{ \"chord.workers\": message }`. */\nconst ENVELOPE = \"chord.workers\";\n\n/**\n * The control message in an IPC message, or `undefined` for anything else (a link frame, the app's own). A trust\n * boundary in name only: both ends are the app's processes, so only the envelope is checked.\n */\nexport function controlOf<M extends ToWorker | FromWorker>(message: unknown): M | undefined {\n\tif (typeof message !== \"object\" || message === null || !(ENVELOPE in message)) return undefined;\n\t// Sent by the other end of this channel through `envelope`.\n\treturn (message as { readonly [ENVELOPE]: M })[ENVELOPE];\n}\n\n/** `error` as it crosses. */\nexport function crossed(error: unknown): CrossedError {\n\tif (isChordError(error)) {\n\t\treturn {\n\t\t\tmessage: error.message,\n\t\t\tcode: error.code,\n\t\t\t...(error.reason === undefined ? {} : { reason: error.reason }),\n\t\t};\n\t}\n\treturn { message: error instanceof Error ? error.message : String(error) };\n}\n\n/** A crossed error as an error again: a ChordError when its code is one, an `Error` otherwise. */\nexport function uncrossed(error: CrossedError): Error {\n\tif (error.code === undefined) return new Error(error.message);\n\ttry {\n\t\treturn chordErrorFromJson({\n\t\t\tcode: error.code,\n\t\t\tmessage: error.message,\n\t\t\t...(error.reason === undefined ? {} : { reason: error.reason }),\n\t\t});\n\t} catch {\n\t\treturn new Error(error.message);\n\t}\n}\n\n/** `report` as it crosses. */\nexport function crossedReport(report: ReloadReport): CrossedReport {\n\treturn {\n\t\tplugins: report.plugins,\n\t\tfailed: report.failed.map(({ plugin, error }) => ({ plugin, error: crossed(error) })),\n\t\tobjects: report.objects.map((each) =>\n\t\t\teach.kind === \"parked\"\n\t\t\t\t? {\n\t\t\t\t\t\tobject: each.object,\n\t\t\t\t\t\tkind: each.kind,\n\t\t\t\t\t\tcause: { kind: each.cause.kind, error: crossed(each.cause.error) },\n\t\t\t\t\t}\n\t\t\t\t: each,\n\t\t),\n\t};\n}\n\n/** A crossed report as a report again. */\nexport function uncrossedReport(report: CrossedReport): ReloadReport {\n\treturn {\n\t\tplugins: report.plugins,\n\t\tfailed: report.failed.map(({ plugin, error }) => ({ plugin, error: uncrossed(error) })),\n\t\tobjects: report.objects.map(({ object, kind, cause }) => {\n\t\t\tif (cause === undefined)\n\t\t\t\treturn { object, kind: kind as Exclude<ReloadReport[\"objects\"][number][\"kind\"], \"parked\"> };\n\t\t\tconst error = uncrossed(cause.error);\n\t\t\t// A parked object's cause is a ChordError on the worker; one that crossed without a code is wrapped as one.\n\t\t\tconst chord = isChordError(error) ? error : new ChordError({ code: \"unavailable\", message: error.message });\n\t\t\treturn { object, kind: \"parked\", cause: { kind: cause.kind, error: chord } as FailureCause };\n\t\t}),\n\t};\n}\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export type { CrossedError } from "./control.ts";
|
|
2
|
+
export { type ProcessLock, processLock } from "./lock.ts";
|
|
3
|
+
export { type WorkerMainOptions, type WorkerPlugins, type WorkerResult, type WorkerStart, workerMain, } from "./main.ts";
|
|
4
|
+
export { createWorkers, type WorkerState, type Workers, type WorkersError, type WorkersOptions, } from "./workers.ts";
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/next-node/workers/index.ts"],"names":[],"mappings":"AAIA,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,KAAK,WAAW,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EACN,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,UAAU,GACV,MAAM,WAAW,CAAC;AACnB,OAAO,EACN,aAAa,EACb,KAAK,WAAW,EAChB,KAAK,OAAO,EACZ,KAAK,YAAY,EACjB,KAAK,cAAc,GACnB,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// Chord v2's workers component (`@earendil-works/chord/next/workers`, slice 10 §3, §4): a forked worker process per
|
|
2
|
+
// address of a host kind, started on demand, stopped when idle, never restarted by itself, its plugins shipped from the
|
|
3
|
+
// server; `workerMain` is the worker's side. Node-only.
|
|
4
|
+
export { processLock } from "./lock.js";
|
|
5
|
+
export { workerMain, } from "./main.js";
|
|
6
|
+
export { createWorkers, } from "./workers.js";
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/next-node/workers/index.ts"],"names":[],"mappings":"AAAA,oHAAoH;AACpH,wHAAwH;AACxH,wDAAwD;AAGxD,OAAO,EAAoB,WAAW,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAKN,UAAU,GACV,MAAM,WAAW,CAAC;AACnB,OAAO,EACN,aAAa,GAKb,MAAM,cAAc,CAAC","sourcesContent":["// Chord v2's workers component (`@earendil-works/chord/next/workers`, slice 10 §3, §4): a forked worker process per\n// address of a host kind, started on demand, stopped when idle, never restarted by itself, its plugins shipped from the\n// server; `workerMain` is the worker's side. Node-only.\n\nexport type { CrossedError } from \"./control.ts\";\nexport { type ProcessLock, processLock } from \"./lock.ts\";\nexport {\n\ttype WorkerMainOptions,\n\ttype WorkerPlugins,\n\ttype WorkerResult,\n\ttype WorkerStart,\n\tworkerMain,\n} from \"./main.ts\";\nexport {\n\tcreateWorkers,\n\ttype WorkerState,\n\ttype Workers,\n\ttype WorkersError,\n\ttype WorkersOptions,\n} from \"./workers.ts\";\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Context } from "../../context/index.ts";
|
|
2
|
+
/** A held lock: `release` frees it (the process's exit does too). */
|
|
3
|
+
export type ProcessLock = {
|
|
4
|
+
release(): Promise<void>;
|
|
5
|
+
};
|
|
6
|
+
/** Where a lock lives: an abstract socket (Linux, Android), a named pipe (Windows) or a socket file (elsewhere). */
|
|
7
|
+
export type LockAddress = {
|
|
8
|
+
readonly kind: "abstract" | "pipe" | "file";
|
|
9
|
+
readonly address: string;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Takes the lock `name`, waiting while another process holds it (until `context` aborts: rejects with its reason).
|
|
13
|
+
* Throws what listening throws besides "in use", and for a stale socket file (macOS, the BSDs) an error naming it.
|
|
14
|
+
*/
|
|
15
|
+
export declare function processLock(name: string, context: Context): Promise<ProcessLock>;
|
|
16
|
+
/**
|
|
17
|
+
* Takes the lock at `lock`, waiting while it is held. A socket file nobody accepts on (a crashed holder's) fails closed:
|
|
18
|
+
* taking it over races another taker (two could both unlink and listen), so the error names the file to remove.
|
|
19
|
+
*/
|
|
20
|
+
export declare function lockAt(lock: LockAddress, context: Context): Promise<ProcessLock>;
|
|
21
|
+
//# sourceMappingURL=lock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock.d.ts","sourceRoot":"","sources":["../../../src/next-node/workers/lock.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEtD,qEAAqE;AACrE,MAAM,MAAM,WAAW,GAAG;IAAE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAC;AAEvD,oHAAoH;AACpH,MAAM,MAAM,WAAW,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpG;;;GAGG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CAQtF;AAED;;;GAGG;AACH,wBAAsB,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CAmCtF"}
|