velocious 1.0.556 → 1.0.558

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.
Files changed (67) hide show
  1. package/README.md +16 -2
  2. package/build/background-jobs/forked-runner-child.js +20 -2
  3. package/build/background-jobs/main.js +35 -12
  4. package/build/background-jobs/pooled-runner-child.js +20 -2
  5. package/build/background-jobs/runner-graceful-shutdown.js +73 -0
  6. package/build/background-jobs/worker.js +53 -28
  7. package/build/configuration.js +77 -12
  8. package/build/database/advisory-lock-runner.js +12 -3
  9. package/build/database/record/index.js +12 -0
  10. package/build/frontend-models/base.js +192 -41
  11. package/build/http-client/websocket-client.js +48 -0
  12. package/build/src/background-jobs/forked-runner-child.js +20 -3
  13. package/build/src/background-jobs/main.d.ts +14 -1
  14. package/build/src/background-jobs/main.d.ts.map +1 -1
  15. package/build/src/background-jobs/main.js +37 -14
  16. package/build/src/background-jobs/pooled-runner-child.js +19 -3
  17. package/build/src/background-jobs/runner-graceful-shutdown.d.ts +49 -0
  18. package/build/src/background-jobs/runner-graceful-shutdown.d.ts.map +1 -0
  19. package/build/src/background-jobs/runner-graceful-shutdown.js +70 -0
  20. package/build/src/background-jobs/worker.d.ts +18 -1
  21. package/build/src/background-jobs/worker.d.ts.map +1 -1
  22. package/build/src/background-jobs/worker.js +55 -31
  23. package/build/src/configuration.d.ts +29 -0
  24. package/build/src/configuration.d.ts.map +1 -1
  25. package/build/src/configuration.js +71 -11
  26. package/build/src/database/advisory-lock-runner.d.ts.map +1 -1
  27. package/build/src/database/advisory-lock-runner.js +12 -4
  28. package/build/src/database/record/index.d.ts.map +1 -1
  29. package/build/src/database/record/index.js +9 -1
  30. package/build/src/frontend-models/base.d.ts +13 -4
  31. package/build/src/frontend-models/base.d.ts.map +1 -1
  32. package/build/src/frontend-models/base.js +173 -44
  33. package/build/src/http-client/websocket-client.d.ts +3 -0
  34. package/build/src/http-client/websocket-client.d.ts.map +1 -1
  35. package/build/src/http-client/websocket-client.js +42 -1
  36. package/build/src/tenants/tenant.d.ts +20 -9
  37. package/build/src/tenants/tenant.d.ts.map +1 -1
  38. package/build/src/tenants/tenant.js +47 -12
  39. package/build/src/testing/factory/factory-registry.d.ts +22 -3
  40. package/build/src/testing/factory/factory-registry.d.ts.map +1 -1
  41. package/build/src/testing/factory/factory-registry.js +32 -9
  42. package/build/src/testing/factory/factory-runner.d.ts +16 -4
  43. package/build/src/testing/factory/factory-runner.d.ts.map +1 -1
  44. package/build/src/testing/factory/factory-runner.js +33 -10
  45. package/build/src/utils/shutdown-lifecycle.d.ts +12 -0
  46. package/build/src/utils/shutdown-lifecycle.d.ts.map +1 -0
  47. package/build/src/utils/shutdown-lifecycle.js +36 -0
  48. package/build/tenants/tenant.js +51 -11
  49. package/build/testing/factory/factory-registry.js +33 -8
  50. package/build/testing/factory/factory-runner.js +38 -12
  51. package/build/tsconfig.tsbuildinfo +1 -1
  52. package/build/utils/shutdown-lifecycle.js +41 -0
  53. package/package.json +5 -4
  54. package/src/background-jobs/forked-runner-child.js +20 -2
  55. package/src/background-jobs/main.js +35 -12
  56. package/src/background-jobs/pooled-runner-child.js +20 -2
  57. package/src/background-jobs/runner-graceful-shutdown.js +73 -0
  58. package/src/background-jobs/worker.js +53 -28
  59. package/src/configuration.js +77 -12
  60. package/src/database/advisory-lock-runner.js +12 -3
  61. package/src/database/record/index.js +12 -0
  62. package/src/frontend-models/base.js +192 -41
  63. package/src/http-client/websocket-client.js +48 -0
  64. package/src/tenants/tenant.js +51 -11
  65. package/src/testing/factory/factory-registry.js +33 -8
  66. package/src/testing/factory/factory-runner.js +38 -12
  67. package/src/utils/shutdown-lifecycle.js +41 -0
