velocious 1.0.664 → 1.0.666

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/README.md CHANGED
@@ -15,7 +15,7 @@
15
15
  * Controllers and views for HTTP endpoints
16
16
  * Frontend-model transport for creating, updating, querying, and subscribing to query-filtered lifecycle events over HTTP/WebSocket, including committed counter-cache parent updates, structured per-attribute validation error responses, immutable per-operation remote request context, registration-local tenant subscription partitioning, and one-budget WebSocket startup controls (see [docs/frontend-models.md](docs/frontend-models.md), [docs/remote-request-context.md](docs/remote-request-context.md), and [docs/websocket-channels.md](docs/websocket-channels.md))
17
17
  * Client-side offline sync mutation logs and frontend-model optimistic queueing primitives (see the [shared-resource sync developer guide](docs/shared-resource-sync-guide.md) and [offline sync architecture](docs/offline-sync.md))
18
- * Declarative client sync scopes with per-scope cursors, generation-fenced identity replacement and selected-scope cache reset, automatic mutation tracking, opt-in durable base-version conflict replay, realtime delivery and reconnect gap closure, computed server-publish scope metadata, and immutable-handle project clients whose local database state plus remote pull/replay/realtime request context stay tenant-bound through reconnect (see [docs/sync-client.md](docs/sync-client.md), [docs/remote-request-context.md](docs/remote-request-context.md), and [docs/offline-sync.md](docs/offline-sync.md))
18
+ * Declarative client sync scopes with per-scope cursors, generation-fenced identity replacement and selected-scope cache reset, automatic mutation tracking, opt-in durable base-version conflict replay, realtime delivery and reconnect gap closure, computed server-publish scope metadata with atomic null-safe publisher row identities and legacy-duplicate reconciliation, and immutable-handle project clients whose local database state plus remote pull/replay/realtime request context stay tenant-bound through reconnect (see [docs/sync-client.md](docs/sync-client.md), [docs/remote-request-context.md](docs/remote-request-context.md), and [docs/offline-sync.md](docs/offline-sync.md))
19
19
  * Reactive `useLiveQuery(Model.where(...))` queries for default databases plus immutable-handle tenant live-query sources whose committed events and refreshes stay on the captured physical tenant (see [docs/live-queries.md](docs/live-queries.md))
20
20
  * Server-side sync envelope replay orchestration for app-owned sync receivers, including allowlisted authoritative conflict snapshots that retain submitted aliases in conflict metadata while keying `serverModel` by canonical model attributes (see [docs/sync-envelope-replay-service.md](docs/sync-envelope-replay-service.md))
21
21
  * Self-sustaining sync feeds: upstream imports triggered by the changes pull itself, with framework-owned coalescing and throttling (see [docs/sync-upstream-imports.md](docs/sync-upstream-imports.md))
@@ -2729,7 +2729,7 @@ Set `deduplicateWhileQueued: true` to coalesce an enqueue onto the earliest iden
2729
2729
 
