@qurvo/sdk-core 0.0.7 → 0.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/fetch-transport.d.ts.map +1 -1
- package/dist/fetch-transport.js +12 -0
- package/dist/fetch-transport.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/queue.d.ts +5 -2
- package/dist/queue.d.ts.map +1 -1
- package/dist/queue.js +52 -12
- package/dist/queue.js.map +1 -1
- package/dist/queue.test.d.ts +2 -0
- package/dist/queue.test.d.ts.map +1 -0
- package/dist/queue.test.js +187 -0
- package/dist/queue.test.js.map +1 -0
- package/dist/types.d.ts +13 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +18 -0
- package/dist/types.js.map +1 -1
- package/package.json +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-transport.d.ts","sourceRoot":"","sources":["../src/fetch-transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"fetch-transport.d.ts","sourceRoot":"","sources":["../src/fetch-transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGlE,qBAAa,cAAe,YAAW,SAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAAT,QAAQ,CAAC,EAAE,UAAU,YAAA;IAE5C,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;CA2CxG"}
|
package/dist/fetch-transport.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.FetchTransport = void 0;
|
|
4
|
+
const types_1 = require("./types");
|
|
4
5
|
class FetchTransport {
|
|
5
6
|
compress;
|
|
6
7
|
constructor(compress) {
|
|
@@ -30,7 +31,18 @@ class FetchTransport {
|
|
|
30
31
|
});
|
|
31
32
|
if (response.ok || response.status === 202)
|
|
32
33
|
return true;
|
|
34
|
+
if (response.status === 429) {
|
|
35
|
+
const responseBody = await response.json().catch(() => ({}));
|
|
36
|
+
if (responseBody?.quota_limited) {
|
|
37
|
+
throw new types_1.QuotaExceededError();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
33
40
|
const responseBody = await response.text().catch(() => '');
|
|
41
|
+
// 4xx = client error, retrying won't help (bad data, auth, validation)
|
|
42
|
+
if (response.status >= 400 && response.status < 500) {
|
|
43
|
+
throw new types_1.NonRetryableError(response.status, `HTTP ${response.status}: ${responseBody}`);
|
|
44
|
+
}
|
|
45
|
+
// 5xx = server error, retryable
|
|
34
46
|
throw new Error(`HTTP ${response.status}: ${responseBody}`);
|
|
35
47
|
}
|
|
36
48
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-transport.js","sourceRoot":"","sources":["../src/fetch-transport.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"fetch-transport.js","sourceRoot":"","sources":["../src/fetch-transport.ts"],"names":[],"mappings":";;;AACA,mCAAgE;AAEhE,MAAa,cAAc;IACI;IAA7B,YAA6B,QAAqB;QAArB,aAAQ,GAAR,QAAQ,CAAa;IAAG,CAAC;IAEtD,KAAK,CAAC,IAAI,CAAC,QAAgB,EAAE,MAAc,EAAE,OAAgB,EAAE,OAAqB;QAClF,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,OAAO,GAA2B;YACtC,WAAW,EAAE,MAAM;SACpB,CAAC;QAEF,IAAI,IAAc,CAAC;QACnB,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC;YACzC,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACjC,OAAO,CAAC,cAAc,CAAC,GAAG,YAAY,CAAC;YACvC,OAAO,CAAC,kBAAkB,CAAC,GAAG,MAAM,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,IAAI,CAAC;YACZ,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;QAC/C,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;YACrC,MAAM,EAAE,MAAM;YACd,OAAO;YACP,IAAI;YACJ,SAAS,EAAE,OAAO,EAAE,SAAS;YAC7B,MAAM,EAAE,OAAO,EAAE,MAAM;SACxB,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QAExD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7D,IAAI,YAAY,EAAE,aAAa,EAAE,CAAC;gBAChC,MAAM,IAAI,0BAAkB,EAAE,CAAC;YACjC,CAAC;QACH,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAE3D,uEAAuE;QACvE,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YACpD,MAAM,IAAI,yBAAiB,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,QAAQ,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC,CAAC;QAC3F,CAAC;QAED,gCAAgC;QAChC,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC,CAAC;IAC9D,CAAC;CACF;AA9CD,wCA8CC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export type { SdkConfig, EventPayload, EventContext, Transport, SendOptions, CompressFn, LogFn } from './types';
|
|
1
|
+
export type { SdkConfig, EventPayload, EventContext, Transport, SendOptions, CompressFn, LogFn, QueuePersistence } from './types';
|
|
2
|
+
export { QuotaExceededError, NonRetryableError } from './types';
|
|
2
3
|
export { EventQueue } from './queue';
|
|
3
4
|
export { FetchTransport } from './fetch-transport';
|
|
4
5
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAClI,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.FetchTransport = exports.EventQueue = void 0;
|
|
3
|
+
exports.FetchTransport = exports.EventQueue = exports.NonRetryableError = exports.QuotaExceededError = void 0;
|
|
4
|
+
var types_1 = require("./types");
|
|
5
|
+
Object.defineProperty(exports, "QuotaExceededError", { enumerable: true, get: function () { return types_1.QuotaExceededError; } });
|
|
6
|
+
Object.defineProperty(exports, "NonRetryableError", { enumerable: true, get: function () { return types_1.NonRetryableError; } });
|
|
4
7
|
var queue_1 = require("./queue");
|
|
5
8
|
Object.defineProperty(exports, "EventQueue", { enumerable: true, get: function () { return queue_1.EventQueue; } });
|
|
6
9
|
var fetch_transport_1 = require("./fetch-transport");
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,iCAAqC;AAA5B,mGAAA,UAAU,OAAA;AACnB,qDAAmD;AAA1C,iHAAA,cAAc,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,iCAAgE;AAAvD,2GAAA,kBAAkB,OAAA;AAAE,0GAAA,iBAAiB,OAAA;AAC9C,iCAAqC;AAA5B,mGAAA,UAAU,OAAA;AACnB,qDAAmD;AAA1C,iHAAA,cAAc,OAAA"}
|
package/dist/queue.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Transport, LogFn } from './types';
|
|
1
|
+
import type { Transport, LogFn, QueuePersistence } from './types';
|
|
2
2
|
export declare class EventQueue {
|
|
3
3
|
private readonly transport;
|
|
4
4
|
private readonly endpoint;
|
|
@@ -8,13 +8,15 @@ export declare class EventQueue {
|
|
|
8
8
|
private readonly maxQueueSize;
|
|
9
9
|
private readonly sendTimeoutMs;
|
|
10
10
|
private readonly logger?;
|
|
11
|
+
private readonly persistence?;
|
|
11
12
|
private queue;
|
|
12
13
|
private timer;
|
|
13
14
|
private flushing;
|
|
15
|
+
private inFlightBatch;
|
|
14
16
|
private failureCount;
|
|
15
17
|
private retryAfter;
|
|
16
18
|
private readonly maxBackoffMs;
|
|
17
|
-
constructor(transport: Transport, endpoint: string, apiKey: string, flushInterval?: number, flushSize?: number, maxQueueSize?: number, sendTimeoutMs?: number, logger?: LogFn | undefined);
|
|
19
|
+
constructor(transport: Transport, endpoint: string, apiKey: string, flushInterval?: number, flushSize?: number, maxQueueSize?: number, sendTimeoutMs?: number, logger?: LogFn | undefined, persistence?: QueuePersistence | undefined);
|
|
18
20
|
enqueue(event: unknown): void;
|
|
19
21
|
start(): void;
|
|
20
22
|
stop(): void;
|
|
@@ -24,5 +26,6 @@ export declare class EventQueue {
|
|
|
24
26
|
shutdown(timeoutMs?: number): Promise<void>;
|
|
25
27
|
flushForUnload(): void;
|
|
26
28
|
get size(): number;
|
|
29
|
+
private persist;
|
|
27
30
|
}
|
|
28
31
|
//# sourceMappingURL=queue.d.ts.map
|
package/dist/queue.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAGlE,qBAAa,UAAU;IAUnB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;IAjB/B,OAAO,CAAC,KAAK,CAAiB;IAC9B,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,aAAa,CAA0B;IAC/C,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAU;gBAGpB,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,aAAa,GAAE,MAAa,EAC5B,SAAS,GAAE,MAAW,EACtB,YAAY,GAAE,MAAa,EAC3B,aAAa,GAAE,MAAe,EAC9B,MAAM,CAAC,EAAE,KAAK,YAAA,EACd,WAAW,CAAC,EAAE,gBAAgB,YAAA;IAejD,OAAO,CAAC,KAAK,EAAE,OAAO;IAatB,KAAK;IAKL,IAAI;IAOE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiD5B,OAAO,CAAC,eAAe;IAMjB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAUzB,QAAQ,CAAC,SAAS,GAAE,MAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IASzD,cAAc,IAAI,IAAI;IAStB,IAAI,IAAI,WAEP;IAED,OAAO,CAAC,OAAO;CAOhB"}
|
package/dist/queue.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.EventQueue = void 0;
|
|
4
|
+
const types_1 = require("./types");
|
|
4
5
|
class EventQueue {
|
|
5
6
|
transport;
|
|
6
7
|
endpoint;
|
|
@@ -10,13 +11,15 @@ class EventQueue {
|
|
|
10
11
|
maxQueueSize;
|
|
11
12
|
sendTimeoutMs;
|
|
12
13
|
logger;
|
|
14
|
+
persistence;
|
|
13
15
|
queue = [];
|
|
14
16
|
timer = null;
|
|
15
17
|
flushing = false;
|
|
18
|
+
inFlightBatch = null;
|
|
16
19
|
failureCount = 0;
|
|
17
20
|
retryAfter = 0;
|
|
18
21
|
maxBackoffMs = 30_000;
|
|
19
|
-
constructor(transport, endpoint, apiKey, flushInterval = 5000, flushSize = 20, maxQueueSize = 1000, sendTimeoutMs = 30_000, logger) {
|
|
22
|
+
constructor(transport, endpoint, apiKey, flushInterval = 5000, flushSize = 20, maxQueueSize = 1000, sendTimeoutMs = 30_000, logger, persistence) {
|
|
20
23
|
this.transport = transport;
|
|
21
24
|
this.endpoint = endpoint;
|
|
22
25
|
this.apiKey = apiKey;
|
|
@@ -25,6 +28,19 @@ class EventQueue {
|
|
|
25
28
|
this.maxQueueSize = maxQueueSize;
|
|
26
29
|
this.sendTimeoutMs = sendTimeoutMs;
|
|
27
30
|
this.logger = logger;
|
|
31
|
+
this.persistence = persistence;
|
|
32
|
+
if (this.persistence) {
|
|
33
|
+
try {
|
|
34
|
+
const persisted = this.persistence.load();
|
|
35
|
+
if (persisted.length > 0) {
|
|
36
|
+
this.queue.push(...persisted);
|
|
37
|
+
this.logger?.(`restored ${persisted.length} events from persistence`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
this.logger?.('failed to restore persisted events');
|
|
42
|
+
}
|
|
43
|
+
}
|
|
28
44
|
}
|
|
29
45
|
enqueue(event) {
|
|
30
46
|
if (this.queue.length >= this.maxQueueSize) {
|
|
@@ -32,6 +48,7 @@ class EventQueue {
|
|
|
32
48
|
this.logger?.(`queue full (${this.maxQueueSize}), oldest event dropped`);
|
|
33
49
|
}
|
|
34
50
|
this.queue.push(event);
|
|
51
|
+
this.persist();
|
|
35
52
|
if (this.queue.length >= this.flushSize) {
|
|
36
53
|
this.flush();
|
|
37
54
|
}
|
|
@@ -53,17 +70,17 @@ class EventQueue {
|
|
|
53
70
|
if (Date.now() < this.retryAfter)
|
|
54
71
|
return;
|
|
55
72
|
this.flushing = true;
|
|
56
|
-
|
|
73
|
+
this.inFlightBatch = this.queue.splice(0, this.flushSize);
|
|
57
74
|
try {
|
|
58
75
|
const controller = new AbortController();
|
|
59
76
|
const timeout = setTimeout(() => controller.abort(), this.sendTimeoutMs);
|
|
60
77
|
try {
|
|
61
|
-
const ok = await this.transport.send(this.endpoint, this.apiKey, { events:
|
|
78
|
+
const ok = await this.transport.send(this.endpoint, this.apiKey, { events: this.inFlightBatch, sent_at: new Date().toISOString() }, { signal: controller.signal });
|
|
62
79
|
if (!ok) {
|
|
63
|
-
this.queue.unshift(...
|
|
80
|
+
this.queue.unshift(...this.inFlightBatch);
|
|
64
81
|
this.scheduleBackoff();
|
|
65
82
|
const backoffMs = Math.min(1000 * Math.pow(2, this.failureCount - 1), this.maxBackoffMs);
|
|
66
|
-
this.logger?.(`flush failed, ${
|
|
83
|
+
this.logger?.(`flush failed, ${this.inFlightBatch.length} events re-queued, retry in ${backoffMs}ms`);
|
|
67
84
|
}
|
|
68
85
|
else {
|
|
69
86
|
this.failureCount = 0;
|
|
@@ -75,12 +92,25 @@ class EventQueue {
|
|
|
75
92
|
}
|
|
76
93
|
}
|
|
77
94
|
catch (err) {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
95
|
+
if (err instanceof types_1.QuotaExceededError) {
|
|
96
|
+
this.queue.length = 0;
|
|
97
|
+
this.inFlightBatch = null;
|
|
98
|
+
this.stop();
|
|
99
|
+
this.logger?.('quota exceeded, events dropped and queue stopped');
|
|
100
|
+
}
|
|
101
|
+
else if (err instanceof types_1.NonRetryableError) {
|
|
102
|
+
this.logger?.(`non-retryable error (${err.statusCode}), ${this.inFlightBatch.length} events dropped`, err);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
this.queue.unshift(...this.inFlightBatch);
|
|
106
|
+
this.scheduleBackoff();
|
|
107
|
+
this.logger?.(`flush error, ${this.inFlightBatch.length} events re-queued`, err);
|
|
108
|
+
}
|
|
81
109
|
}
|
|
82
110
|
finally {
|
|
111
|
+
this.inFlightBatch = null;
|
|
83
112
|
this.flushing = false;
|
|
113
|
+
this.persist();
|
|
84
114
|
}
|
|
85
115
|
}
|
|
86
116
|
scheduleBackoff() {
|
|
@@ -100,7 +130,7 @@ class EventQueue {
|
|
|
100
130
|
}
|
|
101
131
|
async shutdown(timeoutMs = 30_000) {
|
|
102
132
|
this.stop();
|
|
103
|
-
if (this.
|
|
133
|
+
if (this.size === 0)
|
|
104
134
|
return;
|
|
105
135
|
await Promise.race([
|
|
106
136
|
this.flushAll(),
|
|
@@ -108,13 +138,23 @@ class EventQueue {
|
|
|
108
138
|
]);
|
|
109
139
|
}
|
|
110
140
|
flushForUnload() {
|
|
111
|
-
|
|
141
|
+
const batch = [...(this.inFlightBatch || []), ...this.queue.splice(0)];
|
|
142
|
+
this.inFlightBatch = null;
|
|
143
|
+
this.persist();
|
|
144
|
+
if (batch.length === 0)
|
|
112
145
|
return;
|
|
113
|
-
const batch = this.queue.splice(0);
|
|
114
146
|
this.transport.send(this.endpoint, this.apiKey, { events: batch, sent_at: new Date().toISOString() }, { keepalive: true }).catch(() => { });
|
|
115
147
|
}
|
|
116
148
|
get size() {
|
|
117
|
-
return this.queue.length;
|
|
149
|
+
return this.queue.length + (this.inFlightBatch?.length || 0);
|
|
150
|
+
}
|
|
151
|
+
persist() {
|
|
152
|
+
try {
|
|
153
|
+
this.persistence?.save(this.queue);
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
// persistence is best-effort
|
|
157
|
+
}
|
|
118
158
|
}
|
|
119
159
|
}
|
|
120
160
|
exports.EventQueue = EventQueue;
|
package/dist/queue.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.test.d.ts","sourceRoot":"","sources":["../src/queue.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const queue_1 = require("./queue");
|
|
5
|
+
const types_1 = require("./types");
|
|
6
|
+
function createMockTransport(sendFn) {
|
|
7
|
+
return { send: sendFn ?? vitest_1.vi.fn(async () => true) };
|
|
8
|
+
}
|
|
9
|
+
function createMockPersistence() {
|
|
10
|
+
const store = [];
|
|
11
|
+
return {
|
|
12
|
+
store,
|
|
13
|
+
save: vitest_1.vi.fn((events) => { store.length = 0; store.push(...events); }),
|
|
14
|
+
load: vitest_1.vi.fn(() => [...store]),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function createQueue(opts = {}) {
|
|
18
|
+
return new queue_1.EventQueue(opts.transport ?? createMockTransport(), 'https://ingest.test/v1/batch', 'test-key', 60_000, // large flush interval — we flush manually in tests
|
|
19
|
+
opts.flushSize ?? 100, opts.maxQueueSize ?? 1000, 30_000, undefined, opts.persistence);
|
|
20
|
+
}
|
|
21
|
+
(0, vitest_1.describe)('EventQueue', () => {
|
|
22
|
+
(0, vitest_1.beforeEach)(() => {
|
|
23
|
+
vitest_1.vi.restoreAllMocks();
|
|
24
|
+
});
|
|
25
|
+
(0, vitest_1.it)('enqueues events and reports size', () => {
|
|
26
|
+
const q = createQueue();
|
|
27
|
+
q.enqueue({ id: 1 });
|
|
28
|
+
q.enqueue({ id: 2 });
|
|
29
|
+
(0, vitest_1.expect)(q.size).toBe(2);
|
|
30
|
+
});
|
|
31
|
+
(0, vitest_1.it)('flushes events via transport', async () => {
|
|
32
|
+
const send = vitest_1.vi.fn(async () => true);
|
|
33
|
+
const q = createQueue({ transport: createMockTransport(send) });
|
|
34
|
+
q.enqueue({ id: 1 });
|
|
35
|
+
q.enqueue({ id: 2 });
|
|
36
|
+
await q.flush();
|
|
37
|
+
(0, vitest_1.expect)(send).toHaveBeenCalledOnce();
|
|
38
|
+
const payload = send.mock.calls[0][2];
|
|
39
|
+
(0, vitest_1.expect)(payload.events).toHaveLength(2);
|
|
40
|
+
(0, vitest_1.expect)(q.size).toBe(0);
|
|
41
|
+
});
|
|
42
|
+
(0, vitest_1.it)('re-queues events on transport failure (returns false)', async () => {
|
|
43
|
+
const send = vitest_1.vi.fn(async () => false);
|
|
44
|
+
const q = createQueue({ transport: createMockTransport(send) });
|
|
45
|
+
q.enqueue({ id: 1 });
|
|
46
|
+
await q.flush();
|
|
47
|
+
(0, vitest_1.expect)(q.size).toBe(1);
|
|
48
|
+
});
|
|
49
|
+
(0, vitest_1.it)('re-queues events on transport error (network)', async () => {
|
|
50
|
+
const send = vitest_1.vi.fn(async () => { throw new Error('network'); });
|
|
51
|
+
const q = createQueue({ transport: createMockTransport(send) });
|
|
52
|
+
q.enqueue({ id: 1 });
|
|
53
|
+
await q.flush();
|
|
54
|
+
(0, vitest_1.expect)(q.size).toBe(1);
|
|
55
|
+
});
|
|
56
|
+
(0, vitest_1.it)('drops batch on NonRetryableError', async () => {
|
|
57
|
+
const send = vitest_1.vi.fn(async () => { throw new types_1.NonRetryableError(400, 'bad'); });
|
|
58
|
+
const q = createQueue({ transport: createMockTransport(send) });
|
|
59
|
+
q.enqueue({ id: 1 });
|
|
60
|
+
await q.flush();
|
|
61
|
+
(0, vitest_1.expect)(q.size).toBe(0);
|
|
62
|
+
});
|
|
63
|
+
(0, vitest_1.it)('clears queue and stops on QuotaExceededError', async () => {
|
|
64
|
+
const send = vitest_1.vi.fn(async () => { throw new types_1.QuotaExceededError(); });
|
|
65
|
+
const q = createQueue({ transport: createMockTransport(send) });
|
|
66
|
+
q.enqueue({ id: 1 });
|
|
67
|
+
q.enqueue({ id: 2 });
|
|
68
|
+
await q.flush();
|
|
69
|
+
(0, vitest_1.expect)(q.size).toBe(0);
|
|
70
|
+
});
|
|
71
|
+
(0, vitest_1.it)('drops oldest event when maxQueueSize is reached', () => {
|
|
72
|
+
const q = createQueue({ maxQueueSize: 3 });
|
|
73
|
+
q.enqueue({ id: 1 });
|
|
74
|
+
q.enqueue({ id: 2 });
|
|
75
|
+
q.enqueue({ id: 3 });
|
|
76
|
+
q.enqueue({ id: 4 });
|
|
77
|
+
(0, vitest_1.expect)(q.size).toBe(3);
|
|
78
|
+
});
|
|
79
|
+
(0, vitest_1.describe)('flushForUnload — in-flight batch recovery', () => {
|
|
80
|
+
(0, vitest_1.it)('includes in-flight batch in unload flush', async () => {
|
|
81
|
+
let resolveSend;
|
|
82
|
+
const sendPromise = new Promise((r) => { resolveSend = () => r(true); });
|
|
83
|
+
const sendCalls = [];
|
|
84
|
+
const send = vitest_1.vi.fn(async (...args) => {
|
|
85
|
+
sendCalls.push(args);
|
|
86
|
+
if (sendCalls.length === 1)
|
|
87
|
+
return sendPromise; // first call blocks
|
|
88
|
+
return true;
|
|
89
|
+
});
|
|
90
|
+
const q = createQueue({ transport: createMockTransport(send), flushSize: 2 });
|
|
91
|
+
q.enqueue({ id: 1 });
|
|
92
|
+
q.enqueue({ id: 2 });
|
|
93
|
+
q.enqueue({ id: 3 }); // stays in queue
|
|
94
|
+
// Start flush — takes [1, 2] as in-flight, [3] remains
|
|
95
|
+
const flushPromise = q.flush();
|
|
96
|
+
// Before flush completes, simulate page unload
|
|
97
|
+
q.flushForUnload();
|
|
98
|
+
// unload should send ALL events: in-flight [1,2] + queue [3]
|
|
99
|
+
(0, vitest_1.expect)(sendCalls).toHaveLength(2);
|
|
100
|
+
const unloadPayload = sendCalls[1][2];
|
|
101
|
+
(0, vitest_1.expect)(unloadPayload.events).toHaveLength(3);
|
|
102
|
+
(0, vitest_1.expect)(unloadPayload.events.map((e) => e.id)).toEqual([1, 2, 3]);
|
|
103
|
+
// Let the original flush complete
|
|
104
|
+
resolveSend();
|
|
105
|
+
await flushPromise;
|
|
106
|
+
});
|
|
107
|
+
(0, vitest_1.it)('sends only queue events when no in-flight batch', () => {
|
|
108
|
+
const send = vitest_1.vi.fn(async () => true);
|
|
109
|
+
const q = createQueue({ transport: createMockTransport(send) });
|
|
110
|
+
q.enqueue({ id: 1 });
|
|
111
|
+
q.flushForUnload();
|
|
112
|
+
(0, vitest_1.expect)(send).toHaveBeenCalledOnce();
|
|
113
|
+
const payload = send.mock.calls[0][2];
|
|
114
|
+
(0, vitest_1.expect)(payload.events).toHaveLength(1);
|
|
115
|
+
(0, vitest_1.expect)(q.size).toBe(0);
|
|
116
|
+
});
|
|
117
|
+
(0, vitest_1.it)('does nothing when queue and in-flight are empty', () => {
|
|
118
|
+
const send = vitest_1.vi.fn(async () => true);
|
|
119
|
+
const q = createQueue({ transport: createMockTransport(send) });
|
|
120
|
+
q.flushForUnload();
|
|
121
|
+
(0, vitest_1.expect)(send).not.toHaveBeenCalled();
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
(0, vitest_1.describe)('persistence', () => {
|
|
125
|
+
(0, vitest_1.it)('saves queue to persistence on enqueue', () => {
|
|
126
|
+
const persistence = createMockPersistence();
|
|
127
|
+
const q = createQueue({ persistence });
|
|
128
|
+
q.enqueue({ id: 1 });
|
|
129
|
+
(0, vitest_1.expect)(persistence.save).toHaveBeenCalled();
|
|
130
|
+
(0, vitest_1.expect)(persistence.store).toEqual([{ id: 1 }]);
|
|
131
|
+
});
|
|
132
|
+
(0, vitest_1.it)('restores events from persistence on construction', () => {
|
|
133
|
+
const persistence = createMockPersistence();
|
|
134
|
+
persistence.store.push({ id: 'old1' }, { id: 'old2' });
|
|
135
|
+
const q = createQueue({ persistence });
|
|
136
|
+
(0, vitest_1.expect)(q.size).toBe(2);
|
|
137
|
+
});
|
|
138
|
+
(0, vitest_1.it)('clears persistence after successful flush', async () => {
|
|
139
|
+
const persistence = createMockPersistence();
|
|
140
|
+
const q = createQueue({ persistence });
|
|
141
|
+
q.enqueue({ id: 1 });
|
|
142
|
+
await q.flush();
|
|
143
|
+
(0, vitest_1.expect)(persistence.store).toEqual([]);
|
|
144
|
+
});
|
|
145
|
+
(0, vitest_1.it)('persists remaining events after partial flush', async () => {
|
|
146
|
+
const persistence = createMockPersistence();
|
|
147
|
+
const q = createQueue({ persistence, flushSize: 1 });
|
|
148
|
+
q.enqueue({ id: 1 });
|
|
149
|
+
q.enqueue({ id: 2 });
|
|
150
|
+
await q.flush(); // sends first, keeps second
|
|
151
|
+
(0, vitest_1.expect)(persistence.store).toEqual([{ id: 2 }]);
|
|
152
|
+
});
|
|
153
|
+
(0, vitest_1.it)('persists on flushForUnload (clears queue)', () => {
|
|
154
|
+
const persistence = createMockPersistence();
|
|
155
|
+
const q = createQueue({ persistence });
|
|
156
|
+
q.enqueue({ id: 1 });
|
|
157
|
+
q.flushForUnload();
|
|
158
|
+
// queue should be empty after unload flush
|
|
159
|
+
(0, vitest_1.expect)(persistence.store).toEqual([]);
|
|
160
|
+
});
|
|
161
|
+
(0, vitest_1.it)('handles persistence load failure gracefully', () => {
|
|
162
|
+
const persistence = {
|
|
163
|
+
save: vitest_1.vi.fn(),
|
|
164
|
+
load: vitest_1.vi.fn(() => { throw new Error('corrupt'); }),
|
|
165
|
+
};
|
|
166
|
+
const q = createQueue({ persistence });
|
|
167
|
+
(0, vitest_1.expect)(q.size).toBe(0);
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
(0, vitest_1.describe)('size', () => {
|
|
171
|
+
(0, vitest_1.it)('includes in-flight batch during flush', async () => {
|
|
172
|
+
let resolveSend;
|
|
173
|
+
const send = vitest_1.vi.fn(() => new Promise((r) => { resolveSend = () => r(true); }));
|
|
174
|
+
const q = createQueue({ transport: createMockTransport(send) });
|
|
175
|
+
q.enqueue({ id: 1 });
|
|
176
|
+
q.enqueue({ id: 2 });
|
|
177
|
+
(0, vitest_1.expect)(q.size).toBe(2);
|
|
178
|
+
// Start flush manually — events move to inFlightBatch
|
|
179
|
+
const flushPromise = q.flush();
|
|
180
|
+
(0, vitest_1.expect)(q.size).toBe(2); // 2 in-flight, 0 in queue
|
|
181
|
+
resolveSend();
|
|
182
|
+
await flushPromise;
|
|
183
|
+
(0, vitest_1.expect)(q.size).toBe(0); // all sent
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
//# sourceMappingURL=queue.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.test.js","sourceRoot":"","sources":["../src/queue.test.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -14,6 +14,7 @@ export interface EventPayload {
|
|
|
14
14
|
user_properties?: Record<string, unknown>;
|
|
15
15
|
context?: EventContext;
|
|
16
16
|
timestamp?: string;
|
|
17
|
+
event_id?: string;
|
|
17
18
|
}
|
|
18
19
|
export interface EventContext {
|
|
19
20
|
session_id?: string;
|
|
@@ -38,8 +39,20 @@ export interface SendOptions {
|
|
|
38
39
|
signal?: AbortSignal;
|
|
39
40
|
}
|
|
40
41
|
export type LogFn = (message: string, error?: unknown) => void;
|
|
42
|
+
export interface QueuePersistence {
|
|
43
|
+
save(events: unknown[]): void;
|
|
44
|
+
load(): unknown[];
|
|
45
|
+
}
|
|
41
46
|
export type CompressFn = (data: string) => Promise<Blob>;
|
|
42
47
|
export interface Transport {
|
|
43
48
|
send(endpoint: string, apiKey: string, payload: unknown, options?: SendOptions): Promise<boolean>;
|
|
44
49
|
}
|
|
50
|
+
export declare class QuotaExceededError extends Error {
|
|
51
|
+
constructor();
|
|
52
|
+
}
|
|
53
|
+
/** Non-retryable error (4xx). SDK should drop the batch, not retry. */
|
|
54
|
+
export declare class NonRetryableError extends Error {
|
|
55
|
+
readonly statusCode: number;
|
|
56
|
+
constructor(statusCode: number, message: string);
|
|
57
|
+
}
|
|
45
58
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,KAAK,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,KAAK,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAGD,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;AAE/D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC9B,IAAI,IAAI,OAAO,EAAE,CAAC;CACnB;AAED,MAAM,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEzD,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACnG;AAED,qBAAa,kBAAmB,SAAQ,KAAK;;CAK5C;AAED,uEAAuE;AACvE,qBAAa,iBAAkB,SAAQ,KAAK;aACd,UAAU,EAAE,MAAM;gBAAlB,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAIhE"}
|
package/dist/types.js
CHANGED
|
@@ -1,3 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NonRetryableError = exports.QuotaExceededError = void 0;
|
|
4
|
+
class QuotaExceededError extends Error {
|
|
5
|
+
constructor() {
|
|
6
|
+
super('Monthly event limit exceeded');
|
|
7
|
+
this.name = 'QuotaExceededError';
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
exports.QuotaExceededError = QuotaExceededError;
|
|
11
|
+
/** Non-retryable error (4xx). SDK should drop the batch, not retry. */
|
|
12
|
+
class NonRetryableError extends Error {
|
|
13
|
+
statusCode;
|
|
14
|
+
constructor(statusCode, message) {
|
|
15
|
+
super(message);
|
|
16
|
+
this.statusCode = statusCode;
|
|
17
|
+
this.name = 'NonRetryableError';
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
exports.NonRetryableError = NonRetryableError;
|
|
3
21
|
//# sourceMappingURL=types.js.map
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;AA0DA,MAAa,kBAAmB,SAAQ,KAAK;IAC3C;QACE,KAAK,CAAC,8BAA8B,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AALD,gDAKC;AAED,uEAAuE;AACvE,MAAa,iBAAkB,SAAQ,KAAK;IACd;IAA5B,YAA4B,UAAkB,EAAE,OAAe;QAC7D,KAAK,CAAC,OAAO,CAAC,CAAC;QADW,eAAU,GAAV,UAAU,CAAQ;QAE5C,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AALD,8CAKC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@qurvo/sdk-core",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.9",
|
|
4
4
|
"description": "Core transport and event queue for Qurvo analytics SDKs",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
},
|
|
14
14
|
"devDependencies": {
|
|
15
15
|
"typescript": "^5.7.0",
|
|
16
|
+
"vitest": "^4.0.18",
|
|
16
17
|
"@qurvo/tsconfig": "0.0.0"
|
|
17
18
|
},
|
|
18
19
|
"scripts": {
|