@@ -12,7 +12,7 @@ import {deserializeFrontendModelTransportValue, serializeFrontendModelTransportV
12
12
  import runWithTransportDeadline from "./transport-deadline.js"
13
13
  import {REQUEST_TIME_ZONE_HEADER, validateTimeZone} from "../time-zone.js"
14
14
  import VelociousWebsocketClient from "../http-client/websocket-client.js"
15
- import {bufferOutgoingEvent, drainBufferedOutgoingEvents} from "./outgoing-event-buffer.js"
15
+ import {bufferOutgoingEvent, clearBufferedOutgoingEvents, drainBufferedOutgoingEvents} from "./outgoing-event-buffer.js"
16
16
  import {defineModelScope} from "../utils/model-scope.js"
17
17
  import isPlainObject from "../utils/plain-object.js"
18
18
  import {readPayloadAssociationCount, readPayloadComputedAbility, readPayloadQueryData, setPayloadAssociationCount, setPayloadComputedAbility, setPayloadQueryData} from "../record-payload-values.js"
@@ -154,6 +154,64 @@ let frontendModelIdleResolvers = []
154
154
  * Internal websocket client.
155
155
  * @type {VelociousWebsocketClient | null} */
156
156
  let internalWebsocketClient = null
157
+ /** @type {AbortSignal | null} */
158
+ let internalWebsocketClientSignal = null
159
+ /** @type {(() => void) | null} */
160
+ let internalWebsocketClientSignalCleanup = null
161
+
162
+ /**
163
+ * Detaches an owned WebSocket client from the shared cache if it is still current.
164
+ * @param {VelociousWebsocketClient} client - Client whose ownership is ending.
165
+ * @returns {void}
166
+ */
167
+ function detachInternalWebsocketClient(client) {
168
+ if (internalWebsocketClient !== client) return
169
+
170
+ internalWebsocketClient = null
171
+ internalWebsocketClientSignalCleanup?.()
172
+ internalWebsocketClientSignal = null
173
+ internalWebsocketClientSignalCleanup = null
174
+ }
175
+
176
+ /**
177
+ * Disposes the owned WebSocket client before transport/session configuration changes.
178
+ * @returns {void}
179
+ */
180
+ function resetInternalWebsocketClient() {
181
+ const client = internalWebsocketClient
182
+
183
+ if (!client) return
184
+
185
+ detachInternalWebsocketClient(client)
186
+ void client.disconnectAndStopReconnect()
187
+ }
188
+
189
+ /**
190
+ * Binds the owned WebSocket client lifetime to the current session signal.
191
+ * @param {AbortSignal | undefined} sessionSignal - Current session signal.
192
+ * @returns {void}
193
+ */
194
+ function bindInternalWebsocketClientSignal(sessionSignal) {
195
+ if (internalWebsocketClientSignal === sessionSignal) return
196
+
197
+ internalWebsocketClientSignalCleanup?.()
198
+ internalWebsocketClientSignal = sessionSignal || null
199
+ internalWebsocketClientSignalCleanup = null
200
+
201
+ if (!sessionSignal || !internalWebsocketClient) return
202
+
203
+ const client = internalWebsocketClient
204
+ const onSessionAbort = () => {
205
+ detachInternalWebsocketClient(client)
206
+ clearBufferedOutgoingEvents()
207
+ void client.disconnectAndStopReconnect()
208
+ }
209
+
210
+ sessionSignal.addEventListener("abort", onSessionAbort, {once: true})
211
+ internalWebsocketClientSignalCleanup = () => sessionSignal.removeEventListener("abort", onSessionAbort)
212
+
213
+ if (sessionSignal.aborted) onSessionAbort()
214
+ }
157
215
 
158
216
  /**
159
217
  * Runs frontend model transport is idle.
@@ -237,7 +295,13 @@ async function trackFrontendModelTransportRequest(callback) {
237
295
  * @returns {VelociousWebsocketClient | null} Websocket client or null.
238
296
  */
239
297
  function resolveInternalWebsocketClient() {
240
- if (internalWebsocketClient) return internalWebsocketClient
298
+ if (internalWebsocketClient) {
299
+ const client = internalWebsocketClient
300
+
301
+ bindInternalWebsocketClientSignal(frontendModelTransportSignal())
302
+
303
+ return client
304
+ }
241
305
 
242
306
  const websocketUrl = frontendModelTransportConfig.websocketUrl
243
307
 
@@ -248,41 +312,68 @@ function resolveInternalWebsocketClient() {
248
312
 
249
313
  if (!resolvedUrl) return null
250
314
 
251
- internalWebsocketClient = new VelociousWebsocketClient({
315
+ const client = new VelociousWebsocketClient({
252
316
  autoReconnect: true,
253
317
  sessionStore: frontendModelTransportConfig.sessionStore,
254
318
  url: resolvedUrl
255
319
  })
256
- internalWebsocketClient.onReconnect = flushBufferedOutgoingEventsAfterReconnect
320
+ internalWebsocketClient = client
321
+ client.onReconnect = async () => await flushBufferedOutgoingEventsAfterReconnect(client)
257
322
 
258
- return internalWebsocketClient
323
+ bindInternalWebsocketClientSignal(frontendModelTransportSignal())
324
+
325
+ return client
259
326
  }
260
327
 
261
328
  /**
262
329
  * Runs flush buffered outgoing events after reconnect.
330
+ * @param {VelociousWebsocketClient} client - Reconnected client that owns this flush.
263
331
  * @returns {Promise<void>} */
264
- async function flushBufferedOutgoingEventsAfterReconnect() {
265
- if (!internalWebsocketClient) return
332
+ async function flushBufferedOutgoingEventsAfterReconnect(client) {
333
+ if (internalWebsocketClient !== client) return
266
334
 
267
335
  const events = drainBufferedOutgoingEvents()
336
+ const sessionSignal = frontendModelTransportSignal()
268
337
 
269
- for (let index = 0; index < events.length; index += 1) {
270
- try {
271
- await internalWebsocketClient.post(events[index].customPath, events[index].payload)
272
- } catch {
273
- const socketOpen = internalWebsocketClient.socket?.readyState === internalWebsocketClient.socket?.OPEN
338
+ await runWithTransportDeadline(
339
+ {
340
+ errorMessage: "Buffered frontend-model WebSocket flush timed out",
341
+ signal: sessionSignal,
342
+ timeoutMs: frontendModelTransportTimeoutMs()
343
+ },
344
+ async (signal) => {
345
+ for (let index = 0; index < events.length; index += 1) {
346
+ if (internalWebsocketClient !== client) return
274
347
 
275
- if (socketOpen) {
276
- continue
277
- }
348
+ try {
349
+ await client.post(events[index].customPath, events[index].payload, {signal})
278
350
 
279
- for (let remaining = index; remaining < events.length; remaining += 1) {
280
- bufferOutgoingEvent(events[remaining])
281
- }
351
+ if (internalWebsocketClient !== client) return
352
+ } catch {
353
+ if (internalWebsocketClient !== client) return
354
+ if (sessionSignal?.aborted) return
282
355
 
283
- return
356
+ if (signal.aborted) {
357
+ for (let remaining = index; remaining < events.length; remaining += 1) {
358
+ bufferOutgoingEvent(events[remaining])
359
+ }
360
+
361
+ return
362
+ }
363
+
364
+ const socketOpen = client.socket?.readyState === client.socket?.OPEN
365
+
366
+ if (socketOpen) continue
367
+
368
+ for (let remaining = index; remaining < events.length; remaining += 1) {
369
+ bufferOutgoingEvent(events[remaining])
370
+ }
371
+
372
+ return
373
+ }
374
+ }
284
375
  }
285
- }
376
+ )
286
377
  }
287
378
 
288
379
  /**
@@ -1784,6 +1875,29 @@ function frontendModelTransportSignal() {
1784
1875
  return configuredSignal || undefined
1785
1876
  }
1786
1877
 
1878
+ /**
1879
+ * Resolves per-startup controls with the configured session cancellation.
1880
+ * @param {{timeoutMs?: number, signal?: AbortSignal}} controls - Call controls.
1881
+ * @returns {{timeoutMs?: number, signal?: AbortSignal}} - Effective startup controls.
1882
+ */
1883
+ function frontendModelWebsocketStartupControls(controls) {
1884
+ const sessionSignal = frontendModelTransportSignal()
1885
+ let signal = controls.signal || sessionSignal
1886
+
1887
+ if (controls.signal && sessionSignal && controls.signal !== sessionSignal) {
1888
+ signal = AbortSignal.any([controls.signal, sessionSignal])
1889
+ }
1890
+
1891
+ const configuredTimeoutMs = frontendModelTransportTimeoutMs()
1892
+ const timeoutMs = controls.timeoutMs === undefined
1893
+ ? configuredTimeoutMs
1894
+ : configuredTimeoutMs === undefined
1895
+ ? controls.timeoutMs
1896
+ : Math.min(controls.timeoutMs, configuredTimeoutMs)
1897
+
1898
+ return {signal, timeoutMs}
1899
+ }
1900
+
1787
1901
  /**
1788
1902
  * Runs perform shared frontend model api request.
1789
1903
  * @param {Record<string, ?>} requestPayload - Shared request payload.
@@ -2897,7 +3011,7 @@ export default class FrontendModelBase {
2897
3011
  if (Object.prototype.hasOwnProperty.call(config, "websocketUrl")) {
2898
3012
  frontendModelTransportConfig.websocketUrl = config.websocketUrl
2899
3013
  // Reset cached internal client so the new URL takes effect on next subscribe
2900
- internalWebsocketClient = null
3014
+ resetInternalWebsocketClient()
2901
3015
  }
2902
3016
 
2903
3017
  if (Object.prototype.hasOwnProperty.call(config, "requestHeaders")) {
@@ -2909,7 +3023,10 @@ export default class FrontendModelBase {
2909
3023
  }
2910
3024
 
2911
3025
  if (Object.prototype.hasOwnProperty.call(config, "signal")) {
2912
- frontendModelTransportConfig.signal = config.signal
3026
+ if (frontendModelTransportConfig.signal !== config.signal) {
3027
+ frontendModelTransportConfig.signal = config.signal
3028
+ resetInternalWebsocketClient()
3029
+ }
2913
3030
  }
2914
3031
 
2915
3032
  if (Object.prototype.hasOwnProperty.call(config, "timeZone")) {
@@ -2923,7 +3040,7 @@ export default class FrontendModelBase {
2923
3040
  if (Object.prototype.hasOwnProperty.call(config, "sessionStore")) {
2924
3041
  frontendModelTransportConfig.sessionStore = config.sessionStore
2925
3042
  // Reset cached internal client so the new sessionStore is picked up.
2926
- internalWebsocketClient = null
3043
+ resetInternalWebsocketClient()
2927
3044
  }
2928
3045
 
2929
3046
  if (Object.prototype.hasOwnProperty.call(config, "offlineSync")) {
@@ -2933,16 +3050,17 @@ export default class FrontendModelBase {
2933
3050
 
2934
3051
  /**
2935
3052
  * Connect the internal WebSocket and enable auto-reconnect.
3053
+ * @param {{timeoutMs?: number, signal?: AbortSignal}} [options] - Startup controls composed with the configured transport controls.
2936
3054
  * @returns {Promise<void>} - Resolves when connected.
2937
3055
  */
2938
- static async connectWebsocket() {
3056
+ static async connectWebsocket(options = {}) {
2939
3057
  const client = resolveInternalWebsocketClient()
2940
3058
 
2941
3059
  if (!client) {
2942
3060
  throw new Error("connectWebsocket requires configureTransport({websocketUrl})")
2943
3061
  }
2944
3062
 
2945
- await client.connect()
3063
+ await client.connect(frontendModelWebsocketStartupControls(options))
2946
3064
  }
2947
3065
 
2948
3066
  /**
@@ -2952,7 +3070,10 @@ export default class FrontendModelBase {
2952
3070
  static async disconnectWebsocket() {
2953
3071
  if (!internalWebsocketClient) return
2954
3072
 
2955
- await internalWebsocketClient.disconnectAndStopReconnect()
3073
+ const client = internalWebsocketClient
3074
+
3075
+ detachInternalWebsocketClient(client)
3076
+ await client.disconnectAndStopReconnect()
2956
3077
  }
2957
3078
 
2958
3079
  /**
@@ -3026,7 +3147,7 @@ export default class FrontendModelBase {
3026
3147
  * functions change (e.g. current-user sign-in/out). The handle
3027
3148
  * retries when the WS client isn't ready and reopens on close.
3028
3149
  * @param {string} connectionType - Connection class name registered on the server.
3029
- * @param {{shouldConnect: () => boolean, params: () => Record<string, ?>, onMessage?: (body: ?) => void}} options - Connection lifecycle and payload callbacks.
3150
+ * @param {{shouldConnect: () => boolean, params: () => Record<string, ?>, signal?: AbortSignal, onMessage?: (body: ?) => void}} options - Connection lifecycle, cancellation, and payload callbacks.
3030
3151
  * @returns {{sync: () => void, close: () => void}} - Handle used to resync or close the managed connection.
3031
3152
  */
3032
3153
  static openManagedConnection(connectionType, options) {
@@ -3040,11 +3161,29 @@ export default class FrontendModelBase {
3040
3161
  * @type {ReturnType<typeof setTimeout> | null} */
3041
3162
  let retryTimer = null
3042
3163
  let lastParamsJson = ""
3164
+ const controls = frontendModelWebsocketStartupControls({signal: options.signal})
3165
+ const clearRetryTimer = () => {
3166
+ if (retryTimer === null) return
3167
+
3168
+ globalThis.clearTimeout(retryTimer)
3169
+ retryTimer = null
3170
+ }
3171
+
3172
+ const close = () => {
3173
+ if (closed) return
3174
+
3175
+ closed = true
3176
+ clearRetryTimer()
3177
+ controls.signal?.removeEventListener("abort", close)
3178
+ if (connection && !connection.isClosed()) connection.close()
3179
+ connection = null
3180
+ }
3043
3181
 
3044
3182
  const sync = () => {
3045
3183
  if (closed) return
3046
3184
 
3047
3185
  if (!options.shouldConnect()) {
3186
+ clearRetryTimer()
3048
3187
  if (connection && !connection.isClosed()) connection.close()
3049
3188
  connection = null
3050
3189
  lastParamsJson = ""
@@ -3087,7 +3226,7 @@ export default class FrontendModelBase {
3087
3226
  }
3088
3227
 
3089
3228
  lastParamsJson = nextParamsJson
3090
- connection = FrontendModelBase.openWebsocketConnection(connectionType, {
3229
+ connection = client.openConnection(connectionType, {
3091
3230
  params: nextParams,
3092
3231
  onMessage: options.onMessage,
3093
3232
  onClose: () => {
@@ -3100,14 +3239,13 @@ export default class FrontendModelBase {
3100
3239
  })
3101
3240
  }
3102
3241
 
3103
- const close = () => {
3104
- closed = true
3105
- if (retryTimer !== null) globalThis.clearTimeout(retryTimer)
3106
- if (connection && !connection.isClosed()) connection.close()
3107
- connection = null
3108
- }
3242
+ controls.signal?.addEventListener("abort", close, {once: true})
3109
3243
 
3110
- sync()
3244
+ if (controls.signal?.aborted) {
3245
+ close()
3246
+ } else {
3247
+ sync()
3248
+ }
3111
3249
 
3112
3250
  return {sync, close}
3113
3251
  }
@@ -3118,34 +3256,47 @@ export default class FrontendModelBase {
3118
3256
  * `openConnection`. Apps use this for per-session state/messaging
3119
3257
  * that doesn't fit the pub/sub Channel model (locale, presence).
3120
3258
  * @param {string} connectionType - Name the server registered the class under.
3121
- * @param {{params?: Record<string, ?>, onConnect?: () => void, onMessage?: (body: Record<string, unknown>) => void, onDisconnect?: () => void, onResume?: () => void, onClose?: (reason: string) => void}} [options] - Connection options and event handlers.
3259
+ * @param {{params?: Record<string, ?>, timeoutMs?: number, signal?: AbortSignal, onConnect?: () => void, onMessage?: (body: Record<string, unknown>) => void, onDisconnect?: () => void, onResume?: () => void, onClose?: (reason: string) => void}} [options] - Connection options, readiness controls, and event handlers. Connect the client first; the timeout covers server-confirmed readiness and the signal cancels readiness without entering the wire payload.
3122
3260
  * @returns {{ready: Promise<void>, close: () => void}} - Websocket connection handle.
3123
3261
  */
3124
- static openWebsocketConnection(connectionType, options) {
3262
+ static openWebsocketConnection(connectionType, options = {}) {
3125
3263
  const client = /** @type {?} */ (frontendModelTransportConfig.websocketClient || resolveInternalWebsocketClient())
3126
3264
 
3127
3265
  if (!client || typeof client.openConnection !== "function") {
3128
3266
  throw new Error("openWebsocketConnection requires configureTransport({websocketUrl})")
3129
3267
  }
3130
3268
 
3131
- return client.openConnection(connectionType, options || {})
3269
+ const {signal, timeoutMs, ...connectionOptions} = options
3270
+
3271
+ return client.openConnection(connectionType, {
3272
+ ...connectionOptions,
3273
+ ...frontendModelWebsocketStartupControls({signal, timeoutMs})
3274
+ })
3132
3275
  }
3133
3276
 
3134
3277
  /**
3135
3278
  * Subscribes to a pub/sub `WebsocketChannel`. Thin wrapper around
3136
3279
  * the internal client's `subscribeChannel`.
3137
3280
  * @param {string} channelType - Channel class name registered on the server.
3138
- * @param {{params?: Record<string, ?>, onMessage?: (body: Record<string, unknown>) => void, onDisconnect?: () => void, onResume?: () => void, onClose?: (reason: string) => void}} [options] - Channel subscription options and event handlers.
3281
+ * @param {{params?: Record<string, ?>, timeoutMs?: number, signal?: AbortSignal, onMessage?: (body: Record<string, unknown>) => void, onDisconnect?: () => void, onResume?: () => void, onClose?: (reason: string) => void}} [options] - Channel options, startup controls, and event handlers. The timeout covers connect and server-confirmed readiness only; the signal cancels startup without entering the wire payload.
3139
3282
  * @returns {{ready: Promise<void>, close: () => void}} - Websocket channel handle from the configured client.
3140
3283
  */
3141
- static subscribeWebsocketChannel(channelType, options) {
3284
+ static subscribeWebsocketChannel(channelType, options = {}) {
3142
3285
  const client = /** @type {?} */ (frontendModelTransportConfig.websocketClient || resolveInternalWebsocketClient())
3143
3286
 
3144
3287
  if (!client || typeof client.subscribeChannel !== "function") {
3145
3288
  throw new Error("subscribeWebsocketChannel requires configureTransport({websocketUrl})")
3146
3289
  }
3147
3290
 
3148
- return client.subscribeChannel(channelType, options || {})
3291
+ const {signal, timeoutMs, ...channelOptions} = options
3292
+ const startupControls = frontendModelWebsocketStartupControls({signal, timeoutMs})
3293
+ const handle = client.subscribeChannel(channelType, {...channelOptions, ...startupControls})
3294
+
3295
+ if (typeof client.connect === "function") {
3296
+ void client.connect(startupControls).catch(() => handle.close())
3297
+ }
3298
+
3299
+ return handle
3149
3300
  }
3150
3301
 
3151
3302
  /**
@@ -23,5 +23,53 @@ export default class VelociousWebsocketClient extends SnapReqWebSocketClient {
23
23
  url: args.url ?? DEFAULT_URL,
24
24
  deserialize: args.deserialize ?? deserializeFrontendModelTransportValue
25
25
  })
26
+ this.reconnectGeneration = 0
27
+ /** @type {Set<Promise<void>>} */
28
+ this.runningReconnectTasks = new Set()
29
+ }
30
+
31
+ /**
32
+ * Ignores an online result resolved after reconnect teardown began.
33
+ * @returns {Promise<boolean>} - Whether this client generation is online.
34
+ */
35
+ async _isOnline() {
36
+ const generation = this.reconnectGeneration
37
+ const isOnline = await super._isOnline()
38
+
39
+ return generation === this.reconnectGeneration && isOnline
40
+ }
41
+
42
+ /**
43
+ * Tracks automatic reconnect work so teardown can drain stale attempts.
44
+ * @returns {Promise<void>} - Resolves after the reconnect attempt settles.
45
+ */
46
+ async _attemptReconnect() {
47
+ const reconnectTask = super._attemptReconnect()
48
+
49
+ this.runningReconnectTasks.add(reconnectTask)
50
+
51
+ try {
52
+ await reconnectTask
53
+ } finally {
54
+ this.runningReconnectTasks.delete(reconnectTask)
55
+ }
56
+ }
57
+
58
+ /**
59
+ * Stops reconnect, drains work that already passed SnapReq's reconnect guard,
60
+ * and clears state changed by a stale attempt while it settled.
61
+ * @returns {Promise<void>} - Resolves once no reconnect can resurrect a socket.
62
+ */
63
+ async disconnectAndStopReconnect() {
64
+ this.reconnectGeneration += 1
65
+ await super.disconnectAndStopReconnect()
66
+
67
+ if (this.runningReconnectTasks.size === 0) return
68
+
69
+ while (this.runningReconnectTasks.size > 0) {
70
+ await Promise.all(this.runningReconnectTasks)
71
+ }
72
+
73
+ await super.disconnectAndStopReconnect()
26
74
  }
27
75
  }
@@ -1,5 +1,6 @@
1
1
  // @ts-check
2
2
  import runJobPayload from "./job-runner.js";
3
+ import { closeRunnerConnections, currentConfigurationOrNull } from "./runner-graceful-shutdown.js";
3
4
  import setRunnerProcessTitle from "./runner-process-title.js";
4
5
  // Name the process so `ps`/`top`/`htop` can identify forked job runners at a
5
6
  // glance instead of a wall of generic "node" entries. Updated to the specific
@@ -7,6 +8,22 @@ import setRunnerProcessTitle from "./runner-process-title.js";
7
8
  // which jobs are running, how many of each, and which are eating resources.
8
9
  setRunnerProcessTitle();
9
10
  let finishing = false;
11
+ let shuttingDown = false;
12
+ /**
13
+ * Closes the runner's connections — releasing any advisory lock a killed-mid-job
14
+ * job still holds — before exiting on shutdown, instead of leaving a half-open
15
+ * session that keeps the lock until the DB server's `wait_timeout`. Normal
16
+ * completion (`finish`) already released its locks via the job's own lock scope.
17
+ * @param {number} exitCode - Process exit code.
18
+ * @returns {Promise<void>}
19
+ */
20
+ async function shutdownRunner(exitCode) {
21
+ if (shuttingDown || finishing)
22
+ return;
23
+ shuttingDown = true;
24
+ await closeRunnerConnections(currentConfigurationOrNull());
25
+ process.exit(exitCode);
26
+ }
10
27
  /**
11
28
  * Runs is job message.
12
29
  * @param {?} message - IPC message.
@@ -71,13 +88,13 @@ async function handleJobMessage(message) {
71
88
  }
72
89
  }
73
90
  for (const signal of ["SIGTERM", "SIGINT"]) {
74
- process.once(signal, () => process.exit(1));
91
+ process.once(signal, () => void shutdownRunner(1));
75
92
  }
76
93
  process.once("disconnect", () => {
77
94
  if (!finishing)
78
- process.exit(0);
95
+ void shutdownRunner(0);
79
96
  });
80
97
  process.once("message", (message) => {
81
98
  void handleJobMessage(message);
82
99
  });
83
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ya2VkLXJ1bm5lci1jaGlsZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iYWNrZ3JvdW5kLWpvYnMvZm9ya2VkLXJ1bm5lci1jaGlsZC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxhQUFhLE1BQU0saUJBQWlCLENBQUE7QUFDM0MsT0FBTyxxQkFBcUIsTUFBTSwyQkFBMkIsQ0FBQTtBQUU3RCw2RUFBNkU7QUFDN0UsOEVBQThFO0FBQzlFLDhFQUE4RTtBQUM5RSw0RUFBNEU7QUFDNUUscUJBQXFCLEVBQUUsQ0FBQTtBQUV2QixJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUE7QUFFckI7Ozs7R0FJRztBQUNILFNBQVMsWUFBWSxDQUFDLE9BQU87SUFDM0IsSUFBSSxDQUFDLE9BQU8sSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUE7SUFFekQsTUFBTSxhQUFhLEdBQUcsc0NBQXNDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUV0RSxPQUFPLGFBQWEsQ0FBQyxJQUFJLEtBQUssS0FBSyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxDQUFBO0FBQ2hGLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxNQUFNLENBQUMsUUFBUTtJQUN0QixTQUFTLEdBQUcsSUFBSSxDQUFBO0lBQ2hCLE9BQU8sQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFBO0lBRTNCLElBQUksT0FBTyxDQUFDLFNBQVMsSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDNUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFBO0lBQ3RCLENBQUM7SUFFRCxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFBO0FBQzVDLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLGlCQUFpQjtJQUN4QixJQUFJLE9BQU8sQ0FBQyxJQUFJO1FBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFDLElBQUksRUFBRSxjQUFjLEVBQUMsQ0FBQyxDQUFBO0FBQ3hELENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsS0FBSyxVQUFVLGFBQWEsQ0FBQyxPQUFPO0lBQ2xDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLHVEQUF1RCxDQUFDLENBQUE7SUFDMUUsQ0FBQztJQUVELDJFQUEyRTtJQUMzRSw2RUFBNkU7SUFDN0UsOEVBQThFO0lBQzlFLE1BQU0sYUFBYSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBQyxnQkFBZ0IsRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFBO0FBQ2pFLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsS0FBSyxVQUFVLGdCQUFnQixDQUFDLE9BQU87SUFDckMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDNUIsaUJBQWlCLEVBQUUsQ0FBQTtRQUNuQixNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDWCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLGlCQUFpQixFQUFFLENBQUE7UUFDbkIsT0FBTyxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUM1RCxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDWCxDQUFDO0FBQ0gsQ0FBQztBQUVELEtBQUssTUFBTSxNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQztJQUMzQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDN0MsQ0FBQztBQUVELE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRTtJQUM5QixJQUFJLENBQUMsU0FBUztRQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDakMsQ0FBQyxDQUFDLENBQUE7QUFFRixPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFO0lBQ2xDLEtBQUssZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDaEMsQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHJ1bkpvYlBheWxvYWQgZnJvbSBcIi4vam9iLXJ1bm5lci5qc1wiXG5pbXBvcnQgc2V0UnVubmVyUHJvY2Vzc1RpdGxlIGZyb20gXCIuL3J1bm5lci1wcm9jZXNzLXRpdGxlLmpzXCJcblxuLy8gTmFtZSB0aGUgcHJvY2VzcyBzbyBgcHNgL2B0b3BgL2BodG9wYCBjYW4gaWRlbnRpZnkgZm9ya2VkIGpvYiBydW5uZXJzIGF0IGFcbi8vIGdsYW5jZSBpbnN0ZWFkIG9mIGEgd2FsbCBvZiBnZW5lcmljIFwibm9kZVwiIGVudHJpZXMuIFVwZGF0ZWQgdG8gdGhlIHNwZWNpZmljXG4vLyBqb2IgbmFtZSBvbmNlIG9uZSBhcnJpdmVzIChzZWUgcnVuSm9iTWVzc2FnZSksIHNvIG9wZXJhdG9ycyBjYW4gc2VlIGV4YWN0bHlcbi8vIHdoaWNoIGpvYnMgYXJlIHJ1bm5pbmcsIGhvdyBtYW55IG9mIGVhY2gsIGFuZCB3aGljaCBhcmUgZWF0aW5nIHJlc291cmNlcy5cbnNldFJ1bm5lclByb2Nlc3NUaXRsZSgpXG5cbmxldCBmaW5pc2hpbmcgPSBmYWxzZVxuXG4vKipcbiAqIFJ1bnMgaXMgam9iIG1lc3NhZ2UuXG4gKiBAcGFyYW0gez99IG1lc3NhZ2UgLSBJUEMgbWVzc2FnZS5cbiAqIEByZXR1cm5zIHttZXNzYWdlIGlzIHt0eXBlOiBcImpvYlwiLCBwYXlsb2FkOiBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJhY2tncm91bmRKb2JQYXlsb2FkfX0gLSBXaGV0aGVyIHRoaXMgaXMgYSBqb2IgbWVzc2FnZS5cbiAqL1xuZnVuY3Rpb24gaXNKb2JNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgaWYgKCFtZXNzYWdlIHx8IHR5cGVvZiBtZXNzYWdlICE9PSBcIm9iamVjdFwiKSByZXR1cm4gZmFsc2VcblxuICBjb25zdCBtZXNzYWdlUmVjb3JkID0gLyoqIEB0eXBlIHt7dHlwZT86ID8sIHBheWxvYWQ/OiA/fX0gKi8gKG1lc3NhZ2UpXG5cbiAgcmV0dXJuIG1lc3NhZ2VSZWNvcmQudHlwZSA9PT0gXCJqb2JcIiAmJiBPYmplY3QuaGFzT3duKG1lc3NhZ2VSZWNvcmQsIFwicGF5bG9hZFwiKVxufVxuXG4vKipcbiAqIFJ1bnMgZmluaXNoLlxuICogQHBhcmFtIHtudW1iZXJ9IGV4aXRDb2RlIC0gUHJvY2VzcyBleGl0IGNvZGUuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gZmluaXNoKGV4aXRDb2RlKSB7XG4gIGZpbmlzaGluZyA9IHRydWVcbiAgcHJvY2Vzcy5leGl0Q29kZSA9IGV4aXRDb2RlXG5cbiAgaWYgKHByb2Nlc3MuY29ubmVjdGVkICYmIHByb2Nlc3MuZGlzY29ubmVjdCkge1xuICAgIHByb2Nlc3MuZGlzY29ubmVjdCgpXG4gIH1cblxuICBzZXRJbW1lZGlhdGUoKCkgPT4gcHJvY2Vzcy5leGl0KGV4aXRDb2RlKSlcbn1cblxuLyoqXG4gKiBSdW5zIHJlcG9ydCBqb2IgZmluaXNoZWQuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gcmVwb3J0Sm9iRmluaXNoZWQoKSB7XG4gIGlmIChwcm9jZXNzLnNlbmQpIHByb2Nlc3Muc2VuZCh7dHlwZTogXCJqb2ItcmVwb3J0ZWRcIn0pXG59XG5cbi8qKlxuICogUnVucyBydW4gam9iIG1lc3NhZ2UuXG4gKiBAcGFyYW0gez99IG1lc3NhZ2UgLSBJUEMgbWVzc2FnZS5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIGFmdGVyIHRoZSBwYXlsb2FkIGhhcyBydW4uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJ1bkpvYk1lc3NhZ2UobWVzc2FnZSkge1xuICBpZiAoIWlzSm9iTWVzc2FnZShtZXNzYWdlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkZvcmtlZCBiYWNrZ3JvdW5kIGpvYiBydW5uZXIgcmVjZWl2ZWQgaW52YWxpZCBwYXlsb2FkXCIpXG4gIH1cblxuICAvLyBUaGUgcGVyLWpvYiBwcm9jZXNzIHRpdGxlIChhbmQgaXRzIHJlc3RvcmUpIGlzIHNldCBpbnNpZGUgcnVuSm9iUGF5bG9hZCxcbiAgLy8gd2hpY2ggcmVhZHMgdGhlIGpvYiBjbGFzcydzIGBzdGF0aWMgcHJvY2Vzc1RpdGxlYC4gVGhpcyBwcm9jZXNzIGJvb3RzIHdpdGhcbiAgLy8gdGhlIGJhc2UgXCJ2ZWxvY2lvdXMgYmFja2dyb3VuZC1qb2JzLXJ1bm5lclwiIHRpdGxlIHNldCBhdCBtb2R1bGUgbG9hZCBhYm92ZS5cbiAgYXdhaXQgcnVuSm9iUGF5bG9hZChtZXNzYWdlLnBheWxvYWQsIHtjbG9zZUNvbm5lY3Rpb25zOiBmYWxzZX0pXG59XG5cbi8qKlxuICogUnVucyBoYW5kbGUgam9iIG1lc3NhZ2UuXG4gKiBAcGFyYW0gez99IG1lc3NhZ2UgLSBJUEMgbWVzc2FnZS5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIGFmdGVyIGNvbXBsZXRpb24gaXMgcmVwb3J0ZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZUpvYk1lc3NhZ2UobWVzc2FnZSkge1xuICB0cnkge1xuICAgIGF3YWl0IHJ1bkpvYk1lc3NhZ2UobWVzc2FnZSlcbiAgICByZXBvcnRKb2JGaW5pc2hlZCgpXG4gICAgZmluaXNoKDApXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVwb3J0Sm9iRmluaXNoZWQoKVxuICAgIGNvbnNvbGUuZXJyb3IoXCJGb3JrZWQgYmFja2dyb3VuZCBqb2IgcnVubmVyIGZhaWxlZDpcIiwgZXJyb3IpXG4gICAgZmluaXNoKDEpXG4gIH1cbn1cblxuZm9yIChjb25zdCBzaWduYWwgb2YgW1wiU0lHVEVSTVwiLCBcIlNJR0lOVFwiXSkge1xuICBwcm9jZXNzLm9uY2Uoc2lnbmFsLCAoKSA9PiBwcm9jZXNzLmV4aXQoMSkpXG59XG5cbnByb2Nlc3Mub25jZShcImRpc2Nvbm5lY3RcIiwgKCkgPT4ge1xuICBpZiAoIWZpbmlzaGluZykgcHJvY2Vzcy5leGl0KDApXG59KVxuXG5wcm9jZXNzLm9uY2UoXCJtZXNzYWdlXCIsIChtZXNzYWdlKSA9PiB7XG4gIHZvaWQgaGFuZGxlSm9iTWVzc2FnZShtZXNzYWdlKVxufSlcbiJdfQ==
100
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ya2VkLXJ1bm5lci1jaGlsZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iYWNrZ3JvdW5kLWpvYnMvZm9ya2VkLXJ1bm5lci1jaGlsZC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxhQUFhLE1BQU0saUJBQWlCLENBQUE7QUFDM0MsT0FBTyxFQUFFLHNCQUFzQixFQUFFLDBCQUEwQixFQUFFLE1BQU0sK0JBQStCLENBQUE7QUFDbEcsT0FBTyxxQkFBcUIsTUFBTSwyQkFBMkIsQ0FBQTtBQUU3RCw2RUFBNkU7QUFDN0UsOEVBQThFO0FBQzlFLDhFQUE4RTtBQUM5RSw0RUFBNEU7QUFDNUUscUJBQXFCLEVBQUUsQ0FBQTtBQUV2QixJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUE7QUFDckIsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFBO0FBRXhCOzs7Ozs7O0dBT0c7QUFDSCxLQUFLLFVBQVUsY0FBYyxDQUFDLFFBQVE7SUFDcEMsSUFBSSxZQUFZLElBQUksU0FBUztRQUFFLE9BQU07SUFDckMsWUFBWSxHQUFHLElBQUksQ0FBQTtJQUVuQixNQUFNLHNCQUFzQixDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQTtJQUMxRCxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0FBQ3hCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxZQUFZLENBQUMsT0FBTztJQUMzQixJQUFJLENBQUMsT0FBTyxJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVE7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUV6RCxNQUFNLGFBQWEsR0FBRyxzQ0FBc0MsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBRXRFLE9BQU8sYUFBYSxDQUFDLElBQUksS0FBSyxLQUFLLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLENBQUE7QUFDaEYsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLE1BQU0sQ0FBQyxRQUFRO0lBQ3RCLFNBQVMsR0FBRyxJQUFJLENBQUE7SUFDaEIsT0FBTyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUE7SUFFM0IsSUFBSSxPQUFPLENBQUMsU0FBUyxJQUFJLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUM1QyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUE7SUFDdEIsQ0FBQztJQUVELFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUE7QUFDNUMsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsaUJBQWlCO0lBQ3hCLElBQUksT0FBTyxDQUFDLElBQUk7UUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUMsSUFBSSxFQUFFLGNBQWMsRUFBQyxDQUFDLENBQUE7QUFDeEQsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxLQUFLLFVBQVUsYUFBYSxDQUFDLE9BQU87SUFDbEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQzNCLE1BQU0sSUFBSSxLQUFLLENBQUMsdURBQXVELENBQUMsQ0FBQTtJQUMxRSxDQUFDO0lBRUQsMkVBQTJFO0lBQzNFLDZFQUE2RTtJQUM3RSw4RUFBOEU7SUFDOUUsTUFBTSxhQUFhLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFDLGdCQUFnQixFQUFFLEtBQUssRUFBQyxDQUFDLENBQUE7QUFDakUsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxLQUFLLFVBQVUsZ0JBQWdCLENBQUMsT0FBTztJQUNyQyxJQUFJLENBQUM7UUFDSCxNQUFNLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUM1QixpQkFBaUIsRUFBRSxDQUFBO1FBQ25CLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNYLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsaUJBQWlCLEVBQUUsQ0FBQTtRQUNuQixPQUFPLENBQUMsS0FBSyxDQUFDLHNDQUFzQyxFQUFFLEtBQUssQ0FBQyxDQUFBO1FBQzVELE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNYLENBQUM7QUFDSCxDQUFDO0FBRUQsS0FBSyxNQUFNLE1BQU0sSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDO0lBQzNDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDcEQsQ0FBQztBQUVELE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRTtJQUM5QixJQUFJLENBQUMsU0FBUztRQUFFLEtBQUssY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQ3hDLENBQUMsQ0FBQyxDQUFBO0FBRUYsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRTtJQUNsQyxLQUFLLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFBO0FBQ2hDLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBydW5Kb2JQYXlsb2FkIGZyb20gXCIuL2pvYi1ydW5uZXIuanNcIlxuaW1wb3J0IHsgY2xvc2VSdW5uZXJDb25uZWN0aW9ucywgY3VycmVudENvbmZpZ3VyYXRpb25Pck51bGwgfSBmcm9tIFwiLi9ydW5uZXItZ3JhY2VmdWwtc2h1dGRvd24uanNcIlxuaW1wb3J0IHNldFJ1bm5lclByb2Nlc3NUaXRsZSBmcm9tIFwiLi9ydW5uZXItcHJvY2Vzcy10aXRsZS5qc1wiXG5cbi8vIE5hbWUgdGhlIHByb2Nlc3Mgc28gYHBzYC9gdG9wYC9gaHRvcGAgY2FuIGlkZW50aWZ5IGZvcmtlZCBqb2IgcnVubmVycyBhdCBhXG4vLyBnbGFuY2UgaW5zdGVhZCBvZiBhIHdhbGwgb2YgZ2VuZXJpYyBcIm5vZGVcIiBlbnRyaWVzLiBVcGRhdGVkIHRvIHRoZSBzcGVjaWZpY1xuLy8gam9iIG5hbWUgb25jZSBvbmUgYXJyaXZlcyAoc2VlIHJ1bkpvYk1lc3NhZ2UpLCBzbyBvcGVyYXRvcnMgY2FuIHNlZSBleGFjdGx5XG4vLyB3aGljaCBqb2JzIGFyZSBydW5uaW5nLCBob3cgbWFueSBvZiBlYWNoLCBhbmQgd2hpY2ggYXJlIGVhdGluZyByZXNvdXJjZXMuXG5zZXRSdW5uZXJQcm9jZXNzVGl0bGUoKVxuXG5sZXQgZmluaXNoaW5nID0gZmFsc2VcbmxldCBzaHV0dGluZ0Rvd24gPSBmYWxzZVxuXG4vKipcbiAqIENsb3NlcyB0aGUgcnVubmVyJ3MgY29ubmVjdGlvbnMg4oCUIHJlbGVhc2luZyBhbnkgYWR2aXNvcnkgbG9jayBhIGtpbGxlZC1taWQtam9iXG4gKiBqb2Igc3RpbGwgaG9sZHMg4oCUIGJlZm9yZSBleGl0aW5nIG9uIHNodXRkb3duLCBpbnN0ZWFkIG9mIGxlYXZpbmcgYSBoYWxmLW9wZW5cbiAqIHNlc3Npb24gdGhhdCBrZWVwcyB0aGUgbG9jayB1bnRpbCB0aGUgREIgc2VydmVyJ3MgYHdhaXRfdGltZW91dGAuIE5vcm1hbFxuICogY29tcGxldGlvbiAoYGZpbmlzaGApIGFscmVhZHkgcmVsZWFzZWQgaXRzIGxvY2tzIHZpYSB0aGUgam9iJ3Mgb3duIGxvY2sgc2NvcGUuXG4gKiBAcGFyYW0ge251bWJlcn0gZXhpdENvZGUgLSBQcm9jZXNzIGV4aXQgY29kZS5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5hc3luYyBmdW5jdGlvbiBzaHV0ZG93blJ1bm5lcihleGl0Q29kZSkge1xuICBpZiAoc2h1dHRpbmdEb3duIHx8IGZpbmlzaGluZykgcmV0dXJuXG4gIHNodXR0aW5nRG93biA9IHRydWVcblxuICBhd2FpdCBjbG9zZVJ1bm5lckNvbm5lY3Rpb25zKGN1cnJlbnRDb25maWd1cmF0aW9uT3JOdWxsKCkpXG4gIHByb2Nlc3MuZXhpdChleGl0Q29kZSlcbn1cblxuLyoqXG4gKiBSdW5zIGlzIGpvYiBtZXNzYWdlLlxuICogQHBhcmFtIHs/fSBtZXNzYWdlIC0gSVBDIG1lc3NhZ2UuXG4gKiBAcmV0dXJucyB7bWVzc2FnZSBpcyB7dHlwZTogXCJqb2JcIiwgcGF5bG9hZDogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iUGF5bG9hZH19IC0gV2hldGhlciB0aGlzIGlzIGEgam9iIG1lc3NhZ2UuXG4gKi9cbmZ1bmN0aW9uIGlzSm9iTWVzc2FnZShtZXNzYWdlKSB7XG4gIGlmICghbWVzc2FnZSB8fCB0eXBlb2YgbWVzc2FnZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlXG5cbiAgY29uc3QgbWVzc2FnZVJlY29yZCA9IC8qKiBAdHlwZSB7e3R5cGU/OiA/LCBwYXlsb2FkPzogP319ICovIChtZXNzYWdlKVxuXG4gIHJldHVybiBtZXNzYWdlUmVjb3JkLnR5cGUgPT09IFwiam9iXCIgJiYgT2JqZWN0Lmhhc093bihtZXNzYWdlUmVjb3JkLCBcInBheWxvYWRcIilcbn1cblxuLyoqXG4gKiBSdW5zIGZpbmlzaC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBleGl0Q29kZSAtIFByb2Nlc3MgZXhpdCBjb2RlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGZpbmlzaChleGl0Q29kZSkge1xuICBmaW5pc2hpbmcgPSB0cnVlXG4gIHByb2Nlc3MuZXhpdENvZGUgPSBleGl0Q29kZVxuXG4gIGlmIChwcm9jZXNzLmNvbm5lY3RlZCAmJiBwcm9jZXNzLmRpc2Nvbm5lY3QpIHtcbiAgICBwcm9jZXNzLmRpc2Nvbm5lY3QoKVxuICB9XG5cbiAgc2V0SW1tZWRpYXRlKCgpID0+IHByb2Nlc3MuZXhpdChleGl0Q29kZSkpXG59XG5cbi8qKlxuICogUnVucyByZXBvcnQgam9iIGZpbmlzaGVkLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHJlcG9ydEpvYkZpbmlzaGVkKCkge1xuICBpZiAocHJvY2Vzcy5zZW5kKSBwcm9jZXNzLnNlbmQoe3R5cGU6IFwiam9iLXJlcG9ydGVkXCJ9KVxufVxuXG4vKipcbiAqIFJ1bnMgcnVuIGpvYiBtZXNzYWdlLlxuICogQHBhcmFtIHs/fSBtZXNzYWdlIC0gSVBDIG1lc3NhZ2UuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyBhZnRlciB0aGUgcGF5bG9hZCBoYXMgcnVuLlxuICovXG5hc3luYyBmdW5jdGlvbiBydW5Kb2JNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgaWYgKCFpc0pvYk1lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJGb3JrZWQgYmFja2dyb3VuZCBqb2IgcnVubmVyIHJlY2VpdmVkIGludmFsaWQgcGF5bG9hZFwiKVxuICB9XG5cbiAgLy8gVGhlIHBlci1qb2IgcHJvY2VzcyB0aXRsZSAoYW5kIGl0cyByZXN0b3JlKSBpcyBzZXQgaW5zaWRlIHJ1bkpvYlBheWxvYWQsXG4gIC8vIHdoaWNoIHJlYWRzIHRoZSBqb2IgY2xhc3MncyBgc3RhdGljIHByb2Nlc3NUaXRsZWAuIFRoaXMgcHJvY2VzcyBib290cyB3aXRoXG4gIC8vIHRoZSBiYXNlIFwidmVsb2Npb3VzIGJhY2tncm91bmQtam9icy1ydW5uZXJcIiB0aXRsZSBzZXQgYXQgbW9kdWxlIGxvYWQgYWJvdmUuXG4gIGF3YWl0IHJ1bkpvYlBheWxvYWQobWVzc2FnZS5wYXlsb2FkLCB7Y2xvc2VDb25uZWN0aW9uczogZmFsc2V9KVxufVxuXG4vKipcbiAqIFJ1bnMgaGFuZGxlIGpvYiBtZXNzYWdlLlxuICogQHBhcmFtIHs/fSBtZXNzYWdlIC0gSVBDIG1lc3NhZ2UuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyBhZnRlciBjb21wbGV0aW9uIGlzIHJlcG9ydGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVKb2JNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBydW5Kb2JNZXNzYWdlKG1lc3NhZ2UpXG4gICAgcmVwb3J0Sm9iRmluaXNoZWQoKVxuICAgIGZpbmlzaCgwKVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJlcG9ydEpvYkZpbmlzaGVkKClcbiAgICBjb25zb2xlLmVycm9yKFwiRm9ya2VkIGJhY2tncm91bmQgam9iIHJ1bm5lciBmYWlsZWQ6XCIsIGVycm9yKVxuICAgIGZpbmlzaCgxKVxuICB9XG59XG5cbmZvciAoY29uc3Qgc2lnbmFsIG9mIFtcIlNJR1RFUk1cIiwgXCJTSUdJTlRcIl0pIHtcbiAgcHJvY2Vzcy5vbmNlKHNpZ25hbCwgKCkgPT4gdm9pZCBzaHV0ZG93blJ1bm5lcigxKSlcbn1cblxucHJvY2Vzcy5vbmNlKFwiZGlzY29ubmVjdFwiLCAoKSA9PiB7XG4gIGlmICghZmluaXNoaW5nKSB2b2lkIHNodXRkb3duUnVubmVyKDApXG59KVxuXG5wcm9jZXNzLm9uY2UoXCJtZXNzYWdlXCIsIChtZXNzYWdlKSA9PiB7XG4gIHZvaWQgaGFuZGxlSm9iTWVzc2FnZShtZXNzYWdlKVxufSlcbiJdfQ==
@@ -7,15 +7,21 @@ export default class BackgroundJobsMain {
7
7
  * @param {number} [args.port] - Port.
8
8
  * @param {number} [args.workerStaleTimeoutMs] - Override how long a silent worker may go before being dropped (default 60000ms).
9
9
  * @param {number} [args.workerLivenessSweepMs] - Override how often stale workers are swept for (default 15000ms).
10
+ * @param {boolean} [args.closeDatabaseConnectionsOnStop] - Whether stop owns closing the configuration's database pools (default true).
11
+ * @param {() => void | Promise<void>} [args.onStopped] - Lifecycle hook invoked after the main process finishes stopping.
10
12
  */
11
- constructor({ configuration, host, port, workerStaleTimeoutMs, workerLivenessSweepMs }: {
13
+ constructor({ configuration, host, port, workerStaleTimeoutMs, workerLivenessSweepMs, closeDatabaseConnectionsOnStop, onStopped }: {
12
14
  configuration: import("../configuration.js").default;
13
15
  host?: string | undefined;
14
16
  port?: number | undefined;
15
17
  workerStaleTimeoutMs?: number | undefined;
16
18
  workerLivenessSweepMs?: number | undefined;
19
+ closeDatabaseConnectionsOnStop?: boolean | undefined;
20
+ onStopped?: (() => void | Promise<void>) | undefined;
17
21
  });
18
22
  configuration: import("../configuration.js").default;
23
+ closeDatabaseConnectionsOnStop: boolean;
24
+ onStopped: (() => void | Promise<void>) | undefined;
19
25
  host: string;
20
26
  port: number;
21
27
  dispatchStrategy: import("../configuration-types.js").BackgroundJobsDispatchStrategy;
@@ -73,6 +79,8 @@ export default class BackgroundJobsMain {
73
79
  _draining: boolean;
74
80
  _redrainQueued: boolean;
75
81
  _stopped: boolean;
82
+ /** @type {Promise<void> | undefined} */
83
+ stopPromise: Promise<void> | undefined;
76
84
  /**
77
85
  * Narrows the runtime value to the documented type.
78
86
  * @type {(() => void) | undefined} */
@@ -95,6 +103,11 @@ export default class BackgroundJobsMain {
95
103
  * @returns {Promise<void>} - Resolves when closed.
96
104
  */
97
105
  stop(): Promise<void>;
106
+ /**
107
+ * Runs the main-process shutdown lifecycle once.
108
+ * @returns {Promise<void>} - Resolves when closed.
109
+ */
110
+ _stop(): Promise<void>;
98
111
  /**
99
112
  * Runs close workers.
100
113
  * @returns {void} */
@@ -1 +1 @@
1
- {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../src/background-jobs/main.js"],"names":[],"mappings":"AAqDA;IACE;;;;;;;;OAQG;IACH,wFANG;QAAoD,aAAa,EAAzD,OAAO,qBAAqB,EAAE,OAAO;QACvB,IAAI;QACJ,IAAI;QACJ,oBAAoB;QACpB,qBAAqB;KAC7C,EA2EA;IAzEC,qDAAkC;IAElC,aAA+B;IAC/B,aAAyD;IACzD,qFAA+C;IAC/C,uBAA2C;IAC3C,uKAAiC;IAGjC,6BAAkJ;IAClJ,8BAAuJ;IACvJ,2BAAoG;IACpG,eAA8B;IAC9B;;iCAE6B;IAC7B,SADU,GAAG,CAAC,UAAU,CAAC,CACD;IACxB;;iCAE6B;IAC7B,cADU,GAAG,CAAC,UAAU,CAAC,CACI;IAC7B;;sDAEkD;IAClD,gBADU,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CACf;IAC/B;;;oCAGgC;IAChC,gCADU,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CACmB;IAC/C;;wCAEoC;IACpC,QADU,GAAG,CAAC,MAAM,GAAG,SAAS,CACT;IACvB;;2DAEuD;IACvD,YADU,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,SAAS,CACxB;IAC3B;;2DAEuD;IACvD,iBADU,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,SAAS,CACnB;IAChC;;2DAEuD;IACvD,kBADU,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,SAAS,CAClB;IACjC;;2DAEuD;IACvD,cADU,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,SAAS,CACtB;IAC7B;;4DAEwD;IACxD,mBADU,UAAU,CAAC,OAAO,WAAW,CAAC,GAAG,SAAS,CAClB;IAClC;;qDAEiD;IACjD,WADU,uBAAuB,GAAG,SAAS,CACnB;IAC1B,mBAAsB;IACtB,wBAA2B;IAC3B,kBAAqB;IACrB;;0CAEsC;IACtC,oBADU,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CACC;IACnC;;2DAEuD;IACvD,uBADU,CAAC,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,OAAC,CAAC,KAAK,IAAI,CAAC,GAAG,SAAS,CACb;IACtC;;sHAEkH;IAClH,eADU,OAAO,qBAAqB,EAAE,OAAO,GAAG,OAAO,gCAAgC,EAAE,OAAO,GAAG,SAAS,CAChF;IAGhC;;;OAGG;IACH,SAFa,OAAO,CAAC,IAAI,CAAC,CAqEzB;IAED;;;OAGG;IACH,QAFa,OAAO,CAAC,IAAI,CAAC,CAczB;IAED;;yBAEqB;IACrB,iBADa,IAAI,CAKhB;IAED;;yBAEqB;IACrB,gBADa,IAAI,CAYhB;IAED;;yBAEqB;IACrB,6BADa,IAAI,CAYhB;IAED;;kCAE8B;IAC9B,wBADa,OAAO,CAAC,IAAI,CAAC,CAOzB;IAED;;kCAE8B;IAC9B,sCADa,OAAO,CAAC,IAAI,CAAC,CAOzB;IAED;;kCAE8B;IAC9B,gBADa,OAAO,CAAC,IAAI,CAAC,CAOzB;IAED;;;OAGG;IACH,WAFa,MAAM,CAIlB;IAED;;;;;;;;;;OAUG;IACH,0BAFa,IAAI,CA2BhB;IAED;;;;;;OAMG;IACH,mBAFa,IAAI,CAiBhB;IAED;;;;OAIG;IACH,0BAHW,OAAO,KAAK,EAAE,MAAM,GAClB,IAAI,CA0BhB;IAED;;;;;;;OAOG;IACH,oDALG;QAAyB,UAAU,EAA3B,UAAU;QAC4C,OAAO,EAA7D,OAAO,YAAY,EAAE,0BAA0B;QACW,IAAI,EAA9D,OAAO,YAAY,EAAE,uBAAuB,GAAG,IAAI;KAC3D,GAAU,OAAO,YAAY,EAAE,uBAAuB,GAAG,IAAI,CAS/D;IAED;;;;;;OAMG;IACH,sDAJG;QAAyB,UAAU,EAA3B,UAAU;QAC4C,OAAO,EAA7D,OAAO,YAAY,EAAE,0BAA0B;KACvD,GAAU,OAAO,YAAY,EAAE,uBAAuB,GAAG,IAAI,CAqB/D;IAED;;;;OAIG;IACH,wCAHW,UAAU,GACR,IAAI,CAOhB;IAED;;;OAGG;IACH,gCAFa,OAAO,CAAC,IAAI,CAAC,CAMzB;IAED;;;;;;;;;;;;;OAaG;IACH,iCAHW,UAAU,GACR,OAAO,CAAC,IAAI,CAAC,CAqBzB;IAED;;;;;;OAMG;IACH,oDAJG;QAAyB,UAAU,EAA3B,UAAU;QAC4C,OAAO,EAA7D,OAAO,YAAY,EAAE,0BAA0B;KACvD,GAAU,IAAI,CAMhB;IAED;;;;;;OAMG;IACH,oDAJG;QAAyB,UAAU,EAA3B,UAAU;QAC4C,OAAO,EAA7D,OAAO,YAAY,EAAE,0BAA0B;KACvD,GAAU,IAAI,CAsBhB;IAED;;;;;;OAMG;IACH,sDAJG;QAAyB,UAAU,EAA3B,UAAU;QAC4C,OAAO,EAA7D,OAAO,YAAY,EAAE,0BAA0B;KACvD,GAAU,IAAI,CAWhB;IAED;;;;;;OAMG;IACH,4CAJG;QAAyB,UAAU,EAA3B,UAAU;QAC2C,OAAO,EAA5D,OAAO,YAAY,EAAE,yBAAyB;KACtD,GAAU,IAAI,CAahB;IAED;;;;;OAKG;IACH,sCAHG;QAAyB,UAAU,EAA3B,UAAU;KAClB,GAAU,IAAI,CAOhB;IAED;;;;OAIG;IACH,kCAHW,UAAU,GACR,OAAO,CAAC,IAAI,CAAC,CAiBzB;IAED;;;;OAIG;IACH,+BAHW,UAAU,GACR,OAAO,CAAC,IAAI,CAAC,CAiBzB;IAED;;;;;;;OAOG;IACH,8CALG;QAAqB,SAAS,EAAtB,MAAM;QACO,KAAK,EAAlB,MAAM;QACW,MAAM,EAAvB,UAAU;KAClB,GAAU,OAAO,CAAC,IAAI,CAAC,CAQzB;IAED;;;;;;OAMG;IACH,qCAJG;QAAqB,SAAS,EAAtB,MAAM;QACO,KAAK,EAAlB,MAAM;KACd,GAAU,IAAI,CAUhB;IAED;;;;OAIG;IACH,kCAHW,OAAC,GACC,IAAI,CAUhB;IAED;;;;;;OAMG;IACH,gCAHW,OAAC,GACC,IAAI,CAUhB;IAED;;;;;;OAMG;IACH,wCAJG;QAAyB,UAAU,EAA3B,UAAU;QAC6C,OAAO,EAA9D,OAAO,YAAY,EAAE,2BAA2B;KACxD,GAAU,OAAO,CAAC,IAAI,CAAC,CA+BzB;IAED;;;;;;OAMG;IACH,4CAJG;QAAyB,UAAU,EAA3B,UAAU;QAC8C,OAAO,EAA/D,OAAO,YAAY,EAAE,4BAA4B;KACzD,GAAU,OAAO,CAAC,IAAI,CAAC,CAkBzB;IAED;;;;;;OAMG;IACH,0CAJG;QAAyB,UAAU,EAA3B,UAAU;QAC4C,OAAO,EAA7D,OAAO,YAAY,EAAE,0BAA0B;KACvD,GAAU,OAAO,CAAC,IAAI,CAAC,CAkCzB;IAED;;;;OAIG;IACH,6EAHW;QAAC,KAAK,EAAE,OAAC,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,OAAO,YAAY,EAAE,gBAAgB,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAC,GACnH,IAAI,CAyBhB;IAED;;;;;;;;OAQG;IACH,oCAHW;QAAC,GAAG,EAAE,OAAO,YAAY,EAAE,gBAAgB,CAAA;KAAC,GAC1C,IAAI,CAsBhB;IAED;;;;OAIG;IACH,8BAHW,OAAC,GACC,KAAK,CAMjB;IAED;;;;OAIG;IACH,gCAHW,OAAC,GACC,KAAK,CASjB;IAED;;;;OAIG;IACH,kCAHW,OAAC,GACC,MAAM,CAMlB;IAED;;;;OAIG;IACH,yBAHW,OAAC,GACC,KAAK,IAAI,MAAM,CAI3B;IAED;;;;;;OAMG;IACH,oDAJG;QAAgB,KAAK,EAAb,OAAC;QACW,eAAe,EAA3B,KAAK;KACb,GAAU,IAAI,CAIhB;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,UAFa,OAAO,CAAC,IAAI,CAAC,CAQzB;IAED;;;OAGG;IACH,eAFa,OAAO,CAQnB;IAED;;;;;OAKG;IACH,0BAHG;QAAsB,OAAO,EAArB,OAAO;KACf,GAAU,OAAO,CAAC,IAAI,CAAC,CAOzB;IAED;;;OAGG;IACH,6BAFa,OAAO,CAAC,IAAI,CAAC,CAYzB;IAED;;yBAEqB;IACrB,yBADa,IAAI,CAUhB;IAED;;;OAGG;IACH,+BAFa,OAAO,CAOnB;IAED;;;OAGG;IACH,mBAFa,OAAO,CAAC,OAAO,CAAC,CAQ5B;IAED;;;OAGG;IACH,iBAFa,OAAO,CAAC,OAAO,CAAC,CAW5B;IAED;;;OAGG;IACH,6BAFa,OAAO,CAAC,OAAO,CAAC,CAU5B;IAED;;;;;;OAMG;IACH,uBAFa,IAAI,CAWhB;IAED;;;OAGG;IACH,oBAFa,OAAO,CAAC,IAAI,CAAC,CAgBzB;IAED;;;;OAIG;IACH,cAFa,OAAO,CAAC,IAAI,CAAC,CAuDzB;IAED;;;OAGG;IACH,mCAFa,OAAO,CAAC,OAAO,YAAY,EAAE,gBAAgB,GAAG,IAAI,CAAC,CASjE;IAED;;;OAGG;IACH,6BAFa,OAAO,YAAY,EAAE,0BAA0B,EAAE,CAU7D;IAED;;;;;;OAMG;IACH,uDAJG;QAAmE,cAAc,EAAzE,GAAG,CAAC,OAAO,YAAY,EAAE,0BAA0B,CAAC;QACnC,MAAM,EAAvB,UAAU;KAClB,GAAU,IAAI,CAQhB;IAED;;;;OAIG;IACH,uBAHW,OAAO,YAAY,EAAE,gBAAgB,GACnC,UAAU,GAAG,SAAS,CAMlC;IAED;;;;;;OAMG;IACH,mCAJG;QAAoD,GAAG,EAA/C,OAAO,YAAY,EAAE,gBAAgB;QACpB,MAAM,EAAvB,UAAU;KAClB,GAAU,OAAO,CAUnB;IAED;;;;;;OAMG;IACH,sBAFa,OAAO,CAAC,IAAI,CAAC,CAoBzB;IAED,+BA0BC;IAED;;;;;;;;OAQG;IACH,sBAFa,OAAO,CAAC,IAAI,CAAC,CAgCzB;CACF;;;;;;;;mBA7wCa,OAAO,YAAY,EAAE,0BAA0B;;;;aAC/C,CAAC,MAAM,EAAE,UAAU,KAAK,OAAO;;gCA5Bb,YAAY;mBACzB,cAAc;uBAHV,kBAAkB;gBADzB,KAAK;oCAEe,gBAAgB"}
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../src/background-jobs/main.js"],"names":[],"mappings":"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"}