@indigoai-us/hq-cloud 6.15.76 → 6.15.78
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/dist/bin/sync-runner-worker.d.ts +3 -0
- package/dist/bin/sync-runner-worker.d.ts.map +1 -0
- package/dist/bin/sync-runner-worker.js +88 -0
- package/dist/bin/sync-runner-worker.js.map +1 -0
- package/dist/bin/sync-runner.d.ts +3 -1
- package/dist/bin/sync-runner.d.ts.map +1 -1
- package/dist/bin/sync-runner.js +31 -13
- package/dist/bin/sync-runner.js.map +1 -1
- package/dist/bin/sync-runner.test.js +117 -1
- package/dist/bin/sync-runner.test.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.test.d.ts +2 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/index.test.js +16 -0
- package/dist/index.test.js.map +1 -0
- package/dist/operation-lock.d.ts +31 -28
- package/dist/operation-lock.d.ts.map +1 -1
- package/dist/operation-lock.js +206 -50
- package/dist/operation-lock.js.map +1 -1
- package/dist/operation-lock.test.js +105 -1
- package/dist/operation-lock.test.js.map +1 -1
- package/dist/sync/area-resolver.d.ts +66 -0
- package/dist/sync/area-resolver.d.ts.map +1 -0
- package/dist/sync/area-resolver.js +306 -0
- package/dist/sync/area-resolver.js.map +1 -0
- package/dist/sync/area-resolver.test.d.ts +2 -0
- package/dist/sync/area-resolver.test.d.ts.map +1 -0
- package/dist/sync/area-resolver.test.js +211 -0
- package/dist/sync/area-resolver.test.js.map +1 -0
- package/dist/sync/child-process-sync-worker.d.ts +53 -0
- package/dist/sync/child-process-sync-worker.d.ts.map +1 -0
- package/dist/sync/child-process-sync-worker.js +256 -0
- package/dist/sync/child-process-sync-worker.js.map +1 -0
- package/dist/sync/child-process-sync-worker.test.d.ts +2 -0
- package/dist/sync/child-process-sync-worker.test.d.ts.map +1 -0
- package/dist/sync/child-process-sync-worker.test.js +262 -0
- package/dist/sync/child-process-sync-worker.test.js.map +1 -0
- package/dist/sync/index.d.ts +8 -0
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +4 -0
- package/dist/sync/index.js.map +1 -1
- package/dist/sync/parallel-sync-coordinator.d.ts +77 -0
- package/dist/sync/parallel-sync-coordinator.d.ts.map +1 -0
- package/dist/sync/parallel-sync-coordinator.js +292 -0
- package/dist/sync/parallel-sync-coordinator.js.map +1 -0
- package/dist/sync/parallel-sync-coordinator.test.d.ts +2 -0
- package/dist/sync/parallel-sync-coordinator.test.d.ts.map +1 -0
- package/dist/sync/parallel-sync-coordinator.test.js +303 -0
- package/dist/sync/parallel-sync-coordinator.test.js.map +1 -0
- package/dist/sync/path-leases.d.ts +31 -0
- package/dist/sync/path-leases.d.ts.map +1 -0
- package/dist/sync/path-leases.js +74 -0
- package/dist/sync/path-leases.js.map +1 -0
- package/dist/sync/path-leases.test.d.ts +2 -0
- package/dist/sync/path-leases.test.d.ts.map +1 -0
- package/dist/sync/path-leases.test.js +51 -0
- package/dist/sync/path-leases.test.js.map +1 -0
- package/dist/sync/state-store.d.ts +13 -0
- package/dist/sync/state-store.d.ts.map +1 -1
- package/dist/sync/state-store.js +158 -51
- package/dist/sync/state-store.js.map +1 -1
- package/dist/sync/state-store.test.js +148 -2
- package/dist/sync/state-store.test.js.map +1 -1
- package/dist/sync/sync-work.d.ts +66 -0
- package/dist/sync/sync-work.d.ts.map +1 -0
- package/dist/sync/sync-work.js +11 -0
- package/dist/sync/sync-work.js.map +1 -0
- package/dist/sync/sync-worker-port.d.ts +59 -0
- package/dist/sync/sync-worker-port.d.ts.map +1 -0
- package/dist/sync/sync-worker-port.js +67 -0
- package/dist/sync/sync-worker-port.js.map +1 -0
- package/dist/watcher.d.ts +6 -0
- package/dist/watcher.d.ts.map +1 -1
- package/dist/watcher.js +94 -9
- package/dist/watcher.js.map +1 -1
- package/dist/watcher.test.js +90 -0
- package/dist/watcher.test.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -72,8 +72,8 @@ export { listSignals } from "./signals/list.js";
|
|
|
72
72
|
export { getSignal, SignalNotFoundError } from "./signals/get.js";
|
|
73
73
|
export type { SignalSummary, SignalDocument, ListSignalsOptions, ListSignalsResult, GetSignalOptions, } from "./signals/types.js";
|
|
74
74
|
export { _setSignalsS3Factory, _resetSignalsS3Factory, } from "./signals/internals.js";
|
|
75
|
-
export { CONTENT_HASH_PATTERN, ISO8601_DATETIME_PATTERN, PushEventSchema, PushEventDecodeError, encodePushEvent, decodePushEvent, NoopPushTransport, HttpPushTransport, EVENT_SYNC_LOCAL_DISABLE_ENV_VAR, isEventSyncLocallyDisabled, StaticFlagProvider, } from "./sync/index.js";
|
|
76
|
-
export type { PushEvent, PushEventInput, PushEventDecodeIssue, PushTransport, HttpPushTransportOptions, AuthTokenSource, FetchLike, EventDrivenPushFlagProvider, FlagProviderWarnFn, EnvTenantListFlagProviderOptions, } from "./sync/index.js";
|
|
75
|
+
export { CONTENT_HASH_PATTERN, ISO8601_DATETIME_PATTERN, PushEventSchema, PushEventDecodeError, encodePushEvent, decodePushEvent, NoopPushTransport, HttpPushTransport, EVENT_SYNC_LOCAL_DISABLE_ENV_VAR, isEventSyncLocallyDisabled, StaticFlagProvider, DefaultParallelSyncCoordinator, ChildProcessSyncWorkerAdapter, ChildProcessSyncWorkerError, InlineSyncWorkerAdapter, SYNC_WORKER_PROTOCOL_VERSION, assertSafeWorkerMessage, toWorkerExecuteMessage, } from "./sync/index.js";
|
|
76
|
+
export type { PushEvent, PushEventInput, PushEventDecodeIssue, PushTransport, HttpPushTransportOptions, AuthTokenSource, FetchLike, EventDrivenPushFlagProvider, FlagProviderWarnFn, EnvTenantListFlagProviderOptions, AreaId, ChildProcessSyncWorkerOptions, ChildWorkerIdentity, CanonicalPath, ChoreSyncWork, CoordinatorClock, CoordinatorSnapshot, InlineSyncWorkerHandler, ParallelSyncCoordinator, ParallelSyncCoordinatorOptions, PathIdentity, PathWorkOutcome, RealtimeSyncWork, ReconcileCursor, ScheduledPath, SyncWork, SyncWorkerAdapter, SyncWorkerClass, SyncWorkerTarget, WorkerChildMessage, WorkerExecuteMessage, WorkerParentMessage, WorkerProgressMessage, WorkerWorkSlice, WorkOutcome, WorkPathStatus, WorkSlice, } from "./sync/index.js";
|
|
77
77
|
export { PushEventEmitter } from "./watcher.js";
|
|
78
78
|
export type { PushEventEmitterOptions, TreeChangeBatch, TreeChangeListener, } from "./watcher.js";
|
|
79
79
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,GACf,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,UAAU,EACV,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,UAAU,GACX,MAAM,SAAS,CAAC;AAEjB,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAExD,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClF,YAAY,EACV,qBAAqB,EACrB,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,WAAW,EACX,cAAc,EAId,WAAW,EACX,YAAY,EAEZ,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,uBAAuB,EAMvB,2BAA2B,EAC3B,2BAA2B,GAC5B,MAAM,cAAc,CAAC;AAEtB,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAInD,OAAO,EACL,0BAA0B,EAC1B,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAG/D,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,sBAAsB,EACtB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,uBAAuB,EACvB,0BAA0B,GAC3B,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,oBAAoB,EACpB,eAAe,EACf,yBAAyB,EACzB,qBAAqB,EACrB,sBAAsB,EACtB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,WAAW,EACX,iBAAiB,EACjB,aAAa,EACb,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,YAAY,EACZ,wBAAwB,EACxB,uBAAuB,EACvB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,UAAU,GACX,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,sBAAsB,EACtB,mCAAmC,EACnC,UAAU,EACV,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,iBAAiB,EACjB,aAAa,EACb,YAAY,GACb,MAAM,mBAAmB,CAAC;AAO3B,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvE,OAAO,EACL,iCAAiC,EACjC,qCAAqC,EACrC,sBAAsB,EACtB,qBAAqB,EACrB,yBAAyB,EACzB,6BAA6B,EAC7B,6BAA6B,EAC7B,2BAA2B,GAC5B,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAIhE,OAAO,EACL,iCAAiC,EACjC,uBAAuB,EACvB,2BAA2B,EAC3B,mCAAmC,GACpC,MAAM,gCAAgC,CAAC;AACxC,YAAY,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAG7E,OAAO,EAAE,WAAW,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,0BAA0B,EAC1B,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,UAAU,EACV,yBAAyB,EACzB,0BAA0B,EAC1B,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EACtB,UAAU,EACV,iBAAiB,EACjB,sBAAsB,EACtB,oBAAoB,EACpB,2BAA2B,EAC3B,oBAAoB,EACpB,2BAA2B,EAE3B,QAAQ,EACR,oBAAoB,EACpB,4BAA4B,EAC5B,aAAa,GACd,MAAM,mBAAmB,CAAC;AAK3B,OAAO,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACtE,YAAY,EACV,uBAAuB,EACvB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,gBAAgB,CAAC;AAIxB,OAAO,EACL,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,oBAAoB,EACpB,yBAAyB,EACzB,eAAe,EACf,cAAc,EACd,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAK/B,OAAO,EACL,4BAA4B,EAC5B,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,4BAA4B,EAC5B,2BAA2B,EAC3B,UAAU,EACV,2BAA2B,GAC5B,MAAM,sBAAsB,CAAC;AAG9B,YAAY,EACV,UAAU,EACV,SAAS,EACT,cAAc,EACd,eAAe,EACf,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAG3B,YAAY,EACV,WAAW,EACX,cAAc,EACd,SAAS,EACT,UAAU,EACV,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EACL,6BAA6B,EAC7B,8BAA8B,GAC/B,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,YAAY,EACZ,WAAW,EACX,qBAAqB,EACrB,+BAA+B,EAC/B,WAAW,EACX,UAAU,EACV,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC3D,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAGzF,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC1G,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACpD,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAIpE,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAGpE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACzD,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAIlE,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAC/D,YAAY,EACV,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,WAAW,GACZ,MAAM,gBAAgB,CAAC;AAExB,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,UAAU,EACV,UAAU,EACV,WAAW,EACX,YAAY,EACZ,WAAW,EACX,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,WAAW,GACZ,MAAM,YAAY,CAAC;AAIpB,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,yBAAyB,EACzB,iBAAiB,GAClB,MAAM,8BAA8B,CAAC;AACtC,YAAY,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,2BAA2B,CAAC;AACnC,YAAY,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAG5D,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG5D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAClE,YAAY,EACV,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EACL,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAClE,YAAY,EACV,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EACL,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,wBAAwB,CAAC;AAIhC,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,eAAe,EACf,oBAAoB,EACpB,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,gCAAgC,EAChC,0BAA0B,EAC1B,kBAAkB,EAClB,8BAA8B,EAC9B,6BAA6B,EAC7B,2BAA2B,EAC3B,uBAAuB,EACvB,4BAA4B,EAC5B,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,SAAS,EACT,cAAc,EACd,oBAAoB,EACpB,aAAa,EACb,wBAAwB,EACxB,eAAe,EACf,SAAS,EACT,2BAA2B,EAC3B,kBAAkB,EAClB,gCAAgC,EAChC,MAAM,EACN,6BAA6B,EAC7B,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,uBAAuB,EACvB,uBAAuB,EACvB,8BAA8B,EAC9B,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,QAAQ,EACR,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,eAAe,EACf,WAAW,EACX,cAAc,EACd,SAAS,GACV,MAAM,iBAAiB,CAAC;AAIzB,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,YAAY,EACV,uBAAuB,EACvB,eAAe,EACf,kBAAkB,GACnB,MAAM,cAAc,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -95,7 +95,7 @@ export { getSignal, SignalNotFoundError } from "./signals/get.js";
|
|
|
95
95
|
export { _setSignalsS3Factory, _resetSignalsS3Factory, } from "./signals/internals.js";
|
|
96
96
|
// Event-driven sync — PushEvent wire contract + PushTransport shipping seam
|
|
97
97
|
// (ported from hq-pro PR #112 per project event-driven-sync-menubar US-007).
|
|
98
|
-
export { CONTENT_HASH_PATTERN, ISO8601_DATETIME_PATTERN, PushEventSchema, PushEventDecodeError, encodePushEvent, decodePushEvent, NoopPushTransport, HttpPushTransport, EVENT_SYNC_LOCAL_DISABLE_ENV_VAR, isEventSyncLocallyDisabled, StaticFlagProvider, } from "./sync/index.js";
|
|
98
|
+
export { CONTENT_HASH_PATTERN, ISO8601_DATETIME_PATTERN, PushEventSchema, PushEventDecodeError, encodePushEvent, decodePushEvent, NoopPushTransport, HttpPushTransport, EVENT_SYNC_LOCAL_DISABLE_ENV_VAR, isEventSyncLocallyDisabled, StaticFlagProvider, DefaultParallelSyncCoordinator, ChildProcessSyncWorkerAdapter, ChildProcessSyncWorkerError, InlineSyncWorkerAdapter, SYNC_WORKER_PROTOCOL_VERSION, assertSafeWorkerMessage, toWorkerExecuteMessage, } from "./sync/index.js";
|
|
99
99
|
// US-008 — watcher PushEvent emitter (bridges TreeWatcher → PushTransport,
|
|
100
100
|
// flag-gated, failure-safe).
|
|
101
101
|
export { PushEventEmitter } from "./watcher.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,GACf,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,UAAU,EACV,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,UAAU,GACX,MAAM,SAAS,CAAC;AAIjB,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAalF,OAAO,EACL,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,WAAW,EACX,cAAc;AACd,4EAA4E;AAC5E,iEAAiE;AACjE,yEAAyE;AACzE,WAAW,EACX,YAAY;AACZ,sBAAsB;AACtB,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,uBAAuB;AACvB,6EAA6E;AAC7E,2EAA2E;AAC3E,sEAAsE;AACtE,6EAA6E;AAC7E,yEAAyE;AACzE,2BAA2B,EAC3B,2BAA2B,GAC5B,MAAM,cAAc,CAAC;AAItB,8EAA8E;AAC9E,uEAAuE;AACvE,OAAO,EACL,0BAA0B,EAC1B,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAG5B,oCAAoC;AACpC,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,sBAAsB,EACtB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAO9B,gDAAgD;AAChD,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,uBAAuB,EACvB,0BAA0B,GAC3B,MAAM,mBAAmB,CAAC;AAW3B,qDAAqD;AACrD,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,WAAW,EACX,iBAAiB,EACjB,aAAa,EACb,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAY1B,OAAO,EACL,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AAErB,gCAAgC;AAChC,OAAO,EACL,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,sBAAsB,EACtB,mCAAmC,EACnC,UAAU,EACV,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAO3B,+EAA+E;AAC/E,kFAAkF;AAClF,gFAAgF;AAChF,gFAAgF;AAChF,aAAa;AACb,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,sBAAsB,CAAC;AAG9B,6EAA6E;AAC7E,OAAO,EACL,iCAAiC,EACjC,qCAAqC,EACrC,sBAAsB,EACtB,qBAAqB,EACrB,yBAAyB,EACzB,6BAA6B,EAC7B,6BAA6B,EAC7B,2BAA2B,GAC5B,MAAM,qBAAqB,CAAC;AAG7B,2EAA2E;AAC3E,kEAAkE;AAClE,OAAO,EACL,iCAAiC,EACjC,uBAAuB,EACvB,2BAA2B,EAC3B,mCAAmC,GACpC,MAAM,gCAAgC,CAAC;AAGxC,0BAA0B;AAC1B,OAAO,EAAE,WAAW,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,0BAA0B,EAC1B,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AA8B3B,8EAA8E;AAC9E,4EAA4E;AAC5E,2DAA2D;AAC3D,OAAO,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAOtE,yEAAyE;AACzE,yEAAyE;AACzE,OAAO,EACL,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAS/B,4EAA4E;AAC5E,0EAA0E;AAC1E,2EAA2E;AAC3E,OAAO,EACL,4BAA4B,EAC5B,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AA0B9B,eAAe;AACf,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EACL,6BAA6B,EAC7B,8BAA8B,GAC/B,MAAM,gBAAgB,CAAC;AAUxB,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG3D,kCAAkC;AAClC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEpD,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAGzC,8EAA8E;AAC9E,iFAAiF;AACjF,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAGzC,gFAAgF;AAChF,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGzD,4EAA4E;AAC5E,kDAAkD;AAClD,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAwB/D,2EAA2E;AAC3E,0EAA0E;AAC1E,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;AAE1B,6CAA6C;AAC7C,OAAO,EACL,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,yBAAyB,EACzB,iBAAiB,GAClB,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,2BAA2B,CAAC;AAGnC,yDAAyD;AACzD,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,sBAAsB,CAAC;AAG9B,uBAAuB;AACvB,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AASlE,oEAAoE;AACpE,sDAAsD;AACtD,OAAO,EACL,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,wBAAwB,CAAC;AAEhC,uBAAuB;AACvB,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AASlE,oEAAoE;AACpE,sDAAsD;AACtD,OAAO,EACL,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,wBAAwB,CAAC;AAEhC,4EAA4E;AAC5E,6EAA6E;AAC7E,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,eAAe,EACf,oBAAoB,EACpB,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,gCAAgC,EAChC,0BAA0B,EAC1B,kBAAkB,EAClB,8BAA8B,EAC9B,6BAA6B,EAC7B,2BAA2B,EAC3B,uBAAuB,EACvB,4BAA4B,EAC5B,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AAyCzB,2EAA2E;AAC3E,6BAA6B;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { DefaultParallelSyncCoordinator } from "./index.js";
|
|
3
|
+
describe("package entry point", () => {
|
|
4
|
+
it("exports the parallel sync coordinator and semantic work contract", () => {
|
|
5
|
+
const work = {
|
|
6
|
+
class: "realtime",
|
|
7
|
+
source: "watcher",
|
|
8
|
+
direction: "push",
|
|
9
|
+
paths: ["notes/today"],
|
|
10
|
+
causality: "entry-point-test",
|
|
11
|
+
};
|
|
12
|
+
expect(DefaultParallelSyncCoordinator).toBeTypeOf("function");
|
|
13
|
+
expect(work.class).toBe("realtime");
|
|
14
|
+
});
|
|
15
|
+
});
|
|
16
|
+
//# sourceMappingURL=index.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,8BAA8B,EAAiB,MAAM,YAAY,CAAC;AAE3E,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,IAAI,GAAa;YACrB,KAAK,EAAE,UAAU;YACjB,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,MAAM;YACjB,KAAK,EAAE,CAAC,aAAa,CAAC;YACtB,SAAS,EAAE,kBAAkB;SAC9B,CAAC;QAEF,MAAM,CAAC,8BAA8B,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAC9D,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/operation-lock.d.ts
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Per-HQ-root
|
|
3
|
-
*
|
|
2
|
+
* Per-HQ-root operation gate for long-running operations (`sync`, `rescue`,
|
|
3
|
+
* `reindex`).
|
|
4
4
|
*
|
|
5
5
|
* Contract:
|
|
6
|
-
* - `sync`
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
6
|
+
* - Normal `sync` processes publish distinct shared worker memberships. This
|
|
7
|
+
* lets workers mutate independent paths concurrently. `rescue` (and a
|
|
8
|
+
* format-changing migration) take the same per-root gate exclusively: its
|
|
9
|
+
* queued writer intent stops later shared admissions, then it waits for the
|
|
10
|
+
* already-admitted worker PIDs to leave. Different HQ roots are independent.
|
|
10
11
|
* - `reindex` uses a SEPARATE per-root scope ("reindex"), so it is guarded
|
|
11
12
|
* against other reindexes but is NOT blocked by a held sync/rescue lock.
|
|
12
13
|
* This is deliberate: a watch-mode `hq-sync-runner` holds the "operation"
|
|
@@ -22,7 +23,8 @@
|
|
|
22
23
|
*
|
|
23
24
|
* ## Where the lock lives — and why
|
|
24
25
|
*
|
|
25
|
-
* `<stateDir>/locks/operation-<hash(canonicalRoot)>.lock`,
|
|
26
|
+
* `<stateDir>/locks/operation-<hash(canonicalRoot)>.lock`, plus short-lived
|
|
27
|
+
* admission, writer-intent, and per-PID membership siblings, where
|
|
26
28
|
* `stateDir = $HQ_STATE_DIR || ~/.hq`. This is deliberately NOT inside the HQ
|
|
27
29
|
* root:
|
|
28
30
|
* - It must never round-trip to the cloud. A lock is machine-local, per-run
|
|
@@ -38,12 +40,11 @@
|
|
|
38
40
|
*
|
|
39
41
|
* ## Atomicity, liveness, takeover
|
|
40
42
|
*
|
|
41
|
-
* -
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
* EEXIST we test the recorded PID with `process.kill(pid, 0)`:
|
|
43
|
+
* - Every gate record is fully written to a same-directory temp file, fsynced,
|
|
44
|
+
* and published with create-if-absent semantics. The short admission record
|
|
45
|
+
* serializes only membership transitions, never a sync pass or network I/O.
|
|
46
|
+
* - Gate records carry `{ pid, command, startedAt, hqRoot, mode }`. On an
|
|
47
|
+
* existing record we test its PID with `process.kill(pid, 0)`:
|
|
47
48
|
* * ESRCH → the holder is gone (crashed / killed -9 / stale file) →
|
|
48
49
|
* reclaim the lock IMMEDIATELY (a dead holder never makes us
|
|
49
50
|
* wait).
|
|
@@ -97,8 +98,8 @@
|
|
|
97
98
|
* - Normal exit: the `with*` wrappers release in a `finally`.
|
|
98
99
|
* - Signals (SIGINT/SIGTERM): a one-time handler releases every held lock,
|
|
99
100
|
* then re-raises the default disposition so exit status is unchanged.
|
|
100
|
-
* - Hard crash (SIGKILL / power loss): nothing runs, but
|
|
101
|
-
*
|
|
101
|
+
* - Hard crash (SIGKILL / power loss): nothing runs, but a later gate
|
|
102
|
+
* contender reclaims dead exclusive owners and dead shared memberships.
|
|
102
103
|
* - `process.on("exit")`: a final best-effort synchronous unlink.
|
|
103
104
|
*
|
|
104
105
|
* ## Escape hatch
|
|
@@ -121,7 +122,16 @@ export interface LockInfo {
|
|
|
121
122
|
startedAt: string;
|
|
122
123
|
/** Canonical HQ root the lock guards (diagnostic only). */
|
|
123
124
|
hqRoot: string;
|
|
125
|
+
/** Gate role. Omitted payloads are legacy exclusive mutex holders. */
|
|
126
|
+
mode?: OperationLockMode;
|
|
124
127
|
}
|
|
128
|
+
/**
|
|
129
|
+
* Normal sync processes hold shared membership. Repair and migration callers
|
|
130
|
+
* hold exclusive ownership. The explicit option is primarily for callers whose
|
|
131
|
+
* command is not named `sync`; the historical API continues to classify the
|
|
132
|
+
* `sync` command as shared and every other command as exclusive.
|
|
133
|
+
*/
|
|
134
|
+
export type OperationLockMode = "shared" | "exclusive";
|
|
125
135
|
/** Thrown by `acquireOperationLock` when a LIVE holder owns the lock. */
|
|
126
136
|
export declare class OperationLockedError extends Error {
|
|
127
137
|
readonly holder: LockInfo;
|
|
@@ -195,6 +205,8 @@ export interface AcquireOptions {
|
|
|
195
205
|
* against other reindexes without being blocked by a held sync/rescue lock.
|
|
196
206
|
*/
|
|
197
207
|
scope?: string;
|
|
208
|
+
/** Override the command-derived gate role for this acquisition. */
|
|
209
|
+
mode?: OperationLockMode;
|
|
198
210
|
}
|
|
199
211
|
/**
|
|
200
212
|
* Default lock scope. `sync` and `rescue` share this one so they stay mutually
|
|
@@ -222,20 +234,11 @@ export declare function lockPathFor(hqRoot: string, scope?: string): string;
|
|
|
222
234
|
* `fs.openSync` (see operation-lock.test.ts, HQ-CLI-2).
|
|
223
235
|
*/
|
|
224
236
|
export declare function rethrowLockCreateError(err: unknown, lockDir: string): never;
|
|
225
|
-
/**
|
|
226
|
-
*
|
|
227
|
-
* {@link LockHandle} on success. Against a LIVE holder it WAITS by default
|
|
228
|
-
* (polling, blocking the thread) and acquires the moment the holder releases;
|
|
229
|
-
* pass `timeoutSec`/`wait` (or set `HQ_OP_LOCK_TIMEOUT`) to bound or disable the
|
|
230
|
-
* wait — on expiry it throws {@link OperationLockedError}. A stale lock (dead
|
|
231
|
-
* holder) is reclaimed immediately, never waited on.
|
|
232
|
-
*/
|
|
237
|
+
/** Acquire the operation gate synchronously. Watch-loop probes always pass a
|
|
238
|
+
* zero timeout; all wait-capable parent paths use the async counterpart below. */
|
|
233
239
|
export declare function acquireOperationLock(hqRoot: string, command: string, opts?: AcquireOptions): LockHandle;
|
|
234
|
-
/**
|
|
235
|
-
*
|
|
236
|
-
* the wait yields the event loop (via `setTimeout`) instead of blocking the
|
|
237
|
-
* thread — required for the async `sync` runner.
|
|
238
|
-
*/
|
|
240
|
+
/** Async gate acquisition. This is the only wait-capable path used by the
|
|
241
|
+
* parent watch loop, so maintenance waits never block watcher heartbeats. */
|
|
239
242
|
export declare function acquireOperationLockAsync(hqRoot: string, command: string, opts?: AcquireOptions): Promise<LockHandle>;
|
|
240
243
|
/** Run `fn` while holding the per-root lock for `command` (async). */
|
|
241
244
|
export declare function withOperationLock<T>(hqRoot: string, command: string, fn: () => Promise<T>, opts?: AcquireOptions): Promise<T>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operation-lock.d.ts","sourceRoot":"","sources":["../src/operation-lock.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"operation-lock.d.ts","sourceRoot":"","sources":["../src/operation-lock.ts"],"names":[],"mappings":"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"}
|
package/dist/operation-lock.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Per-HQ-root
|
|
3
|
-
*
|
|
2
|
+
* Per-HQ-root operation gate for long-running operations (`sync`, `rescue`,
|
|
3
|
+
* `reindex`).
|
|
4
4
|
*
|
|
5
5
|
* Contract:
|
|
6
|
-
* - `sync`
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
6
|
+
* - Normal `sync` processes publish distinct shared worker memberships. This
|
|
7
|
+
* lets workers mutate independent paths concurrently. `rescue` (and a
|
|
8
|
+
* format-changing migration) take the same per-root gate exclusively: its
|
|
9
|
+
* queued writer intent stops later shared admissions, then it waits for the
|
|
10
|
+
* already-admitted worker PIDs to leave. Different HQ roots are independent.
|
|
10
11
|
* - `reindex` uses a SEPARATE per-root scope ("reindex"), so it is guarded
|
|
11
12
|
* against other reindexes but is NOT blocked by a held sync/rescue lock.
|
|
12
13
|
* This is deliberate: a watch-mode `hq-sync-runner` holds the "operation"
|
|
@@ -22,7 +23,8 @@
|
|
|
22
23
|
*
|
|
23
24
|
* ## Where the lock lives — and why
|
|
24
25
|
*
|
|
25
|
-
* `<stateDir>/locks/operation-<hash(canonicalRoot)>.lock`,
|
|
26
|
+
* `<stateDir>/locks/operation-<hash(canonicalRoot)>.lock`, plus short-lived
|
|
27
|
+
* admission, writer-intent, and per-PID membership siblings, where
|
|
26
28
|
* `stateDir = $HQ_STATE_DIR || ~/.hq`. This is deliberately NOT inside the HQ
|
|
27
29
|
* root:
|
|
28
30
|
* - It must never round-trip to the cloud. A lock is machine-local, per-run
|
|
@@ -38,12 +40,11 @@
|
|
|
38
40
|
*
|
|
39
41
|
* ## Atomicity, liveness, takeover
|
|
40
42
|
*
|
|
41
|
-
* -
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
* EEXIST we test the recorded PID with `process.kill(pid, 0)`:
|
|
43
|
+
* - Every gate record is fully written to a same-directory temp file, fsynced,
|
|
44
|
+
* and published with create-if-absent semantics. The short admission record
|
|
45
|
+
* serializes only membership transitions, never a sync pass or network I/O.
|
|
46
|
+
* - Gate records carry `{ pid, command, startedAt, hqRoot, mode }`. On an
|
|
47
|
+
* existing record we test its PID with `process.kill(pid, 0)`:
|
|
47
48
|
* * ESRCH → the holder is gone (crashed / killed -9 / stale file) →
|
|
48
49
|
* reclaim the lock IMMEDIATELY (a dead holder never makes us
|
|
49
50
|
* wait).
|
|
@@ -97,8 +98,8 @@
|
|
|
97
98
|
* - Normal exit: the `with*` wrappers release in a `finally`.
|
|
98
99
|
* - Signals (SIGINT/SIGTERM): a one-time handler releases every held lock,
|
|
99
100
|
* then re-raises the default disposition so exit status is unchanged.
|
|
100
|
-
* - Hard crash (SIGKILL / power loss): nothing runs, but
|
|
101
|
-
*
|
|
101
|
+
* - Hard crash (SIGKILL / power loss): nothing runs, but a later gate
|
|
102
|
+
* contender reclaims dead exclusive owners and dead shared memberships.
|
|
102
103
|
* - `process.on("exit")`: a final best-effort synchronous unlink.
|
|
103
104
|
*
|
|
104
105
|
* ## Escape hatch
|
|
@@ -127,9 +128,9 @@ export class OperationLockedError extends Error {
|
|
|
127
128
|
`running for this HQ root — "${holder.command}" (pid ${holder.pid}, ` +
|
|
128
129
|
`started ${holder.startedAt}). Wait for it to finish, or stop that ` +
|
|
129
130
|
`process, then retry.`);
|
|
131
|
+
this.name = "OperationLockedError";
|
|
130
132
|
this.holder = holder;
|
|
131
133
|
this.attempted = attempted;
|
|
132
|
-
this.name = "OperationLockedError";
|
|
133
134
|
}
|
|
134
135
|
}
|
|
135
136
|
/**
|
|
@@ -155,9 +156,9 @@ export class OperationLockUnwritableError extends Error {
|
|
|
155
156
|
`it writable (e.g. "sudo chown -R $(whoami) ~/.hq"), or point HQ at a ` +
|
|
156
157
|
`writable state directory with HQ_STATE_DIR=<dir>. To bypass the lock for ` +
|
|
157
158
|
`a single run (drops concurrency protection), set HQ_DISABLE_OP_LOCK=1.`);
|
|
159
|
+
this.name = "OperationLockUnwritableError";
|
|
158
160
|
this.lockDir = lockDir;
|
|
159
161
|
this.cause = cause;
|
|
160
|
-
this.name = "OperationLockUnwritableError";
|
|
161
162
|
}
|
|
162
163
|
}
|
|
163
164
|
/** Default poll interval while waiting on a live holder. */
|
|
@@ -278,6 +279,12 @@ function readLockInfo(p) {
|
|
|
278
279
|
function waiterPrefixFor(p) {
|
|
279
280
|
return `${path.basename(p)}.wait-`;
|
|
280
281
|
}
|
|
282
|
+
function sharedMemberPrefixFor(p) {
|
|
283
|
+
return `${path.basename(p)}.shared-`;
|
|
284
|
+
}
|
|
285
|
+
function admissionPathFor(p) {
|
|
286
|
+
return `${p}.admission`;
|
|
287
|
+
}
|
|
281
288
|
/** Publish this process's wait intent before it starts racing for the mutex. */
|
|
282
289
|
function registerWaiter(p, payload) {
|
|
283
290
|
const waiterPath = `${p}.wait-${process.pid}-${crypto.randomBytes(6).toString("hex")}`;
|
|
@@ -371,12 +378,12 @@ function installHooksOnce() {
|
|
|
371
378
|
hooksInstalled = true;
|
|
372
379
|
process.on("exit", () => {
|
|
373
380
|
for (const h of heldLocks)
|
|
374
|
-
|
|
381
|
+
h.release();
|
|
375
382
|
});
|
|
376
383
|
for (const sig of ["SIGINT", "SIGTERM", "SIGHUP"]) {
|
|
377
384
|
process.on(sig, () => {
|
|
378
385
|
for (const h of heldLocks)
|
|
379
|
-
|
|
386
|
+
h.release();
|
|
380
387
|
// Re-raise with the default disposition so the exit status is the normal
|
|
381
388
|
// signal status (and a second Ctrl-C still works). Removing our listener
|
|
382
389
|
// first avoids recursing back into this handler.
|
|
@@ -386,10 +393,14 @@ function installHooksOnce() {
|
|
|
386
393
|
}
|
|
387
394
|
}
|
|
388
395
|
function makeHandle(p, info) {
|
|
396
|
+
let released = false;
|
|
389
397
|
const handle = {
|
|
390
398
|
path: p,
|
|
391
399
|
info,
|
|
392
400
|
release() {
|
|
401
|
+
if (released)
|
|
402
|
+
return;
|
|
403
|
+
released = true;
|
|
393
404
|
heldLocks.delete(handle);
|
|
394
405
|
unlinkIfOwned(p);
|
|
395
406
|
},
|
|
@@ -433,7 +444,7 @@ export function rethrowLockCreateError(err, lockDir) {
|
|
|
433
444
|
throw err;
|
|
434
445
|
}
|
|
435
446
|
/** Build the lock payload + ensure the locks dir exists. */
|
|
436
|
-
function prepareLock(hqRoot, command, scope = DEFAULT_LOCK_SCOPE) {
|
|
447
|
+
function prepareLock(hqRoot, command, scope = DEFAULT_LOCK_SCOPE, mode) {
|
|
437
448
|
const p = lockPathFor(hqRoot, scope);
|
|
438
449
|
const dir = path.dirname(p);
|
|
439
450
|
try {
|
|
@@ -449,6 +460,7 @@ function prepareLock(hqRoot, command, scope = DEFAULT_LOCK_SCOPE) {
|
|
|
449
460
|
command,
|
|
450
461
|
startedAt: new Date().toISOString(),
|
|
451
462
|
hqRoot: canonicalRoot(hqRoot),
|
|
463
|
+
mode,
|
|
452
464
|
};
|
|
453
465
|
return { p, info, payload: JSON.stringify(info, null, 2) };
|
|
454
466
|
}
|
|
@@ -552,33 +564,184 @@ function tryAcquireOnce(p, info, payload) {
|
|
|
552
564
|
function remainingMs(deadline) {
|
|
553
565
|
return deadline === null ? Infinity : deadline - Date.now();
|
|
554
566
|
}
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
567
|
+
function operationMode(command, opts) {
|
|
568
|
+
return opts.mode ?? (command === "sync" ? "shared" : "exclusive");
|
|
569
|
+
}
|
|
570
|
+
/** Legacy payloads had no mode and were mutex holders, so keep them exclusive. */
|
|
571
|
+
function isSharedMarker(info) {
|
|
572
|
+
return info?.mode === "shared";
|
|
573
|
+
}
|
|
574
|
+
function existingExclusiveBlocker(p) {
|
|
575
|
+
const marker = readLockInfo(p);
|
|
576
|
+
if (marker && !isSharedMarker(marker)) {
|
|
577
|
+
if (pidAlive(marker.pid))
|
|
578
|
+
return marker;
|
|
579
|
+
try {
|
|
580
|
+
fs.unlinkSync(p);
|
|
581
|
+
}
|
|
582
|
+
catch {
|
|
583
|
+
/* a contender replaced or reclaimed it; the next pass re-evaluates */
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
if (!marker && fs.existsSync(p))
|
|
587
|
+
return initializingLockInfo(p);
|
|
588
|
+
return findLiveWaiter(p);
|
|
589
|
+
}
|
|
590
|
+
/** Read the worker leases, deleting only leases whose owning PID is dead. */
|
|
591
|
+
function liveSharedMembers(p) {
|
|
592
|
+
const dir = path.dirname(p);
|
|
593
|
+
const prefix = sharedMemberPrefixFor(p);
|
|
594
|
+
let entries;
|
|
595
|
+
try {
|
|
596
|
+
entries = fs.readdirSync(dir).filter((entry) => entry.startsWith(prefix));
|
|
597
|
+
}
|
|
598
|
+
catch (err) {
|
|
599
|
+
if (err?.code === "ENOENT")
|
|
600
|
+
return [];
|
|
601
|
+
throw err;
|
|
602
|
+
}
|
|
603
|
+
const members = [];
|
|
604
|
+
for (const entry of entries) {
|
|
605
|
+
const memberPath = path.join(dir, entry);
|
|
606
|
+
const member = readLockInfo(memberPath);
|
|
607
|
+
const encodedPid = Number(entry.slice(prefix.length).split("-", 1)[0]);
|
|
608
|
+
const pid = member?.pid ?? encodedPid;
|
|
609
|
+
if (pidAlive(pid)) {
|
|
610
|
+
members.push(member ?? initializingLockInfo(memberPath));
|
|
611
|
+
continue;
|
|
612
|
+
}
|
|
613
|
+
try {
|
|
614
|
+
fs.unlinkSync(memberPath);
|
|
615
|
+
}
|
|
616
|
+
catch {
|
|
617
|
+
/* another process already cleaned this dead membership */
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
return members;
|
|
621
|
+
}
|
|
622
|
+
function makeSharedHandle(p, memberPath, info) {
|
|
623
|
+
let released = false;
|
|
624
|
+
const handle = {
|
|
625
|
+
// Keep the historical path observable for callers and diagnostics. The
|
|
626
|
+
// distinct member file, rather than this marker, owns one worker lease.
|
|
627
|
+
path: p,
|
|
628
|
+
info,
|
|
629
|
+
release() {
|
|
630
|
+
if (released)
|
|
631
|
+
return;
|
|
632
|
+
released = true;
|
|
633
|
+
heldLocks.delete(handle);
|
|
634
|
+
unlinkIfOwned(memberPath);
|
|
635
|
+
// Marker cleanup is cosmetic and happens behind the short admission
|
|
636
|
+
// turnstile. A failed opportunistic cleanup is safe: the next admission
|
|
637
|
+
// or exclusive attempt observes zero live members and removes it.
|
|
638
|
+
const admission = admissionPathFor(p);
|
|
639
|
+
const acquired = tryAcquireOnce(admission, info, JSON.stringify(info));
|
|
640
|
+
if (!("handle" in acquired))
|
|
641
|
+
return;
|
|
642
|
+
try {
|
|
643
|
+
if (liveSharedMembers(p).length === 0 && isSharedMarker(readLockInfo(p))) {
|
|
644
|
+
fs.unlinkSync(p);
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
catch (err) {
|
|
648
|
+
if (err?.code !== "ENOENT")
|
|
649
|
+
throw err;
|
|
650
|
+
}
|
|
651
|
+
finally {
|
|
652
|
+
acquired.handle.release();
|
|
653
|
+
}
|
|
654
|
+
},
|
|
655
|
+
};
|
|
656
|
+
heldLocks.add(handle);
|
|
657
|
+
installHooksOnce();
|
|
658
|
+
return handle;
|
|
659
|
+
}
|
|
660
|
+
function tryAcquireShared(p, info, payload) {
|
|
661
|
+
const initialBlocker = existingExclusiveBlocker(p);
|
|
662
|
+
if (initialBlocker)
|
|
663
|
+
return { busy: initialBlocker };
|
|
664
|
+
const admission = tryAcquireOnce(admissionPathFor(p), info, payload);
|
|
665
|
+
if (!("handle" in admission))
|
|
666
|
+
return admission;
|
|
667
|
+
try {
|
|
668
|
+
// A maintenance waiter may have appeared while we were waiting for the
|
|
669
|
+
// turnstile. Re-check under it; this is the writer-preference boundary.
|
|
670
|
+
const blocker = existingExclusiveBlocker(p);
|
|
671
|
+
if (blocker)
|
|
672
|
+
return { busy: blocker };
|
|
673
|
+
const memberPath = `${p}.shared-${process.pid}-${crypto.randomBytes(6).toString("hex")}`;
|
|
674
|
+
if (!publishLockPayload(memberPath, payload)) {
|
|
675
|
+
throw new Error(`Could not publish HQ shared operation membership at ${memberPath}`);
|
|
676
|
+
}
|
|
677
|
+
if (!fs.existsSync(p) && !publishLockPayload(p, payload)) {
|
|
678
|
+
// The only possible contender under admission is a legacy/corrupt writer.
|
|
679
|
+
unlinkIfOwned(memberPath);
|
|
680
|
+
return { busy: existingExclusiveBlocker(p) ?? initializingLockInfo(p) };
|
|
681
|
+
}
|
|
682
|
+
return { handle: makeSharedHandle(p, memberPath, info) };
|
|
683
|
+
}
|
|
684
|
+
finally {
|
|
685
|
+
admission.handle.release();
|
|
686
|
+
}
|
|
687
|
+
}
|
|
688
|
+
function tryAcquireExclusive(p, info, payload) {
|
|
689
|
+
const admission = tryAcquireOnce(admissionPathFor(p), info, payload);
|
|
690
|
+
if (!("handle" in admission))
|
|
691
|
+
return admission;
|
|
692
|
+
try {
|
|
693
|
+
let marker = readLockInfo(p);
|
|
694
|
+
if (marker && !isSharedMarker(marker)) {
|
|
695
|
+
if (pidAlive(marker.pid))
|
|
696
|
+
return { busy: marker };
|
|
697
|
+
try {
|
|
698
|
+
fs.unlinkSync(p);
|
|
699
|
+
}
|
|
700
|
+
catch {
|
|
701
|
+
/* a contender replaced or reclaimed it; retry through the busy path */
|
|
702
|
+
}
|
|
703
|
+
marker = readLockInfo(p);
|
|
704
|
+
if (marker && !isSharedMarker(marker))
|
|
705
|
+
return { busy: marker };
|
|
706
|
+
}
|
|
707
|
+
if (!marker && fs.existsSync(p))
|
|
708
|
+
return { busy: initializingLockInfo(p) };
|
|
709
|
+
if (marker && liveSharedMembers(p).length > 0)
|
|
710
|
+
return { busy: marker };
|
|
711
|
+
if (marker)
|
|
712
|
+
fs.unlinkSync(p); // zero members, still protected by admission
|
|
713
|
+
if (!publishLockPayload(p, payload)) {
|
|
714
|
+
return { busy: readLockInfo(p) ?? initializingLockInfo(p) };
|
|
715
|
+
}
|
|
716
|
+
return { handle: makeHandle(p, info) };
|
|
717
|
+
}
|
|
718
|
+
finally {
|
|
719
|
+
admission.handle.release();
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
function tryAcquireGate(mode, p, info, payload) {
|
|
723
|
+
return mode === "shared"
|
|
724
|
+
? tryAcquireShared(p, info, payload)
|
|
725
|
+
: tryAcquireExclusive(p, info, payload);
|
|
726
|
+
}
|
|
727
|
+
/** Acquire the operation gate synchronously. Watch-loop probes always pass a
|
|
728
|
+
* zero timeout; all wait-capable parent paths use the async counterpart below. */
|
|
563
729
|
export function acquireOperationLock(hqRoot, command, opts = {}) {
|
|
564
730
|
if (process.env.HQ_DISABLE_OP_LOCK === "1")
|
|
565
731
|
return disabledHandle(hqRoot, command);
|
|
566
|
-
const
|
|
732
|
+
const mode = operationMode(command, opts);
|
|
733
|
+
const { p, info, payload } = prepareLock(hqRoot, command, opts.scope, mode);
|
|
567
734
|
const cfg = resolveWaitConfig(opts);
|
|
568
735
|
const deadline = cfg.timeoutMs === null ? null : Date.now() + cfg.timeoutMs;
|
|
569
736
|
let announced = false;
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
737
|
+
// Exclusive callers announce intent before the turnstile. New shared workers
|
|
738
|
+
// then wait behind the maintenance request instead of repeatedly overtaking it.
|
|
739
|
+
const waiterPath = mode === "exclusive" && cfg.timeoutMs !== 0 ? registerWaiter(p, payload) : null;
|
|
573
740
|
try {
|
|
574
741
|
for (;;) {
|
|
575
|
-
const
|
|
576
|
-
const res = priorWaiter
|
|
577
|
-
? { busy: priorWaiter }
|
|
578
|
-
: tryAcquireOnce(p, info, payload);
|
|
742
|
+
const res = tryAcquireGate(mode, p, info, payload);
|
|
579
743
|
if ("handle" in res)
|
|
580
744
|
return res.handle;
|
|
581
|
-
// A live holder or prior waiter blocked us. Decide: refuse now, or wait.
|
|
582
745
|
if (remainingMs(deadline) <= 0)
|
|
583
746
|
throw new OperationLockedError(res.busy, command);
|
|
584
747
|
if (!announced) {
|
|
@@ -592,27 +755,20 @@ export function acquireOperationLock(hqRoot, command, opts = {}) {
|
|
|
592
755
|
removeWaiter(waiterPath);
|
|
593
756
|
}
|
|
594
757
|
}
|
|
595
|
-
/**
|
|
596
|
-
*
|
|
597
|
-
* the wait yields the event loop (via `setTimeout`) instead of blocking the
|
|
598
|
-
* thread — required for the async `sync` runner.
|
|
599
|
-
*/
|
|
758
|
+
/** Async gate acquisition. This is the only wait-capable path used by the
|
|
759
|
+
* parent watch loop, so maintenance waits never block watcher heartbeats. */
|
|
600
760
|
export async function acquireOperationLockAsync(hqRoot, command, opts = {}) {
|
|
601
761
|
if (process.env.HQ_DISABLE_OP_LOCK === "1")
|
|
602
762
|
return disabledHandle(hqRoot, command);
|
|
603
|
-
const
|
|
763
|
+
const mode = operationMode(command, opts);
|
|
764
|
+
const { p, info, payload } = prepareLock(hqRoot, command, opts.scope, mode);
|
|
604
765
|
const cfg = resolveWaitConfig(opts);
|
|
605
766
|
const deadline = cfg.timeoutMs === null ? null : Date.now() + cfg.timeoutMs;
|
|
606
767
|
let announced = false;
|
|
607
|
-
const waiterPath = cfg.timeoutMs !== 0
|
|
608
|
-
? registerWaiter(p, payload)
|
|
609
|
-
: null;
|
|
768
|
+
const waiterPath = mode === "exclusive" && cfg.timeoutMs !== 0 ? registerWaiter(p, payload) : null;
|
|
610
769
|
try {
|
|
611
770
|
for (;;) {
|
|
612
|
-
const
|
|
613
|
-
const res = priorWaiter
|
|
614
|
-
? { busy: priorWaiter }
|
|
615
|
-
: tryAcquireOnce(p, info, payload);
|
|
771
|
+
const res = tryAcquireGate(mode, p, info, payload);
|
|
616
772
|
if ("handle" in res)
|
|
617
773
|
return res.handle;
|
|
618
774
|
if (remainingMs(deadline) <= 0)
|