2730
2730
  Use `options: {idempotencyKey}` when producer replay must converge on the original durable job across every state and even after terminal-job pruning. Ownership is scoped to the resolved job class name, resolved queue, and key; reusing that scope with changed canonical arguments or behavior-affecting options fails. This is distinct from queued-only deduplication, and ownership rows are intentionally retained until a future explicit reconciliation/deletion policy. See [durable idempotent enqueue](docs/background-jobs.md#durable-idempotent-enqueue).
2731
2731
 
2732
- The Node producer gives connection/handshake and post-send acknowledgement separate bounded phases, so connection or generation-handshake latency does not consume the 5-second `enqueued` acknowledgement budget. It rejects and destroys its one-shot socket when either phase stalls or when the main closes before acknowledging. Because the main may already have committed the job, a post-send failure is an ambiguous outcome. A call made by an executing generation-owned job automatically makes one recovery attempt with its exact internal producer proof and per-call invocation identity, but never after a pre-send generation failure or explicit enqueue rejection. Ordinary enqueues are not retried automatically: replay one with the same durable `idempotencyKey` to recover the original job id without creating a duplicate. Direct `BackgroundJobsClient` users can set a different bounded `enqueueTimeoutMs` constructor option for both phases. See [durable idempotent enqueue](docs/background-jobs.md#durable-idempotent-enqueue).
2732
+ The Node producer gives connection/handshake and post-send acknowledgement separate bounded phases, so connection or generation-handshake latency does not consume the 5-second `enqueued` acknowledgement budget. It rejects and destroys its one-shot socket when either phase stalls or when the main closes before acknowledging. Only a post-send acknowledgement deadline raises `BackgroundJobEnqueueAcknowledgementTimeoutError`, an Awaitery `TimeoutError` subtype with code `BACKGROUND_JOB_ENQUEUE_ACKNOWLEDGEMENT_TIMEOUT` and frozen, payload-free attempt history. The error proves the request was sent but cannot say whether the main committed it. A call made by an executing generation-owned job automatically makes one recovery attempt with its exact internal producer proof and per-call invocation identity, but never after a pre-send generation failure or explicit enqueue rejection. If that replay also times out, the final typed error describes both timed-out attempts. Ordinary enqueues are not retried automatically: replay one with the same durable `idempotencyKey` to recover the original job id without creating a duplicate. Direct `BackgroundJobsClient` users can set a different bounded `enqueueTimeoutMs` constructor option for both phases. See [durable idempotent enqueue](docs/background-jobs.md#durable-idempotent-enqueue).
2733
2733
 
2734
2734
  Select a non-default runtime explicitly with `options: {executionMode: "inline" | "forked" | "spawned"}`.
2735
2735
 
@@ -1,7 +1,8 @@
1
1
  // @ts-check
2
2
 
3
- import timeout from "awaitery/build/timeout.js"
3
+ import timeout, {TimeoutError} from "awaitery/build/timeout.js"
4
4
  import configurationResolver from "../configuration-resolver.js"
5
+ import BackgroundJobEnqueueAcknowledgementTimeoutError from "./enqueue-acknowledgement-timeout-error.js"
5
6
  import BackgroundJobsSocketRequest from "./socket-request.js"
6
7
  import { DEFAULT_GENERATION_HANDSHAKE_TIMEOUT_MS, validateGenerationHandshakeTimeoutMs } from "./generation-handshake-timeout-error.js"
7
8
 
@@ -57,17 +58,36 @@ export default class BackgroundJobsClient {
57
58
  ...(producerInvocationId ? {producerInvocationId} : {}),
58
59
  ...(producerProof ? {producerProof} : {})
59
60
  }
60
- const acknowledgement = {explicitlyRejected: false, generationFenced: false, requestSent: false}
61
+ /**
62
+ * Creates safe observations for one attempt without retaining request data.
63
+ * @param {object} args - Attempt identity.
64
+ * @param {"initial" | "owned_replay"} args.attemptKind - Initial attempt or owned replay.
65
+ * @param {number} args.attemptNumber - One-based attempt number.
66
+ * @returns {import("./enqueue-acknowledgement-timeout-error.js").BackgroundJobEnqueueAttempt} - Mutable attempt observations.
67
+ */
68
+ const newAttemptObservation = ({attemptKind, attemptNumber}) => ({
69
+ acknowledgementWaitElapsedMs: 0,
70
+ attemptElapsedMs: 0,
71
+ attemptKind,
72
+ attemptNumber,
73
+ explicitlyRejected: false,
74
+ generationFenced: false,
75
+ requestSent: false
76
+ })
61
77
  /**
62
78
  * Sends one enqueue attempt. An owned caller may replay this exact message
63
79
  * once when transport acknowledgement remains ambiguous after send.
64
- * @param {{explicitlyRejected: boolean, generationFenced: boolean, requestSent: boolean} | undefined} attemptAcknowledgement - First-attempt observations.
80
+ * @param {import("./enqueue-acknowledgement-timeout-error.js").BackgroundJobEnqueueAttempt} attemptObservation - Mutable attempt observations.
81
+ * @param {Readonly<Array<import("./enqueue-acknowledgement-timeout-error.js").BackgroundJobEnqueueAttempt>>} previousAttempts - Earlier timed-out attempts.
65
82
  * @returns {Promise<string>} - Job id.
66
83
  */
67
- const enqueueAttempt = async (attemptAcknowledgement) => {
84
+ const enqueueAttempt = async (attemptObservation, previousAttempts) => {
85
+ const attemptStartedAtMs = Date.now()
68
86
  const request = await this._request()
69
87
  const requestAbortController = new AbortController()
70
88
  const timeoutErrorMessage = `Background job enqueue acknowledgement timed out after ${this.enqueueTimeoutMs}ms`
89
+ /** @type {number | undefined} */
90
+ let requestSentAtMs
71
91
  /**
72
92
  * Resolves the pre-send phase when the mutation has entered the socket.
73
93
  * @type {() => void}
@@ -99,10 +119,9 @@ export default class BackgroundJobsClient {
99
119
  signal: requestAbortController.signal,
100
120
  onConnect: (jsonSocket) => {
101
121
  jsonSocket.send(message)
102
- if (attemptAcknowledgement) {
103
- attemptAcknowledgement.generationFenced = Boolean(request.generationId)
104
- attemptAcknowledgement.requestSent = true
105
- }
122
+ attemptObservation.generationFenced = Boolean(request.generationId)
123
+ attemptObservation.requestSent = true
124
+ requestSentAtMs = Date.now()
106
125
  markRequestSent()
107
126
  },
108
127
  onMessage: ({message, resolve, reject}) => {
@@ -112,7 +131,7 @@ export default class BackgroundJobsClient {
112
131
  }
113
132
 
114
133
  if (message?.type === "enqueue-error") {
115
- if (attemptAcknowledgement) attemptAcknowledgement.explicitlyRejected = true
134
+ attemptObservation.explicitlyRejected = true
116
135
  reject(new Error(message.error || "Failed to enqueue job"))
117
136
  }
118
137
  }
@@ -120,16 +139,43 @@ export default class BackgroundJobsClient {
120
139
 
121
140
  await withEnqueueTimeout(async () => await Promise.race([requestSent, requestPromise]))
122
141
 
123
- return await withEnqueueTimeout(async () => await requestPromise)
142
+ try {
143
+ return await withEnqueueTimeout(async () => await requestPromise)
144
+ } catch (error) {
145
+ if (!(error instanceof TimeoutError)) throw error
146
+ if (requestSentAtMs === undefined) throw new Error("Background job enqueue acknowledgement wait started before the request was sent", {cause: error})
147
+
148
+ const timedOutAtMs = Date.now()
149
+ // The fired timer proves its logical deadline even when the adjustable wall clock reports a shorter interval.
150
+ const acknowledgementWaitElapsedMs = Math.max(this.enqueueTimeoutMs, timedOutAtMs - requestSentAtMs)
151
+
152
+ attemptObservation.acknowledgementWaitElapsedMs = acknowledgementWaitElapsedMs
153
+ attemptObservation.attemptElapsedMs = Math.max(acknowledgementWaitElapsedMs, timedOutAtMs - attemptStartedAtMs)
154
+
155
+ throw new BackgroundJobEnqueueAcknowledgementTimeoutError({
156
+ acknowledgementTimeoutMs: this.enqueueTimeoutMs,
157
+ attemptHistory: [...previousAttempts, attemptObservation],
158
+ cause: error,
159
+ generationId: request.generationId,
160
+ jobName,
161
+ producerInvocationId,
162
+ producerProofPresent: Boolean(producerProof)
163
+ })
164
+ }
124
165
  }
125
166
 
167
+ const initialAttempt = newAttemptObservation({attemptKind: "initial", attemptNumber: 1})
168
+
126
169
  try {
127
- return await enqueueAttempt(acknowledgement)
170
+ return await enqueueAttempt(initialAttempt, [])
128
171
  } catch (error) {
129
- if (!producerInvocationId || !producerProof || !acknowledgement.generationFenced || !acknowledgement.requestSent || acknowledgement.explicitlyRejected) throw error
130
- }
172
+ if (!producerInvocationId || !producerProof || !initialAttempt.generationFenced || !initialAttempt.requestSent || initialAttempt.explicitlyRejected) throw error
131
173
 
132
- return await enqueueAttempt(undefined)
174
+ const previousAttempts = error instanceof BackgroundJobEnqueueAcknowledgementTimeoutError ? error.attemptHistory : []
175
+ const replayAttempt = newAttemptObservation({attemptKind: "owned_replay", attemptNumber: 2})
176
+
177
+ return await enqueueAttempt(replayAttempt, previousAttempts)
178
+ }
133
179
  }
134
180
 
135
181
  /**
@@ -0,0 +1,50 @@
1
+ // @ts-check
2
+
3
+ import {TimeoutError} from "awaitery/build/timeout.js"
4
+
5
+ /**
6
+ * @typedef {object} BackgroundJobEnqueueAttempt
7
+ * @property {number} acknowledgementWaitElapsedMs - Time spent waiting for the acknowledgement after send.
8
+ * @property {number} attemptElapsedMs - Total attempt time including connection and generation fencing.
9
+ * @property {"initial" | "owned_replay"} attemptKind - Initial attempt or the one eligible owned replay.
10
+ * @property {number} attemptNumber - One-based attempt number.
11
+ * @property {boolean} explicitlyRejected - Whether the main explicitly rejected the enqueue.
12
+ * @property {boolean} generationFenced - Whether the configured generation accepted the connection before send.
13
+ * @property {boolean} requestSent - Whether the enqueue request entered the socket.
14
+ */
15
+
16
+ /** Safe typed failure for an ambiguous post-send enqueue acknowledgement timeout. */
17
+ export default class BackgroundJobEnqueueAcknowledgementTimeoutError extends TimeoutError {
18
+ /**
19
+ * Builds an enqueue acknowledgement timeout error without request payload or connection details.
20
+ * @param {object} args - Safe timeout context.
21
+ * @param {number} args.acknowledgementTimeoutMs - Configured post-send acknowledgement deadline.
22
+ * @param {Array<BackgroundJobEnqueueAttempt>} args.attemptHistory - Safe observations for timed-out attempts.
23
+ * @param {TimeoutError} [args.cause] - Original Awaitery timeout.
24
+ * @param {string} [args.generationId] - Accepted release generation identity.
25
+ * @param {string} args.jobName - Resolved job class name.
26
+ * @param {string} [args.producerInvocationId] - Owned enqueue invocation identity.
27
+ * @param {boolean} args.producerProofPresent - Whether the request carried an internal producer proof.
28
+ */
29
+ constructor({acknowledgementTimeoutMs, attemptHistory, cause, generationId, jobName, producerInvocationId, producerProofPresent}) {
30
+ super(`Background job enqueue acknowledgement timed out after ${acknowledgementTimeoutMs}ms`, cause ? {cause} : undefined)
31
+
32
+ this.name = "BackgroundJobEnqueueAcknowledgementTimeoutError"
33
+ /** @type {"BACKGROUND_JOB_ENQUEUE_ACKNOWLEDGEMENT_TIMEOUT"} */
34
+ this.code = "BACKGROUND_JOB_ENQUEUE_ACKNOWLEDGEMENT_TIMEOUT"
35
+ this.acknowledgementTimeoutMs = acknowledgementTimeoutMs
36
+ this.attemptHistory = Object.freeze(attemptHistory.map((attempt) => Object.freeze({
37
+ acknowledgementWaitElapsedMs: attempt.acknowledgementWaitElapsedMs,
38
+ attemptElapsedMs: attempt.attemptElapsedMs,
39
+ attemptKind: attempt.attemptKind,
40
+ attemptNumber: attempt.attemptNumber,
41
+ explicitlyRejected: attempt.explicitlyRejected,
42
+ generationFenced: attempt.generationFenced,
43
+ requestSent: attempt.requestSent
44
+ })))
45
+ this.generationId = generationId
46
+ this.jobName = jobName
47
+ this.producerInvocationId = producerInvocationId
48
+ this.producerProofPresent = producerProofPresent
49
+ }
50
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/background-jobs/client.js"],"names":[],"mappings":"AAIA,OAAO,2BAA2B,MAAM,qBAAqB,CAAA;AAK7D,MAAM,CAAC,OAAO,OAAO,oBAAoB;IAUhC,oBAAoB;IACpB,gBAAgB;IAChB,4BAA4B;IAC5B,oBAAoB;IAZ3B;;;;;;;OAOG;IACH,YAAY,EAAC,aAAa,EAAE,gBAA6C,EAAE,4BAAsE,EAAE,YAAY,EAAC,AAN7J,CAKF,EAJE;QAAqD,aAAa,AAAlE,CACA,EADQ,OAAO,qBAAqB,EAAE,OAAO,CAC7C;QAAsB,gBAAgB,AAAtC,CACA,EADQ,MAAM,CACd;QAAsB,4BAA4B,AAAlD,CACA,EADQ,MAAM,CACd;QAAsB,YAAY,AAAlC,CACF,EADU,MAAM,CAChB;KACoK,EAKpK;IAED;;;OAGG;IACG,QAAQ,IAFD,OAAO,CAAC,2BAA2B,CAAC,CAWhD;IAED;;;;;;;;;OASG;IACG,OAAO,CAAC,EAAC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAC,EAPxE;QAAqB,OAAO,EAApB,MAAM,CACd;QAAmD,IAAI,EAA/C,KAAK,CAAC,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAC5C;QAAyD,OAAO,AAAhE,CACA,EADQ,OAAO,YAAY,EAAE,oBAAoB,CACjD;QAAsB,oBAAoB,AAA1C,CACA,EADQ,MAAM,CACd;QAA+D,aAAa,AAA5E,CACA,EADQ,OAAO,YAAY,EAAE,0BAA0B,CACvD;KAEwE,GAF9D,OAAO,CAAC,MAAM,CAAC,CAoF3B;IAED;;;;;;;;OAQG;IACG,gBAAgB,CAAC,EAAC,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAC,EANzD;QAAqB,WAAW,EAAxB,MAAM,CACd;QAAqB,OAAO,EAApB,MAAM,CACd;QAAmD,IAAI,EAA/C,KAAK,CAAC,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAC5C;QAAyD,OAAO,AAAhE,CACA,EADQ,OAAO,YAAY,EAAE,oBAAoB,CACjD;KAEyD,GAF/C,OAAO,CAAC,OAAO,YAAY,EAAE,8BAA8B,CAAC,CAwBxE;IAED;;;;;OAKG;IACG,eAAe,CAAC,EAAC,WAAW,EAAC,EAHhC;QAAqB,WAAW,EAAxB,MAAM,CACd;KAEgC,GAFtB,OAAO,CAAC,OAAO,YAAY,EAAE,+BAA+B,CAAC,CAoBzE;CACF"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/background-jobs/client.js"],"names":[],"mappings":"AAKA,OAAO,2BAA2B,MAAM,qBAAqB,CAAA;AAK7D,MAAM,CAAC,OAAO,OAAO,oBAAoB;IAUhC,oBAAoB;IACpB,gBAAgB;IAChB,4BAA4B;IAC5B,oBAAoB;IAZ3B;;;;;;;OAOG;IACH,YAAY,EAAC,aAAa,EAAE,gBAA6C,EAAE,4BAAsE,EAAE,YAAY,EAAC,AAN7J,CAKF,EAJE;QAAqD,aAAa,AAAlE,CACA,EADQ,OAAO,qBAAqB,EAAE,OAAO,CAC7C;QAAsB,gBAAgB,AAAtC,CACA,EADQ,MAAM,CACd;QAAsB,4BAA4B,AAAlD,CACA,EADQ,MAAM,CACd;QAAsB,YAAY,AAAlC,CACF,EADU,MAAM,CAChB;KACoK,EAKpK;IAED;;;OAGG;IACG,QAAQ,IAFD,OAAO,CAAC,2BAA2B,CAAC,CAWhD;IAED;;;;;;;;;OASG;IACG,OAAO,CAAC,EAAC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAC,EAPxE;QAAqB,OAAO,EAApB,MAAM,CACd;QAAmD,IAAI,EAA/C,KAAK,CAAC,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAC5C;QAAyD,OAAO,AAAhE,CACA,EADQ,OAAO,YAAY,EAAE,oBAAoB,CACjD;QAAsB,oBAAoB,AAA1C,CACA,EADQ,MAAM,CACd;QAA+D,aAAa,AAA5E,CACA,EADQ,OAAO,YAAY,EAAE,0BAA0B,CACvD;KAEwE,GAF9D,OAAO,CAAC,MAAM,CAAC,CAiI3B;IAED;;;;;;;;OAQG;IACG,gBAAgB,CAAC,EAAC,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAC,EANzD;QAAqB,WAAW,EAAxB,MAAM,CACd;QAAqB,OAAO,EAApB,MAAM,CACd;QAAmD,IAAI,EAA/C,KAAK,CAAC,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAC5C;QAAyD,OAAO,AAAhE,CACA,EADQ,OAAO,YAAY,EAAE,oBAAoB,CACjD;KAEyD,GAF/C,OAAO,CAAC,OAAO,YAAY,EAAE,8BAA8B,CAAC,CAwBxE;IAED;;;;;OAKG;IACG,eAAe,CAAC,EAAC,WAAW,EAAC,EAHhC;QAAqB,WAAW,EAAxB,MAAM,CACd;KAEgC,GAFtB,OAAO,CAAC,OAAO,YAAY,EAAE,+BAA+B,CAAC,CAoBzE;CACF"}
@@ -1,6 +1,7 @@
1
1
  // @ts-check
2
- import timeout from "awaitery/build/timeout.js";
2
+ import timeout, { TimeoutError } from "awaitery/build/timeout.js";
3
3
  import configurationResolver from "../configuration-resolver.js";
4
+ import BackgroundJobEnqueueAcknowledgementTimeoutError from "./enqueue-acknowledgement-timeout-error.js";
4
5
  import BackgroundJobsSocketRequest from "./socket-request.js";
5
6
  import { DEFAULT_GENERATION_HANDSHAKE_TIMEOUT_MS, validateGenerationHandshakeTimeoutMs } from "./generation-handshake-timeout-error.js";
6
7
  const DEFAULT_ENQUEUE_TIMEOUT_MS = 5000;
@@ -51,17 +52,36 @@ export default class BackgroundJobsClient {
51
52
  ...(producerInvocationId ? { producerInvocationId } : {}),
52
53
  ...(producerProof ? { producerProof } : {})
53
54
  };
54
- const acknowledgement = { explicitlyRejected: false, generationFenced: false, requestSent: false };
55
+ /**
56
+ * Creates safe observations for one attempt without retaining request data.
57
+ * @param {object} args - Attempt identity.
58
+ * @param {"initial" | "owned_replay"} args.attemptKind - Initial attempt or owned replay.
59
+ * @param {number} args.attemptNumber - One-based attempt number.
60
+ * @returns {import("./enqueue-acknowledgement-timeout-error.js").BackgroundJobEnqueueAttempt} - Mutable attempt observations.
61
+ */
62
+ const newAttemptObservation = ({ attemptKind, attemptNumber }) => ({
63
+ acknowledgementWaitElapsedMs: 0,
64
+ attemptElapsedMs: 0,
65
+ attemptKind,
66
+ attemptNumber,
67
+ explicitlyRejected: false,
68
+ generationFenced: false,
69
+ requestSent: false
70
+ });
55
71
  /**
56
72
  * Sends one enqueue attempt. An owned caller may replay this exact message
57
73
  * once when transport acknowledgement remains ambiguous after send.
58
- * @param {{explicitlyRejected: boolean, generationFenced: boolean, requestSent: boolean} | undefined} attemptAcknowledgement - First-attempt observations.
74
+ * @param {import("./enqueue-acknowledgement-timeout-error.js").BackgroundJobEnqueueAttempt} attemptObservation - Mutable attempt observations.
75
+ * @param {Readonly<Array<import("./enqueue-acknowledgement-timeout-error.js").BackgroundJobEnqueueAttempt>>} previousAttempts - Earlier timed-out attempts.
59
76
  * @returns {Promise<string>} - Job id.
60
77
  */
61
- const enqueueAttempt = async (attemptAcknowledgement) => {
78
+ const enqueueAttempt = async (attemptObservation, previousAttempts) => {
79
+ const attemptStartedAtMs = Date.now();
62
80
  const request = await this._request();
63
81
  const requestAbortController = new AbortController();
64
82
  const timeoutErrorMessage = `Background job enqueue acknowledgement timed out after ${this.enqueueTimeoutMs}ms`;
83
+ /** @type {number | undefined} */
84
+ let requestSentAtMs;
65
85
  /**
66
86
  * Resolves the pre-send phase when the mutation has entered the socket.
67
87
  * @type {() => void}
@@ -93,10 +113,9 @@ export default class BackgroundJobsClient {
93
113
  signal: requestAbortController.signal,
94
114
  onConnect: (jsonSocket) => {
95
115
  jsonSocket.send(message);
96
- if (attemptAcknowledgement) {
97
- attemptAcknowledgement.generationFenced = Boolean(request.generationId);
98
- attemptAcknowledgement.requestSent = true;
99
- }
116
+ attemptObservation.generationFenced = Boolean(request.generationId);
117
+ attemptObservation.requestSent = true;
118
+ requestSentAtMs = Date.now();
100
119
  markRequestSent();
101
120
  },
102
121
  onMessage: ({ message, resolve, reject }) => {
@@ -105,23 +124,47 @@ export default class BackgroundJobsClient {
105
124
  return;
106
125
  }
107
126
  if (message?.type === "enqueue-error") {
108
- if (attemptAcknowledgement)
109
- attemptAcknowledgement.explicitlyRejected = true;
127
+ attemptObservation.explicitlyRejected = true;
110
128
  reject(new Error(message.error || "Failed to enqueue job"));
111
129
  }
112
130
  }
113
131
  });
114
132
  await withEnqueueTimeout(async () => await Promise.race([requestSent, requestPromise]));
115
- return await withEnqueueTimeout(async () => await requestPromise);
133
+ try {
134
+ return await withEnqueueTimeout(async () => await requestPromise);
135
+ }
136
+ catch (error) {
137
+ if (!(error instanceof TimeoutError))
138
+ throw error;
139
+ if (requestSentAtMs === undefined)
140
+ throw new Error("Background job enqueue acknowledgement wait started before the request was sent", { cause: error });
141
+ const timedOutAtMs = Date.now();
142
+ // The fired timer proves its logical deadline even when the adjustable wall clock reports a shorter interval.
143
+ const acknowledgementWaitElapsedMs = Math.max(this.enqueueTimeoutMs, timedOutAtMs - requestSentAtMs);
144
+ attemptObservation.acknowledgementWaitElapsedMs = acknowledgementWaitElapsedMs;
145
+ attemptObservation.attemptElapsedMs = Math.max(acknowledgementWaitElapsedMs, timedOutAtMs - attemptStartedAtMs);
146
+ throw new BackgroundJobEnqueueAcknowledgementTimeoutError({
147
+ acknowledgementTimeoutMs: this.enqueueTimeoutMs,
148
+ attemptHistory: [...previousAttempts, attemptObservation],
149
+ cause: error,
150
+ generationId: request.generationId,
151
+ jobName,
152
+ producerInvocationId,
153
+ producerProofPresent: Boolean(producerProof)
154
+ });
155
+ }
116
156
  };
157
+ const initialAttempt = newAttemptObservation({ attemptKind: "initial", attemptNumber: 1 });
117
158
  try {
118
- return await enqueueAttempt(acknowledgement);
159
+ return await enqueueAttempt(initialAttempt, []);
119
160
  }
120
161
  catch (error) {
121
- if (!producerInvocationId || !producerProof || !acknowledgement.generationFenced || !acknowledgement.requestSent || acknowledgement.explicitlyRejected)
162
+ if (!producerInvocationId || !producerProof || !initialAttempt.generationFenced || !initialAttempt.requestSent || initialAttempt.explicitlyRejected)
122
163
  throw error;
164
+ const previousAttempts = error instanceof BackgroundJobEnqueueAcknowledgementTimeoutError ? error.attemptHistory : [];
165
+ const replayAttempt = newAttemptObservation({ attemptKind: "owned_replay", attemptNumber: 2 });
166
+ return await enqueueAttempt(replayAttempt, previousAttempts);
123
167
  }
124
- return await enqueueAttempt(undefined);
125
168
  }
126
169
  /**
127
170
  * Atomically replaces the queued owner of a stable schedule key.
@@ -177,4 +220,4 @@ export default class BackgroundJobsClient {
177
220
  });
178
221
  }
179
222
  }
180
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhY2tncm91bmQtam9icy9jbGllbnQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sT0FBTyxNQUFNLDJCQUEyQixDQUFBO0FBQy9DLE9BQU8scUJBQXFCLE1BQU0sOEJBQThCLENBQUE7QUFDaEUsT0FBTywyQkFBMkIsTUFBTSxxQkFBcUIsQ0FBQTtBQUM3RCxPQUFPLEVBQUUsdUNBQXVDLEVBQUUsb0NBQW9DLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQTtBQUV2SSxNQUFNLDBCQUEwQixHQUFHLElBQUksQ0FBQTtBQUV2QyxNQUFNLENBQUMsT0FBTyxPQUFPLG9CQUFvQjtJQUN2Qzs7Ozs7OztPQU9HO0lBQ0gsWUFBWSxFQUFDLGFBQWEsRUFBRSxnQkFBZ0IsR0FBRywwQkFBMEIsRUFBRSw0QkFBNEIsR0FBRyx1Q0FBdUMsRUFBRSxZQUFZLEVBQUMsR0FBRyxFQUFFO1FBQ25LLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixFQUFFLENBQUE7UUFDcEcsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFBO1FBQ3hDLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxvQ0FBb0MsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFBO1FBQ3RHLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxZQUFZLENBQUE7SUFDMUMsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxRQUFRO1FBQ1osTUFBTSxhQUFhLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUE7UUFDckQsTUFBTSxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUMsR0FBRyxhQUFhLENBQUMsdUJBQXVCLEVBQUUsQ0FBQTtRQUM1RCxNQUFNLEVBQUMsWUFBWSxFQUFDLEdB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Q0FBQyxFQUFDLFdBQVcsRUFBQztRQUNqQyxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQTtRQUVyQyxPQUFPLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUN2QixTQUFTLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRTtnQkFDeEIsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBQUMsQ0FBQyxDQUFBO1lBQzFELENBQUM7WUFDRCxTQUFTLEVBQUUsQ0FBQyxFQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFDLEVBQUUsRUFBRTtnQkFDeEMsSUFBSSxPQUFPLEVBQUUsSUFBSSxLQUFLLG9CQUFvQixFQUFFLENBQUM7b0JBQzNDLE9BQU8sQ0FBQyxFQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFDLENBQUMsQ0FBQTtvQkFDekQsT0FBTTtnQkFDUixDQUFDO2dCQUVELElBQUksT0FBTyxFQUFFLElBQUksS0FBSyx3QkFBd0IsRUFBRSxDQUFDO29CQUMvQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxnQ0FBZ0MsQ0FBQyxDQUFDLENBQUE7Z0JBQ3RFLENBQUM7WUFDSCxDQUFDO1NBQ0YsQ0FBQyxDQUFBO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB0aW1lb3V0IGZyb20gXCJhd2FpdGVyeS9idWlsZC90aW1lb3V0LmpzXCJcbmltcG9ydCBjb25maWd1cmF0aW9uUmVzb2x2ZXIgZnJvbSBcIi4uL2NvbmZpZ3VyYXRpb24tcmVzb2x2ZXIuanNcIlxuaW1wb3J0IEJhY2tncm91bmRKb2JzU29ja2V0UmVxdWVzdCBmcm9tIFwiLi9zb2NrZXQtcmVxdWVzdC5qc1wiXG5pbXBvcnQgeyBERUZBVUxUX0dFTkVSQVRJT05fSEFORFNIQUtFX1RJTUVPVVRfTVMsIHZhbGlkYXRlR2VuZXJhdGlvbkhhbmRzaGFrZVRpbWVvdXRNcyB9IGZyb20gXCIuL2dlbmVyYXRpb24taGFuZHNoYWtlLXRpbWVvdXQtZXJyb3IuanNcIlxuXG5jb25zdCBERUZBVUxUX0VOUVVFVUVfVElNRU9VVF9NUyA9IDUwMDBcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFja2dyb3VuZEpvYnNDbGllbnQge1xuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IFthcmdzXSAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBbYXJncy5jb25maWd1cmF0aW9uXSAtIENvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5lbnF1ZXVlVGltZW91dE1zXSAtIE1heGltdW0gdGltZSB0byB3YWl0IGZvciBhbiBlbnF1ZXVlIGFja25vd2xlZGdlbWVudCBpbiBtaWxsaXNlY29uZHMgKGRlZmF1bHQ6IDUwMDApLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MuZ2VuZXJhdGlvbkhhbmRzaGFrZVRpbWVvdXRNc10gLSBNYXhpbXVtIHRpbWUgdG8gd2FpdCBmb3IgZ2VuZXJhdGlvbiBhY2tub3dsZWRnZW1lbnQgKGRlZmF1bHQ6IDQwMDApLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZ2VuZXJhdGlvbklkXSAtIEV4cGxpY2l0IHJlbGVhc2UgZ2VuZXJhdGlvbiBpZGVudGl0eS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjb25maWd1cmF0aW9uLCBlbnF1ZXVlVGltZW91dE1zID0gREVGQVVMVF9FTlFVRVVFX1RJTUVPVVRfTVMsIGdlbmVyYXRpb25IYW5kc2hha2VUaW1lb3V0TXMgPSBERUZBVUxUX0dFTkVSQVRJT05fSEFORFNIQUtFX1RJTUVPVVRfTVMsIGdlbmVyYXRpb25JZH0gPSB7fSkge1xuICAgIHRoaXMuY29uZmlndXJhdGlvblByb21pc2UgPSBjb25maWd1cmF0aW9uID8gUHJvbWlzZS5yZXNvbHZlKGNvbmZpZ3VyYXRpb24pIDogY29uZmlndXJhdGlvblJlc29sdmVyKClcbiAgICB0aGlzLmVucXVldWVUaW1lb3V0TXMgPSBlbnF1ZXVlVGltZW91dE1zXG4gICAgdGhpcy5nZW5lcmF0aW9uSGFuZHNoYWtlVGltZW91dE1zID0gdmFsaWRhdGVHZW5lcmF0aW9uSGFuZHNoYWtlVGltZW91dE1zKGdlbmVyYXRpb25IYW5kc2hha2VUaW1lb3V0TXMpXG4gICAgdGhpcy5leHBsaWNpdEdlbmVyYXRpb25JZCA9IGdlbmVyYXRpb25JZFxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIG9uZS1zaG90IGNsaWVudCBzb2NrZXQgcmVxdWVzdCBmcm9tIHRoZSByZXNvbHZlZCBjb25maWd1cmF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxCYWNrZ3JvdW5kSm9ic1NvY2tldFJlcXVlc3Q+fSAtIFNvY2tldCByZXF1ZXN0LlxuICAgKi9cbiAgYXN5bmMgX3JlcXVlc3QoKSB7XG4gICAgY29uc3QgY29uZmlndXJhdGlvbiA9IGF3YWl0IHRoaXMuY29uZmlndXJhdGlvblByb21pc2VcbiAgICBjb25zdCB7aG9zdCwgcG9ydH0gPSBjb25maWd1cmF0aW9uLmdldEJhY2tncm91bmRKb2JzQ29uZmlnKClcbiAgICBjb25zdCB7Z2VuZXJhdGlvbklkfSA9IGNvbmZpZ3VyYXRpb24ucmVzb2x2ZUJhY2tncm91bmRKb2JzR2VuZXJhdGlvbkNvbmZpZyh7XG4gICAgICBnZW5lcmF0aW9uSWQ6IHRoaXMuZXhwbGljaXRHZW5lcmF0aW9uSWQsXG4gICAgICBzb3VyY2VOYW1lOiBcIkJhY2tncm91bmRKb2JzQ2xpZW50XCJcbiAgICB9KVxuXG4gICAgcmV0dXJuIG5ldyBCYWNrZ3JvdW5kSm9ic1NvY2tldFJlcXVlc3Qoe2hvc3QsIHBvcnQsIHJvbGU6IFwiY2xpZW50XCIsIGdlbmVyYXRpb25IYW5kc2hha2VUaW1lb3V0TXM6IHRoaXMuZ2VuZXJhdGlvbkhhbmRzaGFrZVRpbWVvdXRNcywgZ2VuZXJhdGlvbklkfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGVucXVldWUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muam9iTmFtZSAtIEpvYiBuYW1lLlxuICAgKiBAcGFyYW0ge0FycmF5PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gYXJncy5hcmdzIC0gSm9iIGFyZ3MuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iT3B0aW9uc30gW2FyZ3Mub3B0aW9uc10gLSBKb2Igb3B0aW9ucy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnByb2R1Y2VySW52b2NhdGlvbklkXSAtIFN0YWJsZSBpZGVudGl0eSBmb3Igb25lIG93bmVkIGVucXVldWUgaW52b2NhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJhY2tncm91bmRKb2JQcm9kdWNlclByb29mfSBbYXJncy5wcm9kdWNlclByb29mXSAtIEV4YWN0IGludGVybmFsIHByb2R1Y2VyIGhhbmRvZmYuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IC0gSm9iIGlkLlxuICAgKi9cbiAgYXN5bmMgZW5xdWV1ZSh7am9iTmFtZSwgYXJncywgb3B0aW9ucywgcHJvZHVjZXJJbnZvY2F0aW9uSWQsIHByb2R1Y2VyUHJvb2Z9KSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgIHR5cGU6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcImVucXVldWVcIiksXG4gICAgICBqb2JOYW1lLFxuICAgICAgYXJncyxcbiAgICAgIG9wdGlvbnMsXG4gICAgICAuLi4ocHJvZHVjZXJJbnZvY2F0aW9uSWQgPyB7cHJvZHVjZXJJbnZvY2F0aW9uSWR9IDoge30pLFxuICAgICAgLi4uKHByb2R1Y2VyUHJvb2YgPyB7cHJvZHVjZXJQcm9vZn0gOiB7fSlcbiAgICB9XG4gICAgY29uc3QgYWNrbm93bGVkZ2VtZW50ID0ge2V4cGxpY2l0bHlSZWplY3RlZDogZmFsc2UsIGdlbmVyYXRpb25GZW5jZWQ6IGZhbHNlLCByZXF1ZXN0U2VudDogZmFsc2V9XG4gICAgLyoqXG4gICAgICogU2VuZHMgb25lIGVucXVldWUgYXR0ZW1wdC4gQW4gb3duZWQgY2FsbGVyIG1heSByZXBsYXkgdGhpcyBleGFjdCBtZXNzYWdlXG4gICAgICogb25jZSB3aGVuIHRyYW5zcG9ydCBhY2tub3dsZWRnZW1lbnQgcmVtYWlucyBhbWJpZ3VvdXMgYWZ0ZXIgc2VuZC5cbiAgICAgKiBAcGFyYW0ge3tleHBsaWNpdGx5UmVqZWN0ZWQ6IGJvb2xlYW4sIGdlbmVyYXRpb25GZW5jZWQ6IGJvb2xlYW4sIHJlcXVlc3RTZW50OiBib29sZWFufSB8IHVuZGVmaW5lZH0gYXR0ZW1wdEFja25vd2xlZGdlbWVudCAtIEZpcnN0LWF0dGVtcHQgb2JzZXJ2YXRpb25zLlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IC0gSm9iIGlkLlxuICAgICAqL1xuICAgIGNvbnN0IGVucXVldWVBdHRlbXB0ID0gYXN5bmMgKGF0dGVtcHRBY2tub3dsZWRnZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBhd2FpdCB0aGlzLl9yZXF1ZXN0KClcbiAgICAgIGNvbnN0IHJlcXVlc3RBYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKClcbiAgICAgIGNvbnN0IHRpbWVvdXRFcnJvck1lc3NhZ2UgPSBgQmFja2dyb3VuZCBqb2IgZW5xdWV1ZSBhY2tub3dsZWRnZW1lbnQgdGltZWQgb3V0IGFmdGVyICR7dGhpcy5lbnF1ZXVlVGltZW91dE1zfW1zYFxuICAgICAgLyoqXG4gICAgICAgKiBSZXNvbHZlcyB0aGUgcHJlLXNlbmQgcGhhc2Ugd2hlbiB0aGUgbXV0YXRpb24gaGFzIGVudGVyZWQgdGhlIHNvY2tldC5cbiAgICAgICAqIEB0eXBlIHsoKSA9PiB2b2lkfVxuICAgICAgICovXG4gICAgICBsZXQgbWFya1JlcXVlc3RTZW50ID0gKCkgPT4ge31cbiAgICAgIGNvbnN0IHJlcXVlc3RTZW50ID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgbWFya1JlcXVlc3RTZW50ID0gKCkgPT4gcmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgICB9KVxuICAgICAgLyoqXG4gICAgICAgKiBBcHBsaWVzIHRoZSBjb25maWd1cmVkIGRlYWRsaW5lIGluZGVwZW5kZW50bHkgdG8gb25lIHJlcXVlc3QgcGhhc2UuXG4gICAgICAgKiBAdGVtcGxhdGUgVFxuICAgICAgICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPFQ+fSBjYWxsYmFjayAtIFBoYXNlIHdvcmsuXG4gICAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gLSBQaGFzZSByZXN1bHQuXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IHdpdGhFbnF1ZXVlVGltZW91dCA9IGFzeW5jIChjYWxsYmFjaykgPT4gYXdhaXQgdGltZW91dCh7XG4gICAgICAgIGVycm9yTWVzc2FnZTogdGltZW91dEVycm9yTWVzc2FnZSxcbiAgICAgICAgdGltZW91dDogdGhpcy5lbnF1ZXVlVGltZW91dE1zXG4gICAgICB9LCBhc3luYyAoe2NvbnRyb2x9KSA9PiB7XG4gICAgICAgIGNvbnN0IGFib3J0UmVxdWVzdCA9ICgpID0+IHJlcXVlc3RBYm9ydENvbnRyb2xsZXIuYWJvcnQoY29udHJvbC5zaWduYWwucmVhc29uKVxuXG4gICAgICAgIGNvbnRyb2wuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBhYm9ydFJlcXVlc3QpXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKClcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBjb250cm9sLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgYWJvcnRSZXF1ZXN0KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgY29uc3QgcmVxdWVzdFByb21pc2UgPSByZXF1ZXN0LnJ1bih7XG4gICAgICAgIHNpZ25hbDogcmVxdWVzdEFib3J0Q29udHJvbGxlci5zaWduYWwsXG4gICAgICAgIG9uQ29ubmVjdDogKGpzb25Tb2NrZXQpID0+IHtcbiAgICAgICAgICBqc29uU29ja2V0LnNlbmQobWVzc2FnZSlcbiAgICAgICAgICBpZiAoYXR0ZW1wdEFja25vd2xlZGdlbWVudCkge1xuICAgICAgICAgICAgYXR0ZW1wdEFja25vd2xlZGdlbWVudC5nZW5lcmF0aW9uRmVuY2VkID0gQm9vbGVhbihyZXF1ZXN0LmdlbmVyYXRpb25JZClcbiAgICAgICAgICAgIGF0dGVtcHRBY2tub3dsZWRnZW1lbnQucmVxdWVzdFNlbnQgPSB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICAgIG1hcmtSZXF1ZXN0U2VudCgpXG4gICAgICAgIH0sXG4gICAgICAgIG9uTWVzc2FnZTogKHttZXNzYWdlLCByZXNvbHZlLCByZWplY3R9KSA9PiB7XG4gICAgICAgICAgaWYgKG1lc3NhZ2U/LnR5cGUgPT09IFwiZW5xdWV1ZWRcIikge1xuICAgICAgICAgICAgcmVzb2x2ZShtZXNzYWdlLmpvYklkKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG1lc3NhZ2U/LnR5cGUgPT09IFwiZW5xdWV1ZS1lcnJvclwiKSB7XG4gICAgICAgICAgICBpZiAoYXR0ZW1wdEFja25vd2xlZGdlbWVudCkgYXR0ZW1wdEFja25vd2xlZGdlbWVudC5leHBsaWNpdGx5UmVqZWN0ZWQgPSB0cnVlXG4gICAgICAgICAgICByZWplY3QobmV3IEVycm9yKG1lc3NhZ2UuZXJyb3IgfHwgXCJGYWlsZWQgdG8gZW5xdWV1ZSBqb2JcIikpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBhd2FpdCB3aXRoRW5xdWV1ZVRpbWVvdXQoYXN5bmMgKCkgPT4gYXdhaXQgUHJvbWlzZS5yYWNlKFtyZXF1ZXN0U2VudCwgcmVxdWVzdFByb21pc2VdKSlcblxuICAgICAgcmV0dXJuIGF3YWl0IHdpdGhFbnF1ZXVlVGltZW91dChhc3luYyAoKSA9PiBhd2FpdCByZXF1ZXN0UHJvbWlzZSlcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGVucXVldWVBdHRlbXB0KGFja25vd2xlZGdlbWVudClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFwcm9kdWNlckludm9jYXRpb25JZCB8fCAhcHJvZHVjZXJQcm9vZiB8fCAhYWNrbm93bGVkZ2VtZW50LmdlbmVyYXRpb25GZW5jZWQgfHwgIWFja25vd2xlZGdlbWVudC5yZXF1ZXN0U2VudCB8fCBhY2tub3dsZWRnZW1lbnQuZXhwbGljaXRseVJlamVjdGVkKSB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBlbnF1ZXVlQXR0ZW1wdCh1bmRlZmluZWQpXG4gIH1cblxuICAvKipcbiAgICogQXRvbWljYWxseSByZXBsYWNlcyB0aGUgcXVldWVkIG93bmVyIG9mIGEgc3RhYmxlIHNjaGVkdWxlIGtleS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zY2hlZHVsZUtleSAtIFN0YWJsZSBsb2dpY2FsIHNjaGVkdWxlIGtleS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muam9iTmFtZSAtIEpvYiBuYW1lLlxuICAgKiBAcGFyYW0ge0FycmF5PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gYXJncy5hcmdzIC0gSm9iIGFyZ3MuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iT3B0aW9uc30gW2FyZ3Mub3B0aW9uc10gLSBKb2Igb3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iUmVwbGFjZW1lbnRSZXN1bHQ+fSAtIFJlcGxhY2VtZW50IHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIHJlcGxhY2VTY2hlZHVsZWQoe3NjaGVkdWxlS2V5LCBqb2JOYW1lLCBhcmdzLCBvcHRpb25zfSkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBhd2FpdCB0aGlzLl9yZXF1ZXN0KClcblxuICAgIHJldHVybiBhd2FpdCByZXF1ZXN0LnJ1bih7XG4gICAgICBvbkNvbm5lY3Q6IChqc29uU29ja2V0KSA9PiB7XG4gICAgICAgIGpzb25Tb2NrZXQuc2VuZCh7dHlwZTogXCJyZXBsYWNlLXNjaGVkdWxlZFwiLCBzY2hlZHVsZUtleSwgam9iTmFtZSwgYXJncywgb3B0aW9uc30pXG4gICAgICB9LFxuICAgICAgb25NZXNzYWdlOiAoe21lc3NhZ2UsIHJlc29sdmUsIHJlamVjdH0pID0+IHtcbiAgICAgICAgaWYgKG1lc3NhZ2U/LnR5cGUgPT09IFwic2NoZWR1bGUtcmVwbGFjZWRcIikge1xuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgam9iSWQ6IG1lc3NhZ2Uuam9iSWQsXG4gICAgICAgICAgICBwcmV2aW91c0pvYklkOiBtZXNzYWdlLnByZXZpb3VzSm9iSWQsXG4gICAgICAgICAgICBwcmV2aW91c1N0YXR1czogbWVzc2FnZS5wcmV2aW91c1N0YXR1c1xuICAgICAgICAgIH0pXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWVzc2FnZT8udHlwZSA9PT0gXCJyZXBsYWNlLXNjaGVkdWxlZC1lcnJvclwiKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihtZXNzYWdlLmVycm9yIHx8IFwiRmFpbGVkIHRvIHJlcGxhY2Ugc2NoZWR1bGVkIGpvYlwiKSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VscyBvciBkZXRhY2hlcyB0aGUgY3VycmVudCBvd25lciBvZiBhIHN0YWJsZSBzY2hlZHVsZSBrZXkuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc2NoZWR1bGVLZXkgLSBTdGFibGUgbG9naWNhbCBzY2hlZHVsZSBrZXkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYkNhbmNlbGxhdGlvblJlc3VsdD59IC0gQ2FuY2VsbGF0aW9uIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGNhbmNlbFNjaGVkdWxlZCh7c2NoZWR1bGVLZXl9KSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IGF3YWl0IHRoaXMuX3JlcXVlc3QoKVxuXG4gICAgcmV0dXJuIGF3YWl0IHJlcXVlc3QucnVuKHtcbiAgICAgIG9uQ29ubmVjdDogKGpzb25Tb2NrZXQpID0+IHtcbiAgICAgICAganNvblNvY2tldC5zZW5kKHt0eXBlOiBcImNhbmNlbC1zY2hlZHVsZWRcIiwgc2NoZWR1bGVLZXl9KVxuICAgICAgfSxcbiAgICAgIG9uTWVzc2FnZTogKHttZXNzYWdlLCByZXNvbHZlLCByZWplY3R9KSA9PiB7XG4gICAgICAgIGlmIChtZXNzYWdlPy50eXBlID09PSBcInNjaGVkdWxlLWNhbmNlbGxlZFwiKSB7XG4gICAgICAgICAgcmVzb2x2ZSh7am9iSWQ6IG1lc3NhZ2Uuam9iSWQsIG91dGNvbWU6IG1lc3NhZ2Uub3V0Y29tZX0pXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWVzc2FnZT8udHlwZSA9PT0gXCJjYW5jZWwtc2NoZWR1bGVkLWVycm9yXCIpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKG1lc3NhZ2UuZXJyb3IgfHwgXCJGYWlsZWQgdG8gY2FuY2VsIHNjaGVkdWxlZCBqb2JcIikpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG59XG4iXX0=
223
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhY2tncm91bmQtam9icy9jbGllbnQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sT0FBTyxFQUFFLEVBQUMsWUFBWSxFQUFDLE1BQU0sMkJBQTJCLENBQUE7QUFDL0QsT0FBTyxxQkFBcUIsTUFBTSw4QkFBOEIsQ0FBQTtBQUNoRSxPQUFPLCtDQUErQyxNQUFNLDRDQUE0QyxDQUFBO0FBQ3hHLE9BQU8sMkJBQTJCLE1BQU0scUJBQXFCLENBQUE7QUFDN0QsT0FBTyxFQUFFLHVDQUF1QyxFQUFFLG9DQUFvQyxFQUFFLE1BQU0seUNBQXlDLENBQUE7QUFFdkksTUFBTSwwQkFBMEIsR0FBRyxJQUFJLENBQUE7QUFFdkMsTUFBTSxDQUFDLE9BQU8sT0FBTyxvQkFBb0I7SUFDdkM7Ozs7Ozs7T0FPRztJQUNILFlBQVksRUFBQyxhQUFhLEVBQUUsZ0JBQWdCLEdBQUcsMEJBQTBCLEVBQUUsNEJBQTRCLEdBQUcsdUNBQXVDLEVBQUUsWUFBWSxFQUFDLEdBQUcsRUFBRTtRQUNuSyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsRUFBRSxDQUFBO1FBQ3BHLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQTtRQUN4QyxJQUFJLENBQUMsNEJBQTRCLEdBQUcsb0NBQW9DLENBQUMsNEJBQTRCLENBQUMsQ0FBQTtRQUN0RyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsWUFBWSxDQUFBO0lBQzFDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsUUFBUTtRQUNaLE1BQU0sYUFBYSxHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFBO1FBQ3JELE1BQU0sRUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFDLEdBQUcs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QUFFLElBQUksS0FBSyx3QkFBd0IsRUFBRSxDQUFDO29CQUMvQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxnQ0FBZ0MsQ0FBQyxDQUFDLENBQUE7Z0JBQ3RFLENBQUM7WUFDSCxDQUFDO1NBQ0YsQ0FBQyxDQUFBO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB0aW1lb3V0LCB7VGltZW91dEVycm9yfSBmcm9tIFwiYXdhaXRlcnkvYnVpbGQvdGltZW91dC5qc1wiXG5pbXBvcnQgY29uZmlndXJhdGlvblJlc29sdmVyIGZyb20gXCIuLi9jb25maWd1cmF0aW9uLXJlc29sdmVyLmpzXCJcbmltcG9ydCBCYWNrZ3JvdW5kSm9iRW5xdWV1ZUFja25vd2xlZGdlbWVudFRpbWVvdXRFcnJvciBmcm9tIFwiLi9lbnF1ZXVlLWFja25vd2xlZGdlbWVudC10aW1lb3V0LWVycm9yLmpzXCJcbmltcG9ydCBCYWNrZ3JvdW5kSm9ic1NvY2tldFJlcXVlc3QgZnJvbSBcIi4vc29ja2V0LXJlcXVlc3QuanNcIlxuaW1wb3J0IHsgREVGQVVMVF9HRU5FUkFUSU9OX0hBTkRTSEFLRV9USU1FT1VUX01TLCB2YWxpZGF0ZUdlbmVyYXRpb25IYW5kc2hha2VUaW1lb3V0TXMgfSBmcm9tIFwiLi9nZW5lcmF0aW9uLWhhbmRzaGFrZS10aW1lb3V0LWVycm9yLmpzXCJcblxuY29uc3QgREVGQVVMVF9FTlFVRVVFX1RJTUVPVVRfTVMgPSA1MDAwXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhY2tncm91bmRKb2JzQ2xpZW50IHtcbiAgLyoqXG4gICAqIFJ1bnMgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbYXJnc10gLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gW2FyZ3MuY29uZmlndXJhdGlvbl0gLSBDb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MuZW5xdWV1ZVRpbWVvdXRNc10gLSBNYXhpbXVtIHRpbWUgdG8gd2FpdCBmb3IgYW4gZW5xdWV1ZSBhY2tub3dsZWRnZW1lbnQgaW4gbWlsbGlzZWNvbmRzIChkZWZhdWx0OiA1MDAwKS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLmdlbmVyYXRpb25IYW5kc2hha2VUaW1lb3V0TXNdIC0gTWF4aW11bSB0aW1lIHRvIHdhaXQgZm9yIGdlbmVyYXRpb24gYWNrbm93bGVkZ2VtZW50IChkZWZhdWx0OiA0MDAwKS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmdlbmVyYXRpb25JZF0gLSBFeHBsaWNpdCByZWxlYXNlIGdlbmVyYXRpb24gaWRlbnRpdHkuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y29uZmlndXJhdGlvbiwgZW5xdWV1ZVRpbWVvdXRNcyA9IERFRkFVTFRfRU5RVUVVRV9USU1FT1VUX01TLCBnZW5lcmF0aW9uSGFuZHNoYWtlVGltZW91dE1zID0gREVGQVVMVF9HRU5FUkFUSU9OX0hBTkRTSEFLRV9USU1FT1VUX01TLCBnZW5lcmF0aW9uSWR9ID0ge30pIHtcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb25Qcm9taXNlID0gY29uZmlndXJhdGlvbiA/IFByb21pc2UucmVzb2x2ZShjb25maWd1cmF0aW9uKSA6IGNvbmZpZ3VyYXRpb25SZXNvbHZlcigpXG4gICAgdGhpcy5lbnF1ZXVlVGltZW91dE1zID0gZW5xdWV1ZVRpbWVvdXRNc1xuICAgIHRoaXMuZ2VuZXJhdGlvbkhhbmRzaGFrZVRpbWVvdXRNcyA9IHZhbGlkYXRlR2VuZXJhdGlvbkhhbmRzaGFrZVRpbWVvdXRNcyhnZW5lcmF0aW9uSGFuZHNoYWtlVGltZW91dE1zKVxuICAgIHRoaXMuZXhwbGljaXRHZW5lcmF0aW9uSWQgPSBnZW5lcmF0aW9uSWRcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBvbmUtc2hvdCBjbGllbnQgc29ja2V0IHJlcXVlc3QgZnJvbSB0aGUgcmVzb2x2ZWQgY29uZmlndXJhdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8QmFja2dyb3VuZEpvYnNTb2NrZXRSZXF1ZXN0Pn0gLSBTb2NrZXQgcmVxdWVzdC5cbiAgICovXG4gIGFzeW5jIF9yZXF1ZXN0KCkge1xuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb25Qcm9taXNlXG4gICAgY29uc3Qge2hvc3QsIHBvcnR9ID0gY29uZmlndXJhdGlvbi5nZXRCYWNrZ3JvdW5kSm9ic0NvbmZpZygpXG4gICAgY29uc3Qge2dlbmVyYXRpb25JZH0gPSBjb25maWd1cmF0aW9uLnJlc29sdmVCYWNrZ3JvdW5kSm9ic0dlbmVyYXRpb25Db25maWcoe1xuICAgICAgZ2VuZXJhdGlvbklkOiB0aGlzLmV4cGxpY2l0R2VuZXJhdGlvbklkLFxuICAgICAgc291cmNlTmFtZTogXCJCYWNrZ3JvdW5kSm9ic0NsaWVudFwiXG4gICAgfSlcblxuICAgIHJldHVybiBuZXcgQmFja2dyb3VuZEpvYnNTb2NrZXRSZXF1ZXN0KHtob3N0LCBwb3J0LCByb2xlOiBcImNsaWVudFwiLCBnZW5lcmF0aW9uSGFuZHNoYWtlVGltZW91dE1zOiB0aGlzLmdlbmVyYXRpb25IYW5kc2hha2VUaW1lb3V0TXMsIGdlbmVyYXRpb25JZH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBlbnF1ZXVlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmpvYk5hbWUgLSBKb2IgbmFtZS5cbiAgICogQHBhcmFtIHtBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IGFyZ3MuYXJncyAtIEpvYiBhcmdzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYk9wdGlvbnN9IFthcmdzLm9wdGlvbnNdIC0gSm9iIG9wdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5wcm9kdWNlckludm9jYXRpb25JZF0gLSBTdGFibGUgaWRlbnRpdHkgZm9yIG9uZSBvd25lZCBlbnF1ZXVlIGludm9jYXRpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iUHJvZHVjZXJQcm9vZn0gW2FyZ3MucHJvZHVjZXJQcm9vZl0gLSBFeGFjdCBpbnRlcm5hbCBwcm9kdWNlciBoYW5kb2ZmLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAtIEpvYiBpZC5cbiAgICovXG4gIGFzeW5jIGVucXVldWUoe2pvYk5hbWUsIGFyZ3MsIG9wdGlvbnMsIHByb2R1Y2VySW52b2NhdGlvbklkLCBwcm9kdWNlclByb29mfSkge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSB7XG4gICAgICB0eXBlOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJlbnF1ZXVlXCIpLFxuICAgICAgam9iTmFtZSxcbiAgICAgIGFyZ3MsXG4gICAgICBvcHRpb25zLFxuICAgICAgLi4uKHByb2R1Y2VySW52b2NhdGlvbklkID8ge3Byb2R1Y2VySW52b2NhdGlvbklkfSA6IHt9KSxcbiAgICAgIC4uLihwcm9kdWNlclByb29mID8ge3Byb2R1Y2VyUHJvb2Z9IDoge30pXG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgc2FmZSBvYnNlcnZhdGlvbnMgZm9yIG9uZSBhdHRlbXB0IHdpdGhvdXQgcmV0YWluaW5nIHJlcXVlc3QgZGF0YS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEF0dGVtcHQgaWRlbnRpdHkuXG4gICAgICogQHBhcmFtIHtcImluaXRpYWxcIiB8IFwib3duZWRfcmVwbGF5XCJ9IGFyZ3MuYXR0ZW1wdEtpbmQgLSBJbml0aWFsIGF0dGVtcHQgb3Igb3duZWQgcmVwbGF5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLmF0dGVtcHROdW1iZXIgLSBPbmUtYmFzZWQgYXR0ZW1wdCBudW1iZXIuXG4gICAgICogQHJldHVybnMge2ltcG9ydChcIi4vZW5xdWV1ZS1hY2tub3dsZWRnZW1lbnQtdGltZW91dC1lcnJvci5qc1wiKS5CYWNrZ3JvdW5kSm9iRW5xdWV1ZUF0dGVtcHR9IC0gTXV0YWJsZSBhdHRlbXB0IG9ic2VydmF0aW9ucy5cbiAgICAgKi9cbiAgICBjb25zdCBuZXdBdHRlbXB0T2JzZXJ2YXRpb24gPSAoe2F0dGVtcHRLaW5kLCBhdHRlbXB0TnVtYmVyfSkgPT4gKHtcbiAgICAgIGFja25vd2xlZGdlbWVudFdhaXRFbGFwc2VkTXM6IDAsXG4gICAgICBhdHRlbXB0RWxhcHNlZE1zOiAwLFxuICAgICAgYXR0ZW1wdEtpbmQsXG4gICAgICBhdHRlbXB0TnVtYmVyLFxuICAgICAgZXhwbGljaXRseVJlamVjdGVkOiBmYWxzZSxcbiAgICAgIGdlbmVyYXRpb25GZW5jZWQ6IGZhbHNlLFxuICAgICAgcmVxdWVzdFNlbnQ6IGZhbHNlXG4gICAgfSlcbiAgICAvKipcbiAgICAgKiBTZW5kcyBvbmUgZW5xdWV1ZSBhdHRlbXB0LiBBbiBvd25lZCBjYWxsZXIgbWF5IHJlcGxheSB0aGlzIGV4YWN0IG1lc3NhZ2VcbiAgICAgKiBvbmNlIHdoZW4gdHJhbnNwb3J0IGFja25vd2xlZGdlbWVudCByZW1haW5zIGFtYmlndW91cyBhZnRlciBzZW5kLlxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9lbnF1ZXVlLWFja25vd2xlZGdlbWVudC10aW1lb3V0LWVycm9yLmpzXCIpLkJhY2tncm91bmRKb2JFbnF1ZXVlQXR0ZW1wdH0gYXR0ZW1wdE9ic2VydmF0aW9uIC0gTXV0YWJsZSBhdHRlbXB0IG9ic2VydmF0aW9ucy5cbiAgICAgKiBAcGFyYW0ge1JlYWRvbmx5PEFycmF5PGltcG9ydChcIi4vZW5xdWV1ZS1hY2tub3dsZWRnZW1lbnQtdGltZW91dC1lcnJvci5qc1wiKS5CYWNrZ3JvdW5kSm9iRW5xdWV1ZUF0dGVtcHQ+Pn0gcHJldmlvdXNBdHRlbXB0cyAtIEVhcmxpZXIgdGltZWQtb3V0IGF0dGVtcHRzLlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IC0gSm9iIGlkLlxuICAgICAqL1xuICAgIGNvbnN0IGVucXVldWVBdHRlbXB0ID0gYXN5bmMgKGF0dGVtcHRPYnNlcnZhdGlvbiwgcHJldmlvdXNBdHRlbXB0cykgPT4ge1xuICAgICAgY29uc3QgYXR0ZW1wdFN0YXJ0ZWRBdE1zID0gRGF0ZS5ub3coKVxuICAgICAgY29uc3QgcmVxdWVzdCA9IGF3YWl0IHRoaXMuX3JlcXVlc3QoKVxuICAgICAgY29uc3QgcmVxdWVzdEFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICAgICAgY29uc3QgdGltZW91dEVycm9yTWVzc2FnZSA9IGBCYWNrZ3JvdW5kIGpvYiBlbnF1ZXVlIGFja25vd2xlZGdlbWVudCB0aW1lZCBvdXQgYWZ0ZXIgJHt0aGlzLmVucXVldWVUaW1lb3V0TXN9bXNgXG4gICAgICAvKiogQHR5cGUge251bWJlciB8IHVuZGVmaW5lZH0gKi9cbiAgICAgIGxldCByZXF1ZXN0U2VudEF0TXNcbiAgICAgIC8qKlxuICAgICAgICogUmVzb2x2ZXMgdGhlIHByZS1zZW5kIHBoYXNlIHdoZW4gdGhlIG11dGF0aW9uIGhhcyBlbnRlcmVkIHRoZSBzb2NrZXQuXG4gICAgICAgKiBAdHlwZSB7KCkgPT4gdm9pZH1cbiAgICAgICAqL1xuICAgICAgbGV0IG1hcmtSZXF1ZXN0U2VudCA9ICgpID0+IHt9XG4gICAgICBjb25zdCByZXF1ZXN0U2VudCA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIG1hcmtSZXF1ZXN0U2VudCA9ICgpID0+IHJlc29sdmUodW5kZWZpbmVkKVxuICAgICAgfSlcbiAgICAgIC8qKlxuICAgICAgICogQXBwbGllcyB0aGUgY29uZmlndXJlZCBkZWFkbGluZSBpbmRlcGVuZGVudGx5IHRvIG9uZSByZXF1ZXN0IHBoYXNlLlxuICAgICAgICogQHRlbXBsYXRlIFRcbiAgICAgICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxUPn0gY2FsbGJhY2sgLSBQaGFzZSB3b3JrLlxuICAgICAgICogQHJldHVybnMge1Byb21pc2U8VD59IC0gUGhhc2UgcmVzdWx0LlxuICAgICAgICovXG4gICAgICBjb25zdCB3aXRoRW5xdWV1ZVRpbWVvdXQgPSBhc3luYyAoY2FsbGJhY2spID0+IGF3YWl0IHRpbWVvdXQoe1xuICAgICAgICBlcnJvck1lc3NhZ2U6IHRpbWVvdXRFcnJvck1lc3NhZ2UsXG4gICAgICAgIHRpbWVvdXQ6IHRoaXMuZW5xdWV1ZVRpbWVvdXRNc1xuICAgICAgfSwgYXN5bmMgKHtjb250cm9sfSkgPT4ge1xuICAgICAgICBjb25zdCBhYm9ydFJlcXVlc3QgPSAoKSA9PiByZXF1ZXN0QWJvcnRDb250cm9sbGVyLmFib3J0KGNvbnRyb2wuc2lnbmFsLnJlYXNvbilcblxuICAgICAgICBjb250cm9sLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgYWJvcnRSZXF1ZXN0KVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCBjYWxsYmFjaygpXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgY29udHJvbC5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIGFib3J0UmVxdWVzdClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIGNvbnN0IHJlcXVlc3RQcm9taXNlID0gcmVxdWVzdC5ydW4oe1xuICAgICAgICBzaWduYWw6IHJlcXVlc3RBYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICBvbkNvbm5lY3Q6IChqc29uU29ja2V0KSA9PiB7XG4gICAgICAgICAganNvblNvY2tldC5zZW5kKG1lc3NhZ2UpXG4gICAgICAgICAgYXR0ZW1wdE9ic2VydmF0aW9uLmdlbmVyYXRpb25GZW5jZWQgPSBCb29sZWFuKHJlcXVlc3QuZ2VuZXJhdGlvbklkKVxuICAgICAgICAgIGF0dGVtcHRPYnNlcnZhdGlvbi5yZXF1ZXN0U2VudCA9IHRydWVcbiAgICAgICAgICByZXF1ZXN0U2VudEF0TXMgPSBEYXRlLm5vdygpXG4gICAgICAgICAgbWFya1JlcXVlc3RTZW50KClcbiAgICAgICAgfSxcbiAgICAgICAgb25NZXNzYWdlOiAoe21lc3NhZ2UsIHJlc29sdmUsIHJlamVjdH0pID0+IHtcbiAgICAgICAgICBpZiAobWVzc2FnZT8udHlwZSA9PT0gXCJlbnF1ZXVlZFwiKSB7XG4gICAgICAgICAgICByZXNvbHZlKG1lc3NhZ2Uuam9iSWQpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobWVzc2FnZT8udHlwZSA9PT0gXCJlbnF1ZXVlLWVycm9yXCIpIHtcbiAgICAgICAgICAgIGF0dGVtcHRPYnNlcnZhdGlvbi5leHBsaWNpdGx5UmVqZWN0ZWQgPSB0cnVlXG4gICAgICAgICAgICByZWplY3QobmV3IEVycm9yKG1lc3NhZ2UuZXJyb3IgfHwgXCJGYWlsZWQgdG8gZW5xdWV1ZSBqb2JcIikpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBhd2FpdCB3aXRoRW5xdWV1ZVRpbWVvdXQoYXN5bmMgKCkgPT4gYXdhaXQgUHJvbWlzZS5yYWNlKFtyZXF1ZXN0U2VudCwgcmVxdWVzdFByb21pc2VdKSlcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHdpdGhFbnF1ZXVlVGltZW91dChhc3luYyAoKSA9PiBhd2FpdCByZXF1ZXN0UHJvbWlzZSlcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmICghKGVycm9yIGluc3RhbmNlb2YgVGltZW91dEVycm9yKSkgdGhyb3cgZXJyb3JcbiAgICAgICAgaWYgKHJlcXVlc3RTZW50QXRNcyA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoXCJCYWNrZ3JvdW5kIGpvYiBlbnF1ZXVlIGFja25vd2xlZGdlbWVudCB3YWl0IHN0YXJ0ZWQgYmVmb3JlIHRoZSByZXF1ZXN0IHdhcyBzZW50XCIsIHtjYXVzZTogZXJyb3J9KVxuXG4gICAgICAgIGNvbnN0IHRpbWVkT3V0QXRNcyA9IERhdGUubm93KClcbiAgICAgICAgLy8gVGhlIGZpcmVkIHRpbWVyIHByb3ZlcyBpdHMgbG9naWNhbCBkZWFkbGluZSBldmVuIHdoZW4gdGhlIGFkanVzdGFibGUgd2FsbCBjbG9jayByZXBvcnRzIGEgc2hvcnRlciBpbnRlcnZhbC5cbiAgICAgICAgY29uc3QgYWNrbm93bGVkZ2VtZW50V2FpdEVsYXBzZWRNcyA9IE1hdGgubWF4KHRoaXMuZW5xdWV1ZVRpbWVvdXRNcywgdGltZWRPdXRBdE1zIC0gcmVxdWVzdFNlbnRBdE1zKVxuXG4gICAgICAgIGF0dGVtcHRPYnNlcnZhdGlvbi5hY2tub3dsZWRnZW1lbnRXYWl0RWxhcHNlZE1zID0gYWNrbm93bGVkZ2VtZW50V2FpdEVsYXBzZWRNc1xuICAgICAgICBhdHRlbXB0T2JzZXJ2YXRpb24uYXR0ZW1wdEVsYXBzZWRNcyA9IE1hdGgubWF4KGFja25vd2xlZGdlbWVudFdhaXRFbGFwc2VkTXMsIHRpbWVkT3V0QXRNcyAtIGF0dGVtcHRTdGFydGVkQXRNcylcblxuICAgICAgICB0aHJvdyBuZXcgQmFja2dyb3VuZEpvYkVucXVldWVBY2tub3dsZWRnZW1lbnRUaW1lb3V0RXJyb3Ioe1xuICAgICAgICAgIGFja25vd2xlZGdlbWVudFRpbWVvdXRNczogdGhpcy5lbnF1ZXVlVGltZW91dE1zLFxuICAgICAgICAgIGF0dGVtcHRIaXN0b3J5OiBbLi4ucHJldmlvdXNBdHRlbXB0cywgYXR0ZW1wdE9ic2VydmF0aW9uXSxcbiAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgZ2VuZXJhdGlvbklkOiByZXF1ZXN0LmdlbmVyYXRpb25JZCxcbiAgICAgICAgICBqb2JOYW1lLFxuICAgICAgICAgIHByb2R1Y2VySW52b2NhdGlvbklkLFxuICAgICAgICAgIHByb2R1Y2VyUHJvb2ZQcmVzZW50OiBCb29sZWFuKHByb2R1Y2VyUHJvb2YpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaW5pdGlhbEF0dGVtcHQgPSBuZXdBdHRlbXB0T2JzZXJ2YXRpb24oe2F0dGVtcHRLaW5kOiBcImluaXRpYWxcIiwgYXR0ZW1wdE51bWJlcjogMX0pXG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGVucXVldWVBdHRlbXB0KGluaXRpYWxBdHRlbXB0LCBbXSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFwcm9kdWNlckludm9jYXRpb25JZCB8fCAhcHJvZHVjZXJQcm9vZiB8fCAhaW5pdGlhbEF0dGVtcHQuZ2VuZXJhdGlvbkZlbmNlZCB8fCAhaW5pdGlhbEF0dGVtcHQucmVxdWVzdFNlbnQgfHwgaW5pdGlhbEF0dGVtcHQuZXhwbGljaXRseVJlamVjdGVkKSB0aHJvdyBlcnJvclxuXG4gICAgICBjb25zdCBwcmV2aW91c0F0dGVtcHRzID0gZXJyb3IgaW5zdGFuY2VvZiBCYWNrZ3JvdW5kSm9iRW5xdWV1ZUFja25vd2xlZGdlbWVudFRpbWVvdXRFcnJvciA/IGVycm9yLmF0dGVtcHRIaXN0b3J5IDogW11cbiAgICAgIGNvbnN0IHJlcGxheUF0dGVtcHQgPSBuZXdBdHRlbXB0T2JzZXJ2YXRpb24oe2F0dGVtcHRLaW5kOiBcIm93bmVkX3JlcGxheVwiLCBhdHRlbXB0TnVtYmVyOiAyfSlcblxuICAgICAgcmV0dXJuIGF3YWl0IGVucXVldWVBdHRlbXB0KHJlcGxheUF0dGVtcHQsIHByZXZpb3VzQXR0ZW1wdHMpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEF0b21pY2FsbHkgcmVwbGFjZXMgdGhlIHF1ZXVlZCBvd25lciBvZiBhIHN0YWJsZSBzY2hlZHVsZSBrZXkuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc2NoZWR1bGVLZXkgLSBTdGFibGUgbG9naWNhbCBzY2hlZHVsZSBrZXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmpvYk5hbWUgLSBKb2IgbmFtZS5cbiAgICogQHBhcmFtIHtBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IGFyZ3MuYXJncyAtIEpvYiBhcmdzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYk9wdGlvbnN9IFthcmdzLm9wdGlvbnNdIC0gSm9iIG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYlJlcGxhY2VtZW50UmVzdWx0Pn0gLSBSZXBsYWNlbWVudCByZXN1bHQuXG4gICAqL1xuICBhc3luYyByZXBsYWNlU2NoZWR1bGVkKHtzY2hlZHVsZUtleSwgam9iTmFtZSwgYXJncywgb3B0aW9uc30pIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gYXdhaXQgdGhpcy5fcmVxdWVzdCgpXG5cbiAgICByZXR1cm4gYXdhaXQgcmVxdWVzdC5ydW4oe1xuICAgICAgb25Db25uZWN0OiAoanNvblNvY2tldCkgPT4ge1xuICAgICAgICBqc29uU29ja2V0LnNlbmQoe3R5cGU6IFwicmVwbGFjZS1zY2hlZHVsZWRcIiwgc2NoZWR1bGVLZXksIGpvYk5hbWUsIGFyZ3MsIG9wdGlvbnN9KVxuICAgICAgfSxcbiAgICAgIG9uTWVzc2FnZTogKHttZXNzYWdlLCByZXNvbHZlLCByZWplY3R9KSA9PiB7XG4gICAgICAgIGlmIChtZXNzYWdlPy50eXBlID09PSBcInNjaGVkdWxlLXJlcGxhY2VkXCIpIHtcbiAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgIGpvYklkOiBtZXNzYWdlLmpvYklkLFxuICAgICAgICAgICAgcHJldmlvdXNKb2JJZDogbWVzc2FnZS5wcmV2aW91c0pvYklkLFxuICAgICAgICAgICAgcHJldmlvdXNTdGF0dXM6IG1lc3NhZ2UucHJldmlvdXNTdGF0dXNcbiAgICAgICAgICB9KVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1lc3NhZ2U/LnR5cGUgPT09IFwicmVwbGFjZS1zY2hlZHVsZWQtZXJyb3JcIikge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IobWVzc2FnZS5lcnJvciB8fCBcIkZhaWxlZCB0byByZXBsYWNlIHNjaGVkdWxlZCBqb2JcIikpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbHMgb3IgZGV0YWNoZXMgdGhlIGN1cnJlbnQgb3duZXIgb2YgYSBzdGFibGUgc2NoZWR1bGUga2V5LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnNjaGVkdWxlS2V5IC0gU3RhYmxlIGxvZ2ljYWwgc2NoZWR1bGUga2V5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJhY2tncm91bmRKb2JDYW5jZWxsYXRpb25SZXN1bHQ+fSAtIENhbmNlbGxhdGlvbiByZXN1bHQuXG4gICAqL1xuICBhc3luYyBjYW5jZWxTY2hlZHVsZWQoe3NjaGVkdWxlS2V5fSkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBhd2FpdCB0aGlzLl9yZXF1ZXN0KClcblxuICAgIHJldHVybiBhd2FpdCByZXF1ZXN0LnJ1bih7XG4gICAgICBvbkNvbm5lY3Q6IChqc29uU29ja2V0KSA9PiB7XG4gICAgICAgIGpzb25Tb2NrZXQuc2VuZCh7dHlwZTogXCJjYW5jZWwtc2NoZWR1bGVkXCIsIHNjaGVkdWxlS2V5fSlcbiAgICAgIH0sXG4gICAgICBvbk1lc3NhZ2U6ICh7bWVzc2FnZSwgcmVzb2x2ZSwgcmVqZWN0fSkgPT4ge1xuICAgICAgICBpZiAobWVzc2FnZT8udHlwZSA9PT0gXCJzY2hlZHVsZS1jYW5jZWxsZWRcIikge1xuICAgICAgICAgIHJlc29sdmUoe2pvYklkOiBtZXNzYWdlLmpvYklkLCBvdXRjb21lOiBtZXNzYWdlLm91dGNvbWV9KVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1lc3NhZ2U/LnR5cGUgPT09IFwiY2FuY2VsLXNjaGVkdWxlZC1lcnJvclwiKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihtZXNzYWdlLmVycm9yIHx8IFwiRmFpbGVkIHRvIGNhbmNlbCBzY2hlZHVsZWQgam9iXCIpKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxufVxuIl19
@@ -0,0 +1,81 @@
1
+ import { TimeoutError } from "awaitery/build/timeout.js";
2
+ export type BackgroundJobEnqueueAttempt = {
3
+ /**
4
+ * - Time spent waiting for the acknowledgement after send.
5
+ */
6
+ acknowledgementWaitElapsedMs: number;
7
+ /**
8
+ * - Total attempt time including connection and generation fencing.
9
+ */
10
+ attemptElapsedMs: number;
11
+ /**
12
+ * - Initial attempt or the one eligible owned replay.
13
+ */
14
+ attemptKind: "initial" | "owned_replay";
15
+ /**
16
+ * - One-based attempt number.
17
+ */
18
+ attemptNumber: number;
19
+ /**
20
+ * - Whether the main explicitly rejected the enqueue.
21
+ */
22
+ explicitlyRejected: boolean;
23
+ /**
24
+ * - Whether the configured generation accepted the connection before send.
25
+ */
26
+ generationFenced: boolean;
27
+ /**
28
+ * - Whether the enqueue request entered the socket.
29
+ */
30
+ requestSent: boolean;
31
+ };
32
+ /**
33
+ * @typedef {object} BackgroundJobEnqueueAttempt
34
+ * @property {number} acknowledgementWaitElapsedMs - Time spent waiting for the acknowledgement after send.
35
+ * @property {number} attemptElapsedMs - Total attempt time including connection and generation fencing.
36
+ * @property {"initial" | "owned_replay"} attemptKind - Initial attempt or the one eligible owned replay.
37
+ * @property {number} attemptNumber - One-based attempt number.
38
+ * @property {boolean} explicitlyRejected - Whether the main explicitly rejected the enqueue.
39
+ * @property {boolean} generationFenced - Whether the configured generation accepted the connection before send.
40
+ * @property {boolean} requestSent - Whether the enqueue request entered the socket.
41
+ */
42
+ /** Safe typed failure for an ambiguous post-send enqueue acknowledgement timeout. */
43
+ export default class BackgroundJobEnqueueAcknowledgementTimeoutError extends TimeoutError {
44
+ /** @type {"BACKGROUND_JOB_ENQUEUE_ACKNOWLEDGEMENT_TIMEOUT"} */
45
+ code: "BACKGROUND_JOB_ENQUEUE_ACKNOWLEDGEMENT_TIMEOUT";
46
+ acknowledgementTimeoutMs: number;
47
+ attemptHistory: readonly Readonly<{
48
+ acknowledgementWaitElapsedMs: number;
49
+ attemptElapsedMs: number;
50
+ attemptKind: "initial" | "owned_replay";
51
+ attemptNumber: number;
52
+ explicitlyRejected: boolean;
53
+ generationFenced: boolean;
54
+ requestSent: boolean;
55
+ }>[];
56
+ generationId: string | undefined;
57
+ jobName: string;
58
+ producerInvocationId: string | undefined;
59
+ producerProofPresent: boolean;
60
+ /**
61
+ * Builds an enqueue acknowledgement timeout error without request payload or connection details.
62
+ * @param {object} args - Safe timeout context.
63
+ * @param {number} args.acknowledgementTimeoutMs - Configured post-send acknowledgement deadline.
64
+ * @param {Array<BackgroundJobEnqueueAttempt>} args.attemptHistory - Safe observations for timed-out attempts.
65
+ * @param {TimeoutError} [args.cause] - Original Awaitery timeout.
66
+ * @param {string} [args.generationId] - Accepted release generation identity.
67
+ * @param {string} args.jobName - Resolved job class name.
68
+ * @param {string} [args.producerInvocationId] - Owned enqueue invocation identity.
69
+ * @param {boolean} args.producerProofPresent - Whether the request carried an internal producer proof.
70
+ */
71
+ constructor({ acknowledgementTimeoutMs, attemptHistory, cause, generationId, jobName, producerInvocationId, producerProofPresent }: {
72
+ acknowledgementTimeoutMs: number;
73
+ attemptHistory: Array<BackgroundJobEnqueueAttempt>;
74
+ cause?: TimeoutError;
75
+ generationId?: string;
76
+ jobName: string;
77
+ producerInvocationId?: string;
78
+ producerProofPresent: boolean;
79
+ });
80
+ }
81
+ //# sourceMappingURL=enqueue-acknowledgement-timeout-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enqueue-acknowledgement-timeout-error.d.ts","sourceRoot":"","sources":["../../../src/background-jobs/enqueue-acknowledgement-timeout-error.js"],"names":[],"mappings":"AAEA,OAAO,EAAC,YAAY,EAAC,MAAM,2BAA2B,CAAA;AAGnD,YAAkB,2BAA2B,GAC7C;;;;IAAmB,4BAA4B,EAApC,MAAM,CACjB;;;;IAAmB,gBAAgB,EAAxB,MAAM,CACjB;;;;IAAuC,WAAW,EAAvC,SAAS,GAAG,cAAc,CACrC;;;;IAAmB,aAAa,EAArB,MAAM,CACjB;;;;IAAoB,kBAAkB,EAA3B,OAAO,CAClB;;;;IAAoB,gBAAgB,EAAzB,OAAO,CAClB;;;;IAAoB,WAAW,EAApB,OAAO,CACpB;CAAA,CAAA;AATD;;;;;;;;;GASG;AAEH,qFAAqF;AACrF,MAAM,CAAC,OAAO,OAAO,+CAAgD,SAAQ,YAAY;IAgBrF,+DAA+D;IAC1D,IAAI,EADE,gDAAgD;IAEtD,wBAAwB;IACxB,cAAc;;;;;;;;;IASd,YAAY;IACZ,OAAO;IACP,oBAAoB;IACpB,oBAAoB;IA9B3B;;;;;;;;;;OAUG;IACH,YAAY,EAAC,wBAAwB,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAC,EAR7H;QAAqB,wBAAwB,EAArC,MAAM,CACd;QAAiD,cAAc,EAAvD,KAAK,CAAC,2BAA2B,CAAC,CAC1C;QAA4B,KAAK,AAAjC,CACA,EADQ,YAAY,CACpB;QAAsB,YAAY,AAAlC,CACA,EADQ,MAAM,CACd;QAAqB,OAAO,EAApB,MAAM,CACd;QAAsB,oBAAoB,AAA1C,CACA,EADQ,MAAM,CACd;QAAsB,oBAAoB,EAAlC,OAAO,CACjB;KAC+H,EAoB/H;CACF"}
@@ -0,0 +1,47 @@
1
+ // @ts-check
2
+ import { TimeoutError } from "awaitery/build/timeout.js";
3
+ /**
4
+ * @typedef {object} BackgroundJobEnqueueAttempt
5
+ * @property {number} acknowledgementWaitElapsedMs - Time spent waiting for the acknowledgement after send.
6
+ * @property {number} attemptElapsedMs - Total attempt time including connection and generation fencing.
7
+ * @property {"initial" | "owned_replay"} attemptKind - Initial attempt or the one eligible owned replay.
8
+ * @property {number} attemptNumber - One-based attempt number.
9
+ * @property {boolean} explicitlyRejected - Whether the main explicitly rejected the enqueue.
10
+ * @property {boolean} generationFenced - Whether the configured generation accepted the connection before send.
11
+ * @property {boolean} requestSent - Whether the enqueue request entered the socket.
12
+ */
13
+ /** Safe typed failure for an ambiguous post-send enqueue acknowledgement timeout. */
14
+ export default class BackgroundJobEnqueueAcknowledgementTimeoutError extends TimeoutError {
15
+ /**
16
+ * Builds an enqueue acknowledgement timeout error without request payload or connection details.
17
+ * @param {object} args - Safe timeout context.
18
+ * @param {number} args.acknowledgementTimeoutMs - Configured post-send acknowledgement deadline.
19
+ * @param {Array<BackgroundJobEnqueueAttempt>} args.attemptHistory - Safe observations for timed-out attempts.
20
+ * @param {TimeoutError} [args.cause] - Original Awaitery timeout.
21
+ * @param {string} [args.generationId] - Accepted release generation identity.
22
+ * @param {string} args.jobName - Resolved job class name.
23
+ * @param {string} [args.producerInvocationId] - Owned enqueue invocation identity.
24
+ * @param {boolean} args.producerProofPresent - Whether the request carried an internal producer proof.
25
+ */
26
+ constructor({ acknowledgementTimeoutMs, attemptHistory, cause, generationId, jobName, producerInvocationId, producerProofPresent }) {
27
+ super(`Background job enqueue acknowledgement timed out after ${acknowledgementTimeoutMs}ms`, cause ? { cause } : undefined);
28
+ this.name = "BackgroundJobEnqueueAcknowledgementTimeoutError";
29
+ /** @type {"BACKGROUND_JOB_ENQUEUE_ACKNOWLEDGEMENT_TIMEOUT"} */
30
+ this.code = "BACKGROUND_JOB_ENQUEUE_ACKNOWLEDGEMENT_TIMEOUT";
31
+ this.acknowledgementTimeoutMs = acknowledgementTimeoutMs;
32
+ this.attemptHistory = Object.freeze(attemptHistory.map((attempt) => Object.freeze({
33
+ acknowledgementWaitElapsedMs: attempt.acknowledgementWaitElapsedMs,
34
+ attemptElapsedMs: attempt.attemptElapsedMs,
35
+ attemptKind: attempt.attemptKind,
36
+ attemptNumber: attempt.attemptNumber,
37
+ explicitlyRejected: attempt.explicitlyRejected,
38
+ generationFenced: attempt.generationFenced,
39
+ requestSent: attempt.requestSent
40
+ })));
41
+ this.generationId = generationId;
42
+ this.jobName = jobName;
43
+ this.producerInvocationId = producerInvocationId;
44
+ this.producerProofPresent = producerProofPresent;
45
+ }
46
+ }
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5xdWV1ZS1hY2tub3dsZWRnZW1lbnQtdGltZW91dC1lcnJvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iYWNrZ3JvdW5kLWpvYnMvZW5xdWV1ZS1hY2tub3dsZWRnZW1lbnQtdGltZW91dC1lcnJvci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDJCQUEyQixDQUFBO0FBRXREOzs7Ozs7Ozs7R0FTRztBQUVILHFGQUFxRjtBQUNyRixNQUFNLENBQUMsT0FBTyxPQUFPLCtDQUFnRCxTQUFRLFlBQVk7SUFDdkY7Ozs7Ozs7Ozs7T0FVRztJQUNILFlBQVksRUFBQyx3QkFBd0IsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsb0JBQW9CLEVBQUM7UUFDOUgsS0FBSyxDQUFDLDBEQUEwRCx3QkFBd0IsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUE7UUFFMUgsSUFBSSxDQUFDLElBQUksR0FBRyxpREFBaUQsQ0FBQTtRQUM3RCwrREFBK0Q7UUFDL0QsSUFBSSxDQUFDLElBQUksR0FBRyxnREFBZ0QsQ0FBQTtRQUM1RCxJQUFJLENBQUMsd0JBQXdCLEdBQUcsd0JBQXdCLENBQUE7UUFDeEQsSUFBSSxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDaEYsNEJBQTRCLEVBQUUsT0FBTyxDQUFDLDRCQUE0QjtZQUNsRSxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsZ0JBQWdCO1lBQzFDLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVztZQUNoQyxhQUFhLEVBQUUsT0FBTyxDQUFDLGFBQWE7WUFDcEMsa0JBQWtCLEVBQUUsT0FBTyxDQUFDLGtCQUFrQjtZQUM5QyxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsZ0JBQWdCO1lBQzFDLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVztTQUNqQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ0osSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUE7UUFDaEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUE7UUFDdEIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLG9CQUFvQixDQUFBO1FBQ2hELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxvQkFBb0IsQ0FBQTtJQUNsRCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtUaW1lb3V0RXJyb3J9IGZyb20gXCJhd2FpdGVyeS9idWlsZC90aW1lb3V0LmpzXCJcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCYWNrZ3JvdW5kSm9iRW5xdWV1ZUF0dGVtcHRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBhY2tub3dsZWRnZW1lbnRXYWl0RWxhcHNlZE1zIC0gVGltZSBzcGVudCB3YWl0aW5nIGZvciB0aGUgYWNrbm93bGVkZ2VtZW50IGFmdGVyIHNlbmQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gYXR0ZW1wdEVsYXBzZWRNcyAtIFRvdGFsIGF0dGVtcHQgdGltZSBpbmNsdWRpbmcgY29ubmVjdGlvbiBhbmQgZ2VuZXJhdGlvbiBmZW5jaW5nLlxuICogQHByb3BlcnR5IHtcImluaXRpYWxcIiB8IFwib3duZWRfcmVwbGF5XCJ9IGF0dGVtcHRLaW5kIC0gSW5pdGlhbCBhdHRlbXB0IG9yIHRoZSBvbmUgZWxpZ2libGUgb3duZWQgcmVwbGF5LlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGF0dGVtcHROdW1iZXIgLSBPbmUtYmFzZWQgYXR0ZW1wdCBudW1iZXIuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGV4cGxpY2l0bHlSZWplY3RlZCAtIFdoZXRoZXIgdGhlIG1haW4gZXhwbGljaXRseSByZWplY3RlZCB0aGUgZW5xdWV1ZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZ2VuZXJhdGlvbkZlbmNlZCAtIFdoZXRoZXIgdGhlIGNvbmZpZ3VyZWQgZ2VuZXJhdGlvbiBhY2NlcHRlZCB0aGUgY29ubmVjdGlvbiBiZWZvcmUgc2VuZC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmVxdWVzdFNlbnQgLSBXaGV0aGVyIHRoZSBlbnF1ZXVlIHJlcXVlc3QgZW50ZXJlZCB0aGUgc29ja2V0LlxuICovXG5cbi8qKiBTYWZlIHR5cGVkIGZhaWx1cmUgZm9yIGFuIGFtYmlndW91cyBwb3N0LXNlbmQgZW5xdWV1ZSBhY2tub3dsZWRnZW1lbnQgdGltZW91dC4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhY2tncm91bmRKb2JFbnF1ZXVlQWNrbm93bGVkZ2VtZW50VGltZW91dEVycm9yIGV4dGVuZHMgVGltZW91dEVycm9yIHtcbiAgLyoqXG4gICAqIEJ1aWxkcyBhbiBlbnF1ZXVlIGFja25vd2xlZGdlbWVudCB0aW1lb3V0IGVycm9yIHdpdGhvdXQgcmVxdWVzdCBwYXlsb2FkIG9yIGNvbm5lY3Rpb24gZGV0YWlscy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBTYWZlIHRpbWVvdXQgY29udGV4dC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGFyZ3MuYWNrbm93bGVkZ2VtZW50VGltZW91dE1zIC0gQ29uZmlndXJlZCBwb3N0LXNlbmQgYWNrbm93bGVkZ2VtZW50IGRlYWRsaW5lLlxuICAgKiBAcGFyYW0ge0FycmF5PEJhY2tncm91bmRKb2JFbnF1ZXVlQXR0ZW1wdD59IGFyZ3MuYXR0ZW1wdEhpc3RvcnkgLSBTYWZlIG9ic2VydmF0aW9ucyBmb3IgdGltZWQtb3V0IGF0dGVtcHRzLlxuICAgKiBAcGFyYW0ge1RpbWVvdXRFcnJvcn0gW2FyZ3MuY2F1c2VdIC0gT3JpZ2luYWwgQXdhaXRlcnkgdGltZW91dC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmdlbmVyYXRpb25JZF0gLSBBY2NlcHRlZCByZWxlYXNlIGdlbmVyYXRpb24gaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmpvYk5hbWUgLSBSZXNvbHZlZCBqb2IgY2xhc3MgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnByb2R1Y2VySW52b2NhdGlvbklkXSAtIE93bmVkIGVucXVldWUgaW52b2NhdGlvbiBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtib29sZWFufSBhcmdzLnByb2R1Y2VyUHJvb2ZQcmVzZW50IC0gV2hldGhlciB0aGUgcmVxdWVzdCBjYXJyaWVkIGFuIGludGVybmFsIHByb2R1Y2VyIHByb29mLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2Fja25vd2xlZGdlbWVudFRpbWVvdXRNcywgYXR0ZW1wdEhpc3RvcnksIGNhdXNlLCBnZW5lcmF0aW9uSWQsIGpvYk5hbWUsIHByb2R1Y2VySW52b2NhdGlvbklkLCBwcm9kdWNlclByb29mUHJlc2VudH0pIHtcbiAgICBzdXBlcihgQmFja2dyb3VuZCBqb2IgZW5xdWV1ZSBhY2tub3dsZWRnZW1lbnQgdGltZWQgb3V0IGFmdGVyICR7YWNrbm93bGVkZ2VtZW50VGltZW91dE1zfW1zYCwgY2F1c2UgPyB7Y2F1c2V9IDogdW5kZWZpbmVkKVxuXG4gICAgdGhpcy5uYW1lID0gXCJCYWNrZ3JvdW5kSm9iRW5xdWV1ZUFja25vd2xlZGdlbWVudFRpbWVvdXRFcnJvclwiXG4gICAgLyoqIEB0eXBlIHtcIkJBQ0tHUk9VTkRfSk9CX0VOUVVFVUVfQUNLTk9XTEVER0VNRU5UX1RJTUVPVVRcIn0gKi9cbiAgICB0aGlzLmNvZGUgPSBcIkJBQ0tHUk9VTkRfSk9CX0VOUVVFVUVfQUNLTk9XTEVER0VNRU5UX1RJTUVPVVRcIlxuICAgIHRoaXMuYWNrbm93bGVkZ2VtZW50VGltZW91dE1zID0gYWNrbm93bGVkZ2VtZW50VGltZW91dE1zXG4gICAgdGhpcy5hdHRlbXB0SGlzdG9yeSA9IE9iamVjdC5mcmVlemUoYXR0ZW1wdEhpc3RvcnkubWFwKChhdHRlbXB0KSA9PiBPYmplY3QuZnJlZXplKHtcbiAgICAgIGFja25vd2xlZGdlbWVudFdhaXRFbGFwc2VkTXM6IGF0dGVtcHQuYWNrbm93bGVkZ2VtZW50V2FpdEVsYXBzZWRNcyxcbiAgICAgIGF0dGVtcHRFbGFwc2VkTXM6IGF0dGVtcHQuYXR0ZW1wdEVsYXBzZWRNcyxcbiAgICAgIGF0dGVtcHRLaW5kOiBhdHRlbXB0LmF0dGVtcHRLaW5kLFxuICAgICAgYXR0ZW1wdE51bWJlcjogYXR0ZW1wdC5hdHRlbXB0TnVtYmVyLFxuICAgICAgZXhwbGljaXRseVJlamVjdGVkOiBhdHRlbXB0LmV4cGxpY2l0bHlSZWplY3RlZCxcbiAgICAgIGdlbmVyYXRpb25GZW5jZWQ6IGF0dGVtcHQuZ2VuZXJhdGlvbkZlbmNlZCxcbiAgICAgIHJlcXVlc3RTZW50OiBhdHRlbXB0LnJlcXVlc3RTZW50XG4gICAgfSkpKVxuICAgIHRoaXMuZ2VuZXJhdGlvbklkID0gZ2VuZXJhdGlvbklkXG4gICAgdGhpcy5qb2JOYW1lID0gam9iTmFtZVxuICAgIHRoaXMucHJvZHVjZXJJbnZvY2F0aW9uSWQgPSBwcm9kdWNlckludm9jYXRpb25JZFxuICAgIHRoaXMucHJvZHVjZXJQcm9vZlByZXNlbnQgPSBwcm9kdWNlclByb29mUHJlc2VudFxuICB9XG59XG4iXX0=
@@ -153,13 +153,20 @@ export default class SyncPublisher {
153
153
  /**
154
154
  * Upserts the published server-origin sync row for a resource identity:
155
155
  * server-origin rows carry a null actor column (no device to echo the
156
- * change back to), so repeated server changes to one resource reuse and
157
- * re-sequence one feed row.
156
+ * change back to), so repeated server changes to one complete resource and
157
+ * scope identity reuse and re-sequence one feed row. A database advisory
158
+ * lock serializes reconciliation plus the shared upsert because unique
159
+ * constraints containing nullable actor/scope columns do not enforce this
160
+ * identity portably across supported databases. Reconciliation retains the
161
+ * row with the newest feed sequence (then lowest id for a deterministic tie)
162
+ * and removes older matching server-origin rows before applying the current
163
+ * mutation.
158
164
  * @param {Record<string, ReturnType<typeof JSON.parse>>} attributes - Snapshotted sync row attributes.
159
165
  * @param {ReturnType<typeof JSON.parse>} syncModel - Operation-bound or static Sync model interface.
166
+ * @param {string[]} scopeColumnNames - Persisted scope columns participating in the complete identity.
160
167
  * @returns {Promise<ReturnType<typeof JSON.parse>>} Upserted sync row.
161
168
  */
162
- upsertPublishedSyncRow(attributes: Record<string, ReturnType<typeof JSON.parse>>, syncModel?: ReturnType<typeof JSON.parse>): Promise<ReturnType<typeof JSON.parse>>;
169
+ upsertPublishedSyncRow(attributes: Record<string, ReturnType<typeof JSON.parse>>, syncModel?: ReturnType<typeof JSON.parse>, scopeColumnNames?: string[]): Promise<ReturnType<typeof JSON.parse>>;
163
170
  /**
164
171
  * Returns the broadcaster delivering declared broadcasts: the injected one,
165
172
  * or the configuration's channel broadcast awaited through the pending
@@ -1 +1 @@
1
- {"version":3,"file":"sync-publisher.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-publisher.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sync-publisher.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-publisher.js"],"names":[],"mappings":"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"}