velocious 1.0.558 → 1.0.560
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 +8 -3
- package/build/background-jobs/store.js +262 -16
- package/build/background-jobs/web/authorization.js +5 -4
- package/build/background-jobs/web/controller.js +13 -16
- package/build/background-jobs/web/counts-channel.js +79 -0
- package/build/background-jobs/web/index.js +2 -0
- package/build/background-jobs/web/registry.js +1 -1
- package/build/database/drivers/base.js +9 -2
- package/build/database/drivers/mysql/index.js +11 -2
- package/build/database/drivers/mysql/query.js +198 -22
- package/build/database/query/index.js +16 -1
- package/build/database/query/model-class-query.js +3 -2
- package/build/database/query/query-data.js +75 -7
- package/build/database/query/with-count.js +64 -28
- package/build/database/query-aborted-error.js +24 -0
- package/build/http-server/client/websocket-session.js +134 -28
- package/build/src/background-jobs/store.d.ts +79 -0
- package/build/src/background-jobs/store.d.ts.map +1 -1
- package/build/src/background-jobs/store.js +235 -17
- package/build/src/background-jobs/web/authorization.d.ts +5 -3
- package/build/src/background-jobs/web/authorization.d.ts.map +1 -1
- package/build/src/background-jobs/web/authorization.js +6 -5
- package/build/src/background-jobs/web/controller.d.ts.map +1 -1
- package/build/src/background-jobs/web/controller.js +14 -15
- package/build/src/background-jobs/web/counts-channel.d.ts +31 -0
- package/build/src/background-jobs/web/counts-channel.d.ts.map +1 -0
- package/build/src/background-jobs/web/counts-channel.js +71 -0
- package/build/src/background-jobs/web/index.d.ts.map +1 -1
- package/build/src/background-jobs/web/index.js +3 -1
- package/build/src/background-jobs/web/registry.d.ts +1 -1
- package/build/src/background-jobs/web/registry.d.ts.map +1 -1
- package/build/src/background-jobs/web/registry.js +2 -2
- package/build/src/database/drivers/base.d.ts +6 -1
- package/build/src/database/drivers/base.d.ts.map +1 -1
- package/build/src/database/drivers/base.js +10 -3
- package/build/src/database/drivers/mssql/index.d.ts +6 -0
- package/build/src/database/drivers/mssql/index.d.ts.map +1 -1
- package/build/src/database/drivers/mysql/index.d.ts.map +1 -1
- package/build/src/database/drivers/mysql/index.js +12 -3
- package/build/src/database/drivers/mysql/query.d.ts +13 -3
- package/build/src/database/drivers/mysql/query.d.ts.map +1 -1
- package/build/src/database/drivers/mysql/query.js +172 -23
- package/build/src/database/drivers/pgsql/index.d.ts +6 -0
- package/build/src/database/drivers/pgsql/index.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/index.d.ts +6 -0
- package/build/src/database/drivers/sqlite/index.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/index.native.d.ts +6 -0
- package/build/src/database/drivers/sqlite/index.native.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/index.web.d.ts +6 -0
- package/build/src/database/drivers/sqlite/index.web.d.ts.map +1 -1
- package/build/src/database/query/index.d.ts +13 -1
- package/build/src/database/query/index.d.ts.map +1 -1
- package/build/src/database/query/index.js +15 -3
- package/build/src/database/query/model-class-query.d.ts.map +1 -1
- package/build/src/database/query/model-class-query.js +4 -3
- package/build/src/database/query/query-data.d.ts.map +1 -1
- package/build/src/database/query/query-data.js +69 -8
- package/build/src/database/query/with-count.d.ts.map +1 -1
- package/build/src/database/query/with-count.js +60 -26
- package/build/src/database/query-aborted-error.d.ts +23 -0
- package/build/src/database/query-aborted-error.d.ts.map +1 -0
- package/build/src/database/query-aborted-error.js +23 -0
- package/build/src/http-server/client/websocket-session.d.ts +31 -3
- package/build/src/http-server/client/websocket-session.d.ts.map +1 -1
- package/build/src/http-server/client/websocket-session.js +112 -26
- package/build/src/tenants/tenant-aggregator.d.ts +4 -0
- package/build/src/tenants/tenant-aggregator.d.ts.map +1 -1
- package/build/src/tenants/tenant-aggregator.js +4 -3
- package/build/tenants/tenant-aggregator.js +3 -2
- package/build/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -1
- package/src/background-jobs/store.js +262 -16
- package/src/background-jobs/web/authorization.js +5 -4
- package/src/background-jobs/web/controller.js +13 -16
- package/src/background-jobs/web/counts-channel.js +79 -0
- package/src/background-jobs/web/index.js +2 -0
- package/src/background-jobs/web/registry.js +1 -1
- package/src/database/drivers/base.js +9 -2
- package/src/database/drivers/mysql/index.js +11 -2
- package/src/database/drivers/mysql/query.js +198 -22
- package/src/database/query/index.js +16 -1
- package/src/database/query/model-class-query.js +3 -2
- package/src/database/query/query-data.js +75 -7
- package/src/database/query/with-count.js +64 -28
- package/src/database/query-aborted-error.js +24 -0
- package/src/http-server/client/websocket-session.js +134 -28
- package/src/tenants/tenant-aggregator.js +3 -2
|
@@ -23,6 +23,11 @@ const WEBSOCKET_PAUSED_QUEUE_CAP = 1000
|
|
|
23
23
|
/** Cap on total bytes buffered for a single fragmented message. */
|
|
24
24
|
const WEBSOCKET_MAX_FRAGMENTED_MESSAGE_BYTES = 16 * 1024 * 1024
|
|
25
25
|
|
|
26
|
+
/** Cap on payload bytes buffered for a single final data frame. */
|
|
27
|
+
const WEBSOCKET_MAX_FINAL_FRAME_BYTES = WEBSOCKET_MAX_FRAGMENTED_MESSAGE_BYTES
|
|
28
|
+
|
|
29
|
+
const WEBSOCKET_MAX_INBOUND_FRAME_BYTES_BIGINT = BigInt(WEBSOCKET_MAX_FINAL_FRAME_BYTES)
|
|
30
|
+
|
|
26
31
|
/** Cap on fragment count for a single fragmented message. */
|
|
27
32
|
const WEBSOCKET_MAX_FRAGMENTED_MESSAGE_FRAGMENTS = 1024
|
|
28
33
|
|
|
@@ -97,7 +102,12 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
97
102
|
* @param {Promise<import("../../configuration-types.js").WebsocketMessageHandler | void>} [args.messageHandlerPromise] - Optional raw message handler promise.
|
|
98
103
|
*/
|
|
99
104
|
constructor({client, configuration, upgradeRequest, messageHandler, messageHandlerPromise}) {
|
|
100
|
-
|
|
105
|
+
/** @type {Buffer[]} */
|
|
106
|
+
this._bufferChunks = []
|
|
107
|
+
this._bufferChunkIndex = 0
|
|
108
|
+
this._bufferChunkOffset = 0
|
|
109
|
+
this._bufferedBytes = 0
|
|
110
|
+
this._bufferedFrameCopyBytes = 0
|
|
101
111
|
this.client = client
|
|
102
112
|
this.configuration = configuration
|
|
103
113
|
this.upgradeRequest = upgradeRequest
|
|
@@ -301,7 +311,10 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
301
311
|
// socket is alive. Mark it here, before `_processBuffer` may return
|
|
302
312
|
// early waiting for the rest of an incomplete frame.
|
|
303
313
|
this._heartbeatAlive = true
|
|
304
|
-
|
|
314
|
+
if (data.length === 0) return
|
|
315
|
+
|
|
316
|
+
this._bufferChunks.push(data)
|
|
317
|
+
this._bufferedBytes += data.length
|
|
305
318
|
this._processBuffer()
|
|
306
319
|
}
|
|
307
320
|
|
|
@@ -588,9 +601,10 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
588
601
|
* @returns {void} - No return value.
|
|
589
602
|
*/
|
|
590
603
|
_processBuffer() {
|
|
591
|
-
while (this.
|
|
592
|
-
const
|
|
593
|
-
const
|
|
604
|
+
while (this._bufferedBytes >= 2) {
|
|
605
|
+
const initialHeader = this._peekBufferedBytes(2)
|
|
606
|
+
const firstByte = initialHeader[0]
|
|
607
|
+
const secondByte = initialHeader[1]
|
|
594
608
|
const isFinal = (firstByte & WEBSOCKET_FINAL_FRAME) === WEBSOCKET_FINAL_FRAME
|
|
595
609
|
const opcode = firstByte & 0x0F
|
|
596
610
|
const isMasked = (secondByte & 0x80) === 0x80
|
|
@@ -598,12 +612,21 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
598
612
|
let offset = 2
|
|
599
613
|
|
|
600
614
|
if (payloadLength === 126) {
|
|
601
|
-
if (this.
|
|
602
|
-
payloadLength = this.
|
|
615
|
+
if (this._bufferedBytes < offset + 2) return
|
|
616
|
+
payloadLength = this._peekBufferedBytes(offset + 2).readUInt16BE(offset)
|
|
603
617
|
offset += 2
|
|
604
618
|
} else if (payloadLength === 127) {
|
|
605
|
-
if (this.
|
|
606
|
-
const bigLength = this.
|
|
619
|
+
if (this._bufferedBytes < offset + 8) return
|
|
620
|
+
const bigLength = this._peekBufferedBytes(offset + 8).readBigUInt64BE(offset)
|
|
621
|
+
|
|
622
|
+
if (bigLength > WEBSOCKET_MAX_INBOUND_FRAME_BYTES_BIGINT) {
|
|
623
|
+
this.logger.warn(() => [
|
|
624
|
+
"Websocket frame exceeded byte cap; closing connection",
|
|
625
|
+
{frameBytes: bigLength.toString(), maxBytes: WEBSOCKET_MAX_FINAL_FRAME_BYTES}
|
|
626
|
+
])
|
|
627
|
+
this._closeForInboundLimit()
|
|
628
|
+
return
|
|
629
|
+
}
|
|
607
630
|
|
|
608
631
|
payloadLength = Number(bigLength)
|
|
609
632
|
offset += 8
|
|
@@ -611,18 +634,20 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
611
634
|
|
|
612
635
|
const maskLength = isMasked ? 4 : 0
|
|
613
636
|
|
|
614
|
-
|
|
637
|
+
const frameLength = offset + maskLength + payloadLength
|
|
638
|
+
|
|
639
|
+
if (this._bufferedBytes < frameLength) return
|
|
640
|
+
|
|
641
|
+
const frame = this._consumeBufferedBytes(frameLength)
|
|
615
642
|
|
|
616
643
|
/** @type {Buffer} */
|
|
617
|
-
let payload =
|
|
644
|
+
let payload = frame.subarray(offset + maskLength, frameLength)
|
|
618
645
|
|
|
619
646
|
if (isMasked) {
|
|
620
|
-
const mask =
|
|
621
|
-
|
|
647
|
+
const mask = frame.subarray(offset, offset + maskLength)
|
|
648
|
+
this._unmaskPayload(payload, mask)
|
|
622
649
|
}
|
|
623
650
|
|
|
624
|
-
this.buffer = this.buffer.slice(offset + maskLength + payloadLength)
|
|
625
|
-
|
|
626
651
|
// Control frames (opcode >= 0x8) must not be fragmented per
|
|
627
652
|
// RFC 6455 and can arrive interleaved with a fragmented data
|
|
628
653
|
// message. Handle them first without touching the fragment
|
|
@@ -726,6 +751,97 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
726
751
|
}
|
|
727
752
|
}
|
|
728
753
|
|
|
754
|
+
/**
|
|
755
|
+
* Copies the leading buffered bytes without consuming them. Header
|
|
756
|
+
* inspection is bounded to the websocket header size.
|
|
757
|
+
* @param {number} byteCount - Number of leading bytes to inspect.
|
|
758
|
+
* @returns {Buffer} - Copied prefix.
|
|
759
|
+
*/
|
|
760
|
+
_peekBufferedBytes(byteCount) {
|
|
761
|
+
const prefix = Buffer.allocUnsafe(byteCount)
|
|
762
|
+
let copiedBytes = 0
|
|
763
|
+
let chunkOffset = this._bufferChunkOffset
|
|
764
|
+
|
|
765
|
+
for (let chunkIndex = this._bufferChunkIndex; chunkIndex < this._bufferChunks.length; chunkIndex += 1) {
|
|
766
|
+
const chunk = this._bufferChunks[chunkIndex]
|
|
767
|
+
const bytesFromChunk = Math.min(chunk.length - chunkOffset, byteCount - copiedBytes)
|
|
768
|
+
|
|
769
|
+
chunk.copy(prefix, copiedBytes, chunkOffset, chunkOffset + bytesFromChunk)
|
|
770
|
+
copiedBytes += bytesFromChunk
|
|
771
|
+
chunkOffset = 0
|
|
772
|
+
if (copiedBytes === byteCount) break
|
|
773
|
+
}
|
|
774
|
+
|
|
775
|
+
return prefix
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
/**
|
|
779
|
+
* Consumes a complete frame from the chunk queue with one bounded copy.
|
|
780
|
+
* @param {number} byteCount - Complete frame byte count.
|
|
781
|
+
* @returns {Buffer} - Contiguous frame bytes.
|
|
782
|
+
*/
|
|
783
|
+
_consumeBufferedBytes(byteCount) {
|
|
784
|
+
const result = Buffer.allocUnsafe(byteCount)
|
|
785
|
+
let copiedBytes = 0
|
|
786
|
+
|
|
787
|
+
while (copiedBytes < byteCount) {
|
|
788
|
+
const chunk = this._bufferChunks[this._bufferChunkIndex]
|
|
789
|
+
const bytesFromChunk = Math.min(chunk.length - this._bufferChunkOffset, byteCount - copiedBytes)
|
|
790
|
+
|
|
791
|
+
chunk.copy(
|
|
792
|
+
result,
|
|
793
|
+
copiedBytes,
|
|
794
|
+
this._bufferChunkOffset,
|
|
795
|
+
this._bufferChunkOffset + bytesFromChunk
|
|
796
|
+
)
|
|
797
|
+
copiedBytes += bytesFromChunk
|
|
798
|
+
this._bufferChunkOffset += bytesFromChunk
|
|
799
|
+
|
|
800
|
+
if (this._bufferChunkOffset === chunk.length) {
|
|
801
|
+
this._bufferChunkIndex += 1
|
|
802
|
+
this._bufferChunkOffset = 0
|
|
803
|
+
}
|
|
804
|
+
}
|
|
805
|
+
|
|
806
|
+
if (this._bufferChunkIndex === this._bufferChunks.length) {
|
|
807
|
+
this._bufferChunks = []
|
|
808
|
+
this._bufferChunkIndex = 0
|
|
809
|
+
} else if (
|
|
810
|
+
this._bufferChunkIndex >= 64 &&
|
|
811
|
+
this._bufferChunkIndex * 2 >= this._bufferChunks.length
|
|
812
|
+
) {
|
|
813
|
+
this._bufferChunks = this._bufferChunks.slice(this._bufferChunkIndex)
|
|
814
|
+
this._bufferChunkIndex = 0
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
this._bufferedBytes -= byteCount
|
|
818
|
+
this._bufferedFrameCopyBytes += byteCount
|
|
819
|
+
|
|
820
|
+
return result
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
/**
|
|
824
|
+
* Drops all incomplete frame chunks.
|
|
825
|
+
* @returns {void}
|
|
826
|
+
*/
|
|
827
|
+
_clearBufferedFrameChunks() {
|
|
828
|
+
this._bufferChunks = []
|
|
829
|
+
this._bufferChunkIndex = 0
|
|
830
|
+
this._bufferChunkOffset = 0
|
|
831
|
+
this._bufferedBytes = 0
|
|
832
|
+
}
|
|
833
|
+
|
|
834
|
+
/**
|
|
835
|
+
* Closes after an inbound buffering limit and releases all parser-owned input.
|
|
836
|
+
* @returns {void}
|
|
837
|
+
*/
|
|
838
|
+
_closeForInboundLimit() {
|
|
839
|
+
this._resetFragmentBuffer()
|
|
840
|
+
this._clearBufferedFrameChunks()
|
|
841
|
+
this.sendGoodbye(this.client)
|
|
842
|
+
this._handleClose()
|
|
843
|
+
}
|
|
844
|
+
|
|
729
845
|
/**
|
|
730
846
|
* Appends a continuation-frame payload to the in-progress
|
|
731
847
|
* fragmented message. Returns true when the fragment was accepted
|
|
@@ -771,10 +887,7 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
771
887
|
}
|
|
772
888
|
])
|
|
773
889
|
|
|
774
|
-
this.
|
|
775
|
-
this.buffer = Buffer.alloc(0)
|
|
776
|
-
this.sendGoodbye(this.client)
|
|
777
|
-
this._handleClose()
|
|
890
|
+
this._closeForInboundLimit()
|
|
778
891
|
|
|
779
892
|
return false
|
|
780
893
|
}
|
|
@@ -1702,19 +1815,12 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
1702
1815
|
* Runs unmask payload.
|
|
1703
1816
|
* @param {Buffer} payload - Payload data.
|
|
1704
1817
|
* @param {Buffer} mask - Mask.
|
|
1705
|
-
* @returns {
|
|
1818
|
+
* @returns {void} - No return value.
|
|
1706
1819
|
*/
|
|
1707
1820
|
_unmaskPayload(payload, mask) {
|
|
1708
|
-
/**
|
|
1709
|
-
* Result.
|
|
1710
|
-
* @type {Buffer} */
|
|
1711
|
-
const result = Buffer.alloc(payload.length)
|
|
1712
|
-
|
|
1713
1821
|
for (let i = 0; i < payload.length; i++) {
|
|
1714
|
-
|
|
1822
|
+
payload[i] ^= mask[i % 4]
|
|
1715
1823
|
}
|
|
1716
|
-
|
|
1717
|
-
return result
|
|
1718
1824
|
}
|
|
1719
1825
|
|
|
1720
1826
|
async _runMessageHandlerOpen() {
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
export const BACKGROUND_JOB_COUNTS_CHANNEL: "velocious-background-job-counts";
|
|
2
|
+
export const BACKGROUND_JOB_COUNT_BUCKETS: string[];
|
|
1
3
|
export default class BackgroundJobsStore {
|
|
2
4
|
/**
|
|
3
5
|
* Runs constructor.
|
|
@@ -106,6 +108,17 @@ export default class BackgroundJobsStore {
|
|
|
106
108
|
* @returns {Promise<Record<string, number>>} - Counts keyed by status.
|
|
107
109
|
*/
|
|
108
110
|
countsByStatus(): Promise<Record<string, number>>;
|
|
111
|
+
/**
|
|
112
|
+
* Returns the authoritative dashboard count snapshot and its matching durable
|
|
113
|
+
* revision. Locking the revision row before counting prevents a writer from
|
|
114
|
+
* committing between the count query and revision read.
|
|
115
|
+
* @returns {Promise<{counts: Record<string, number>, revision: number, total: number}>} Snapshot.
|
|
116
|
+
*/
|
|
117
|
+
countSnapshot(): Promise<{
|
|
118
|
+
counts: Record<string, number>;
|
|
119
|
+
revision: number;
|
|
120
|
+
total: number;
|
|
121
|
+
}>;
|
|
109
122
|
/**
|
|
110
123
|
* Counts jobs matching the given filters.
|
|
111
124
|
* @param {object} [args] - Options.
|
|
@@ -497,6 +510,61 @@ export default class BackgroundJobsStore {
|
|
|
497
510
|
* @returns {Promise<void>} - Resolves when ready.
|
|
498
511
|
*/
|
|
499
512
|
_ensureConcurrencyTable(db: import("../database/drivers/base.js").default): Promise<void>;
|
|
513
|
+
/**
|
|
514
|
+
* Ensures the singleton durable count-revision row exists.
|
|
515
|
+
* @param {import("../database/drivers/base.js").default} db - Database connection.
|
|
516
|
+
* @returns {Promise<void>} Resolves when ready.
|
|
517
|
+
*/
|
|
518
|
+
_ensureCountRevisionTable(db: import("../database/drivers/base.js").default): Promise<void>;
|
|
519
|
+
/**
|
|
520
|
+
* Records one logical count mutation atomically and broadcasts it after commit.
|
|
521
|
+
* Zero entries are omitted; a wholly zero-net mutation does not consume a revision.
|
|
522
|
+
* @param {import("../database/drivers/base.js").default} db - Transaction connection.
|
|
523
|
+
* @param {Record<string, number>} requestedDeltas - Signed bucket changes.
|
|
524
|
+
* @returns {Promise<void>} Resolves when recorded.
|
|
525
|
+
*/
|
|
526
|
+
_recordCountDelta(db: import("../database/drivers/base.js").default, requestedDeltas: Record<string, number>): Promise<void>;
|
|
527
|
+
/**
|
|
528
|
+
* Records a transition between persisted statuses.
|
|
529
|
+
* @param {import("../database/drivers/base.js").default} db - Transaction connection.
|
|
530
|
+
* @param {string} oldStatus - Previous status.
|
|
531
|
+
* @param {string} newStatus - New status.
|
|
532
|
+
* @returns {Promise<void>} Resolves when recorded.
|
|
533
|
+
*/
|
|
534
|
+
_recordStatusTransition(db: import("../database/drivers/base.js").default, oldStatus: string, newStatus: string): Promise<void>;
|
|
535
|
+
/**
|
|
536
|
+
* Reads the locked revision.
|
|
537
|
+
* @param {import("../database/drivers/base.js").default} db - Database connection.
|
|
538
|
+
* @returns {Promise<number>} Revision.
|
|
539
|
+
*/
|
|
540
|
+
_countRevision(db: import("../database/drivers/base.js").default): Promise<number>;
|
|
541
|
+
/**
|
|
542
|
+
* Takes a portable write lock on the singleton revision row.
|
|
543
|
+
* @param {import("../database/drivers/base.js").default} db - Database connection.
|
|
544
|
+
* @returns {Promise<void>} Resolves when locked.
|
|
545
|
+
*/
|
|
546
|
+
_lockCountRevision(db: import("../database/drivers/base.js").default): Promise<void>;
|
|
547
|
+
/**
|
|
548
|
+
* Builds zeroed canonical buckets.
|
|
549
|
+
* @returns {Record<string, number>} Zeroed canonical buckets.
|
|
550
|
+
*/
|
|
551
|
+
_emptyCountBuckets(): Record<string, number>;
|
|
552
|
+
/**
|
|
553
|
+
* Counts normalized rows by canonical status.
|
|
554
|
+
* @param {import("./types.js").BackgroundJobRow[]} jobs - Jobs.
|
|
555
|
+
* @returns {Record<string, number>} Counts.
|
|
556
|
+
*/
|
|
557
|
+
_statusCounts(jobs: import("./types.js").BackgroundJobRow[]): Record<string, number>;
|
|
558
|
+
/**
|
|
559
|
+
* Reads a canonical snapshot after locking the revision row.
|
|
560
|
+
* @param {import("../database/drivers/base.js").default} db - Transaction connection.
|
|
561
|
+
* @returns {Promise<{counts: Record<string, number>, revision: number, total: number}>} Snapshot.
|
|
562
|
+
*/
|
|
563
|
+
_countSnapshotOnLockedConnection(db: import("../database/drivers/base.js").default): Promise<{
|
|
564
|
+
counts: Record<string, number>;
|
|
565
|
+
revision: number;
|
|
566
|
+
total: number;
|
|
567
|
+
}>;
|
|
500
568
|
/**
|
|
501
569
|
* Registers or verifies a stable key configuration.
|
|
502
570
|
* @param {import("../database/drivers/base.js").default} db - Database connection.
|
|
@@ -620,6 +688,17 @@ export default class BackgroundJobsStore {
|
|
|
620
688
|
* @returns {Promise<T>} - Callback result.
|
|
621
689
|
*/
|
|
622
690
|
_transactionResult<T>(db: import("../database/drivers/base.js").default, callback: () => Promise<T>): Promise<T>;
|
|
691
|
+
/**
|
|
692
|
+
* Serializes count-changing transactions sharing a process-local connection.
|
|
693
|
+
* Database row locking still provides cross-process ordering; this guard
|
|
694
|
+
* prevents concurrent callers on SQLite's shared connection from attempting
|
|
695
|
+
* overlapping top-level transactions.
|
|
696
|
+
* @template T
|
|
697
|
+
* @param {import("../database/drivers/base.js").default} db - Database connection.
|
|
698
|
+
* @param {() => Promise<T>} callback - Transaction callback.
|
|
699
|
+
* @returns {Promise<T>} Callback result.
|
|
700
|
+
*/
|
|
701
|
+
_serializedCountMutation<T>(db: import("../database/drivers/base.js").default, callback: () => Promise<T>): Promise<T>;
|
|
623
702
|
/**
|
|
624
703
|
* Runs should accept report.
|
|
625
704
|
* @param {object} args - Options.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/background-jobs/store.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/background-jobs/store.js"],"names":[],"mappings":"AA2BA,4CAA6C,iCAAiC,CAAA;AAC9E,oDAA8G;AAkD9G;IACE;;;;;OAKG;IACH,mDAHG;QAAoD,aAAa,EAAzD,OAAO,qBAAqB,EAAE,OAAO;QACvB,kBAAkB;KAC1C,EAOA;IALC,qDAAkC;IAClC,uCAA4C;IAC5C,eAA8B;IAC9B,oCAAyB;IACzB,qCAAwC;IAG1C;;;OAGG;IACH,yBAFa,MAAM,CAMlB;IAED;;;OAGG;IACH,eAFa,OAAO,CAAC,IAAI,CAAC,CAgBzB;IAED;;;;;;;;;;;OAWG;IACH,kBALW,OAAO,6BAA6B,EAAE,OAAO,GAG3C,OAAO,CAAC,IAAI,CAAC,CASzB;IAED;;;;;;;OAOG;IACH,oCALG;QAAqB,OAAO,EAApB,MAAM;QACS,IAAI,EAAnB,KAAK,CAAC,OAAC,CAAC;QACyC,OAAO;KAChE,GAAU,OAAO,CAAC,MAAM,CAAC,CAoE3B;IAED;;;;;OAKG;IACH,wBAHG;QAAmH,aAAa;KAChI,GAAU,OAAO,CAAC,OAAO,YAAY,EAAE,gBAAgB,GAAG,IAAI,CAAC,CAYjE;IAED;;;;;;;OAOG;IACH,oBAFa,OAAO,CAAC,OAAO,YAAY,EAAE,gBAAgB,GAAG,IAAI,CAAC,CAQjE;IAED;;;;;;;OAOG;IACH,2DALG;QAA4D,EAAE,EAAtD,OAAO,6BAA6B,EAAE,OAAO;QAC5B,mBAAmB,EAApC,IAAI,GAAG,GAAG;QACiG,aAAa;KAChI,GAAU,OAAO,CAAC,OAAO,YAAY,EAAE,gBAAgB,GAAG,IAAI,CAAC,CAwCjE;IAED;;;;;;;;;;;;OAYG;IACH,2BAHW,OAAO,6BAA6B,EAAE,OAAO,GAC3C,MAAM,GAAG,IAAI,CAqBzB;IAED;;;;OAIG;IACH,cAHW,MAAM,GACJ,OAAO,CAAC,OAAO,YAAY,EAAE,gBAAgB,GAAG,IAAI,CAAC,CAmBjE;IAED;;;OAGG;IACH,kBAFa,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA2B3C;IAED;;;;;OAKG;IACH,iBAFa,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,CAAC,CAQtF;IAED;;;;;;OAMG;IACH,gCAJG;QAAsB,MAAM;QACN,OAAO;KAC7B,GAAU,OAAO,CAAC,MAAM,CAAC,CAgB3B;IAED;;;;;;;;;;OAUG;IACH,yEARG;QAAsB,MAAM;QACN,OAAO;QACP,KAAK;QACL,MAAM;QACN,UAAU;QACF,aAAa;KAC3C,GAAU,OAAO,CAAC,OAAO,YAAY,EAAE,gBAAgB,EAAE,CAAC,CAqB5D;IAED;;;;;;OAMG;IACH,mCAJG;QAAqB,KAAK,EAAlB,MAAM;QACQ,QAAQ;KAC9B,GAAU,OAAO,CAAC,OAAO,YAAY,EAAE,oBAAoB,GAAG,IAAI,CAAC,CAgCrE;IAED;;;;;;;;OAQG;IACH,6DANG;QAAqB,KAAK,EAAlB,MAAM;QACQ,SAAS;QACT,QAAQ;QACR,aAAa;KACnC,GAAU,OAAO,CAAC,OAAO,CAAC,CA0B5B;IAED;;;;;;OAMG;IACH,0CAJG;QAAqB,KAAK,EAAlB,MAAM;QACO,SAAS,EAAtB,MAAM;KACd,GAAU,OAAO,CAAC,IAAI,CAAC,CAyBzB;IAED;;;;;;;;;;;;OAYG;IACH,qCAHG;QAAqB,QAAQ,EAArB,MAAM;KACd,GAAU,OAAO,CAAC,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAC,CAAC,CAAC,CAmB9D;IAED;;;;;;;;;OASG;IACH,iEAPG;QAAqB,KAAK,EAAlB,MAAM;QACE,KAAK,EAAb,OAAC;QACa,SAAS;QACT,QAAQ;QACR,aAAa;KACnC,GAAU,OAAO,CAAC,OAAO,YAAY,EAAE,gBAAgB,GAAG,IAAI,CAAC,CAgBjE;IAED;;;;;OAKG;IACH,uCAHG;QAAsB,eAAe;KACrC,GAAU,OAAO,CAAC,OAAO,YAAY,EAAE,gBAAgB,EAAE,CAAC,CAwD5D;IAED;;;;;;;;;;;;OAYG;IACH,+DALG;QAA6B,cAAc;QACd,WAAW;QAClB,SAAS;KAC/B,GAAU,OAAO,CAAC,MAAM,CAAC,CAmB3B;IAED;;;;;;;;;OASG;IACH,2DANG;QAAqB,MAAM,EAAnB,MAAM;QACO,MAAM,EAAnB,MAAM;QACO,MAAM,EAAnB,MAAM;QACO,SAAS,EAAtB,MAAM;KACd,GAAU,OAAO,CAAC,MAAM,CAAC,CAkC3B;IAED;;;OAGG;IACH,YAFa,OAAO,CAAC,IAAI,CAAC,CAYzB;IAED;;;;OAIG;IACH,cAHW,MAAM,GACJ,OAAO,CAAC,OAAO,CAAC,CAgB5B;IAED;;;;OAIG;IACH,4BAHW,MAAM,GACJ,MAAM,CAUlB;IAED;;;;OAIG;IACH,iCAHW,MAAM,GAAG,IAAI,GAAG,SAAS,GACvB,MAAM,CAQlB;IAED;;;;;OAKG;IACH,uCAJW,MAAM,GAAG,SAAS,wBAClB,MAAM,GACJ,MAAM,CAOlB;IAED;;;;;;;;OAQG;IACH,2BANW,OAAO,6BAA6B,EAAE,OAAO,GAI3C,OAAO,CAAC,IAAI,CAAC,CAUzB;IAED;;;;;OAKG;IACH,iBAHW,OAAO,6BAA6B,EAAE,OAAO,GAC3C,OAAO,CAAC,IAAI,CAAC,CAmBzB;IAED;;;;;OAKG;IACH,sBAHW,OAAO,6BAA6B,EAAE,OAAO,GAC3C,OAAO,CAAC,IAAI,CAAC,CAgCzB;IAED;;;;OAIG;IACH,2BAHW,OAAO,6BAA6B,EAAE,OAAO,GAC3C,OAAO,CAAC,IAAI,CAAC,CAazB;IAED;;;;;OAKG;IACH,kBAJW,OAAO,6BAA6B,EAAE,OAAO,YAC7C,MAAM,GACJ,OAAO,CAAC,OAAO,CAAC,CAY5B;IAED;;;;OAIG;IACH,qBAHW,OAAO,6BAA6B,EAAE,OAAO,GAC3C,OAAO,CAAC,IAAI,CAAC,CAiCzB;IAED;;;;OAIG;IACH,4BAHW,OAAO,6BAA6B,EAAE,OAAO,GAC3C,OAAO,CAAC,IAAI,CAAC,CAoFzB;IAED;;;;;;OAMG;IACH,uBAHW,OAAO,6BAA6B,EAAE,OAAO,GAC3C,OAAO,CAAC,IAAI,CAAC,CA2BzB;IAED;;;;OAIG;IACH,gCAHW,OAAO,6BAA6B,EAAE,OAAO,GAC3C,OAAO,CAAC,IAAI,CAAC,CAsCzB;IAED;;;;;;;;;OASG;IACH,0BAHW,OAAO,6BAA6B,EAAE,OAAO,GAC3C,OAAO,CAAC,IAAI,CAAC,CA4CzB;IAED;;;;;OAKG;IACH,qBAJW,OAAO,6BAA6B,EAAE,OAAO,WAC7C,MAAM,GACJ,OAAO,CAAC,IAAI,CAAC,CAczB;IAED,kCAUC;IAED;;;;;OAKG;IACH,mBAJW,OAAO,6BAA6B,EAAE,OAAO,SAC7C,MAAM,GACJ,OAAO,CAAC,OAAO,YAAY,EAAE,gBAAgB,GAAG,IAAI,CAAC,CAcjE;IAED;;;;;;;;;OASG;IACH,4DAPG;QAA4D,EAAE,EAAtD,OAAO,6BAA6B,EAAE,OAAO;QACD,GAAG,EAA/C,OAAO,YAAY,EAAE,gBAAgB;QAC7B,KAAK,EAAb,OAAC;QACa,YAAY,EAA1B,OAAO;QACkB,UAAU;KAC3C,GAAU,OAAO,CAAC,OAAO,YAAY,EAAE,gBAAgB,GAAG,IAAI,CAAC,CAoDjE;IAED;;;;;;;;;;OAUG;IACH,6FARG;QAAqB,cAAc,EAA3B,MAAM;QACQ,YAAY,EAA1B,OAAO;QACM,WAAW,EAAxB,MAAM;QACO,GAAG,EAAhB,MAAM;QACc,WAAW,EAA/B,MAAM,GAAG,IAAI;QACC,WAAW,EAAzB,OAAO;KACf,GAAU,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAiB7B;IAED;;;;;;;OAOG;IACH,2DALG;QAAsB,YAAY,EAA1B,OAAO;QACM,GAAG,EAAhB,MAAM;QACkB,MAAM,EAA9B,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC;KACzB,GAAU,IAAI,CAIhB;IAED;;;;;;;;;OASG;IACH,mFAPG;QAAsB,YAAY,EAA1B,OAAO;QACM,GAAG,EAAhB,MAAM;QACc,WAAW,EAA/B,MAAM,GAAG,IAAI;QACC,WAAW,EAAzB,OAAO;QACiB,MAAM,EAA9B,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC;KACzB,GAAU,IAAI,CAgBhB;IAED;;;;OAIG;IACH,sBAHW,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,GACf,OAAO,YAAY,EAAE,gBAAgB,CA8BjD;IAED;;;;OAIG;IACH,sCAHW,OAAO,YAAY,EAAE,oBAAoB,GAAG,SAAS,GACnD;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAC,GAAG,IAAI,CAanE;IAED;;;;OAIG;IACH,yBAHW,OAAO,YAAY,EAAE,oBAAoB,GAAG,SAAS,GACnD,MAAM,CAQlB;IAED;;;;;;;;;OASG;IACH,6BAJW,OAAO,YAAY,EAAE,oBAAoB,GAAG,SAAS,SACrD,MAAM,GACJ;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,OAAO,CAAA;KAAC,GAAG,IAAI,CAY1F;IAED;;;;OAIG;IACH,4BAHW,MAAM,GACJ,MAAM,GAAG,IAAI,CASzB;IAED;;;;;;;OAOG;IACH,+BAJW,OAAO,6BAA6B,EAAE,OAAO,sCAC7C;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAC,GAC9C,OAAO,CAAC,IAAI,CAAC,CA0BzB;IAED;;;;OAIG;IACH,4BAHW,OAAO,6BAA6B,EAAE,OAAO,GAC3C,OAAO,CAAC,IAAI,CAAC,CASzB;IAED;;;;OAIG;IACH,8BAHW,OAAO,6BAA6B,EAAE,OAAO,GAC3C,OAAO,CAAC,IAAI,CAAC,CAsBzB;IAED;;;;;;OAMG;IACH,sBAJW,OAAO,6BAA6B,EAAE,OAAO,mBAC7C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACpB,OAAO,CAAC,IAAI,CAAC,CA8BzB;IAED;;;;;;OAMG;IACH,4BALW,OAAO,6BAA6B,EAAE,OAAO,aAC7C,MAAM,aACN,MAAM,GACJ,OAAO,CAAC,IAAI,CAAC,CAiBzB;IAED;;;;OAIG;IACH,mBAHW,OAAO,6BAA6B,EAAE,OAAO,GAC3C,OAAO,CAAC,MAAM,CAAC,CAW3B;IAED;;;;OAIG;IACH,uBAHW,OAAO,6BAA6B,EAAE,OAAO,GAC3C,OAAO,CAAC,IAAI,CAAC,CAOzB;IAED;;;OAGG;IACH,sBAFa,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAIlC;IAED;;;;OAIG;IACH,oBAHW,OAAO,YAAY,EAAE,gBAAgB,EAAE,GACrC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAYlC;IAED;;;;OAIG;IACH,qCAHW,OAAO,6BAA6B,EAAE,OAAO,GAC3C,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,CAAC,CAqBtF;IAED;;;;;;;OAOG;IACH,0BANW,OAAO,6BAA6B,EAAE,OAAO,sCAErD;QAA4B,cAAc,EAAlC,MAAM;QACc,cAAc,EAAlC,MAAM;KACd,GAAU,OAAO,CAAC,IAAI,CAAC,CAgBzB;IAED;;;;;;;;;;;;;;OAcG;IACH,wBAJW,OAAO,6BAA6B,EAAE,OAAO,kBAC7C,MAAM,GAAG,IAAI,GACX,OAAO,CAAC,IAAI,CAAC,CAOzB;IAED;;;;;OAKG;IACH,wBAJW,OAAO,6BAA6B,EAAE,OAAO,kBAC7C,MAAM,GACJ,OAAO,CAAC,OAAO,CAAC,CAO5B;IAED;;;;;OAKG;IACH,wBAJW,OAAO,6BAA6B,EAAE,OAAO,QAC7C,OAAO,6BAA6B,EAAE,iBAAiB,GACrD,OAAO,CAAC,MAAM,CAAC,CAI3B;IAED;;;;;OAKG;IACH,wBAJW,OAAO,6BAA6B,EAAE,OAAO,kBAC7C,MAAM,GAAG,IAAI,GACX,OAAO,CAAC,IAAI,CAAC,CAOzB;IAED;;;;OAIG;IACH,0BAHW,OAAO,6BAA6B,EAAE,OAAO,GAC3C,OAAO,CAAC,IAAI,CAAC,CAWzB;IAED;;;;;;;;;;;;;OAaG;IACH,+BAHW,OAAO,6BAA6B,EAAE,OAAO,GAC3C,OAAO,CAAC,IAAI,CAAC,CA6CzB;IAED;;;;OAIG;IACH,wBAHW,OAAC,GACC,MAAM,GAAG,IAAI,CAUzB;IAED;;;;OAIG;IACH,kCAHW,OAAO,YAAY,EAAE,oBAAoB,GACvC,OAAO,YAAY,EAAE,0BAA0B,CAkB3D;IAED;;;;OAIG;IACH,2CAHW,MAAM,GACJ,OAAO,YAAY,EAAE,0BAA0B,CAQ3D;IAED;;;;;;;;OAQG;IACH,kDALG;QAA4D,EAAE,EAAtD,OAAO,6BAA6B,EAAE,OAAO;QAC6D,aAAa,EAAvH,OAAO,YAAY,EAAE,0BAA0B,GAAG,OAAO,YAAY,EAAE,0BAA0B,EAAE;QAChD,KAAK,EAAxD,OAAO,4BAA4B,EAAE,OAAO;KACpD,GAAU,OAAO,4BAA4B,EAAE,OAAO,CAQxD;IAED;;;;OAIG;IACH,kBAHW,OAAC,GACC,KAAK,CAAC,OAAC,CAAC,CAcpB;IAED;;;;;OAKG;IACH,QAJa,CAAC,YACH,CAAC,EAAE,EAAE,OAAO,6BAA6B,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,GAC/D,OAAO,CAAC,CAAC,CAAC,CAoBtB;IAED;;;;;;OAMG;IACH,mBALa,CAAC,MACH,OAAO,6BAA6B,EAAE,OAAO,YAC7C,MAAM,OAAO,CAAC,CAAC,CAAC,GACd,OAAO,CAAC,CAAC,CAAC,CAYtB;IAED;;;;;;;;;OASG;IACH,yBALa,CAAC,MACH,OAAO,6BAA6B,EAAE,OAAO,YAC7C,MAAM,OAAO,CAAC,CAAC,CAAC,GACd,OAAO,CAAC,CAAC,CAAC,CAqBtB;IAED;;;;;;;;OAQG;IACH,iEANG;QAAoD,GAAG,EAA/C,OAAO,YAAY,EAAE,gBAAgB;QACL,SAAS,EAAzC,MAAM,GAAG,IAAI,GAAG,SAAS;QACO,QAAQ,EAAxC,MAAM,GAAG,IAAI,GAAG,SAAS;QACO,aAAa,EAA7C,MAAM,GAAG,IAAI,GAAG,SAAS;KACjC,GAAU,OAAO,CAQnB;IAED;;;;OAIG;IACH,8BAHW,OAAO,YAAY,EAAE,gBAAgB,GACnC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAIzC;IAED;;;;;;OAMG;IACH,4CAJG;QAAwC,SAAS,EAAzC,MAAM,GAAG,IAAI,GAAG,SAAS;QACmB,GAAG,EAA/C,OAAO,YAAY,EAAE,gBAAgB;KAC7C,GAAU,OAAO,CAMnB;IAED;;;;;;OAMG;IACH,wCAJG;QAAoD,GAAG,EAA/C,OAAO,YAAY,EAAE,gBAAgB;QACL,QAAQ,EAAxC,MAAM,GAAG,IAAI,GAAG,SAAS;KACjC,GAAU,OAAO,CAOnB;IAED;;;;;;OAMG;IACH,8CAJG;QAAwC,aAAa,EAA7C,MAAM,GAAG,IAAI,GAAG,SAAS;QACmB,GAAG,EAA/C,OAAO,YAAY,EAAE,gBAAgB;KAC7C,GAAU,OAAO,CAOnB;IAED;;;;OAIG;IACH,wBAHW,MAAM,GACJ,MAAM,CAIlB;CACF;mBAzjEkB,cAAc"}
|