@qurvo/sdk-core 0.0.1

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.
@@ -0,0 +1,5 @@
1
+ import type { Transport, SendOptions } from './types';
2
+ export declare class FetchTransport implements Transport {
3
+ send(endpoint: string, apiKey: string, payload: unknown, options?: SendOptions): Promise<boolean>;
4
+ }
5
+ //# sourceMappingURL=fetch-transport.d.ts.map
@@ -0,0 +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,MAAM,SAAS,CAAC;AAEtD,qBAAa,cAAe,YAAW,SAAS;IACxC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;CAgBxG"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FetchTransport = void 0;
4
+ class FetchTransport {
5
+ async send(endpoint, apiKey, payload, options) {
6
+ try {
7
+ const response = await fetch(endpoint, {
8
+ method: 'POST',
9
+ headers: {
10
+ 'Content-Type': 'application/json',
11
+ 'x-api-key': apiKey,
12
+ },
13
+ body: JSON.stringify(payload),
14
+ keepalive: options?.keepalive,
15
+ });
16
+ return response.ok || response.status === 202;
17
+ }
18
+ catch {
19
+ return false;
20
+ }
21
+ }
22
+ }
23
+ exports.FetchTransport = FetchTransport;
24
+ //# sourceMappingURL=fetch-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-transport.js","sourceRoot":"","sources":["../src/fetch-transport.ts"],"names":[],"mappings":";;;AAEA,MAAa,cAAc;IACzB,KAAK,CAAC,IAAI,CAAC,QAAgB,EAAE,MAAc,EAAE,OAAgB,EAAE,OAAqB;QAClF,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;gBACrC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,WAAW,EAAE,MAAM;iBACpB;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;gBAC7B,SAAS,EAAE,OAAO,EAAE,SAAS;aAC9B,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC;QAChD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF;AAjBD,wCAiBC"}
@@ -0,0 +1,4 @@
1
+ export type { SdkConfig, EventPayload, EventContext, Transport, SendOptions } from './types';
2
+ export { EventQueue } from './queue';
3
+ export { FetchTransport } from './fetch-transport';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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,MAAM,SAAS,CAAC;AAC7F,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FetchTransport = exports.EventQueue = void 0;
4
+ var queue_1 = require("./queue");
5
+ Object.defineProperty(exports, "EventQueue", { enumerable: true, get: function () { return queue_1.EventQueue; } });
6
+ var fetch_transport_1 = require("./fetch-transport");
7
+ Object.defineProperty(exports, "FetchTransport", { enumerable: true, get: function () { return fetch_transport_1.FetchTransport; } });
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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"}
@@ -0,0 +1,24 @@
1
+ import type { Transport } from './types';
2
+ export declare class EventQueue {
3
+ private readonly transport;
4
+ private readonly endpoint;
5
+ private readonly apiKey;
6
+ private readonly flushInterval;
7
+ private readonly flushSize;
8
+ private readonly maxQueueSize;
9
+ private queue;
10
+ private timer;
11
+ private flushing;
12
+ private failureCount;
13
+ private retryAfter;
14
+ private readonly maxBackoffMs;
15
+ constructor(transport: Transport, endpoint: string, apiKey: string, flushInterval?: number, flushSize?: number, maxQueueSize?: number);
16
+ enqueue(event: unknown): void;
17
+ start(): void;
18
+ stop(): void;
19
+ flush(): Promise<void>;
20
+ private scheduleBackoff;
21
+ flushForUnload(): void;
22
+ get size(): number;
23
+ }
24
+ //# sourceMappingURL=queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC,qBAAa,UAAU;IASnB,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;IAb/B,OAAO,CAAC,KAAK,CAAiB;IAC9B,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,QAAQ,CAAS;IACzB,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;IAG9C,OAAO,CAAC,KAAK,EAAE,OAAO;IAWtB,KAAK;IAKL,IAAI;IAOE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB5B,OAAO,CAAC,eAAe;IAMvB,cAAc,IAAI,IAAI;IAOtB,IAAI,IAAI,WAEP;CACF"}
package/dist/queue.js ADDED
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EventQueue = void 0;
4
+ class EventQueue {
5
+ transport;
6
+ endpoint;
7
+ apiKey;
8
+ flushInterval;
9
+ flushSize;
10
+ maxQueueSize;
11
+ queue = [];
12
+ timer = null;
13
+ flushing = false;
14
+ failureCount = 0;
15
+ retryAfter = 0;
16
+ maxBackoffMs = 30_000;
17
+ constructor(transport, endpoint, apiKey, flushInterval = 5000, flushSize = 20, maxQueueSize = 1000) {
18
+ this.transport = transport;
19
+ this.endpoint = endpoint;
20
+ this.apiKey = apiKey;
21
+ this.flushInterval = flushInterval;
22
+ this.flushSize = flushSize;
23
+ this.maxQueueSize = maxQueueSize;
24
+ }
25
+ enqueue(event) {
26
+ if (this.queue.length >= this.maxQueueSize) {
27
+ this.queue.shift();
28
+ }
29
+ this.queue.push(event);
30
+ if (this.queue.length >= this.flushSize) {
31
+ this.flush();
32
+ }
33
+ }
34
+ start() {
35
+ if (this.timer)
36
+ return;
37
+ this.timer = setInterval(() => this.flush(), this.flushInterval);
38
+ }
39
+ stop() {
40
+ if (this.timer) {
41
+ clearInterval(this.timer);
42
+ this.timer = null;
43
+ }
44
+ }
45
+ async flush() {
46
+ if (this.flushing || this.queue.length === 0)
47
+ return;
48
+ if (Date.now() < this.retryAfter)
49
+ return;
50
+ this.flushing = true;
51
+ const batch = this.queue.splice(0);
52
+ try {
53
+ const ok = await this.transport.send(this.endpoint, this.apiKey, { events: batch });
54
+ if (!ok) {
55
+ this.queue.unshift(...batch);
56
+ this.scheduleBackoff();
57
+ }
58
+ else {
59
+ this.failureCount = 0;
60
+ this.retryAfter = 0;
61
+ }
62
+ }
63
+ catch {
64
+ this.queue.unshift(...batch);
65
+ this.scheduleBackoff();
66
+ }
67
+ finally {
68
+ this.flushing = false;
69
+ }
70
+ }
71
+ scheduleBackoff() {
72
+ this.failureCount++;
73
+ const backoffMs = Math.min(1000 * Math.pow(2, this.failureCount - 1), this.maxBackoffMs);
74
+ this.retryAfter = Date.now() + backoffMs;
75
+ }
76
+ flushForUnload() {
77
+ if (this.queue.length === 0)
78
+ return;
79
+ const batch = this.queue.splice(0);
80
+ this.transport.send(this.endpoint, this.apiKey, { events: batch }, { keepalive: true }).catch(() => { });
81
+ }
82
+ get size() {
83
+ return this.queue.length;
84
+ }
85
+ }
86
+ exports.EventQueue = EventQueue;
87
+ //# sourceMappingURL=queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.js","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ export interface SdkConfig {
2
+ apiKey: string;
3
+ endpoint?: string;
4
+ flushInterval?: number;
5
+ flushSize?: number;
6
+ maxQueueSize?: number;
7
+ }
8
+ export interface EventPayload {
9
+ event: string;
10
+ distinct_id: string;
11
+ anonymous_id?: string;
12
+ properties?: Record<string, unknown>;
13
+ user_properties?: Record<string, unknown>;
14
+ context?: EventContext;
15
+ timestamp?: string;
16
+ }
17
+ export interface EventContext {
18
+ session_id?: string;
19
+ url?: string;
20
+ referrer?: string;
21
+ page_title?: string;
22
+ page_path?: string;
23
+ device_type?: string;
24
+ browser?: string;
25
+ browser_version?: string;
26
+ os?: string;
27
+ os_version?: string;
28
+ screen_width?: number;
29
+ screen_height?: number;
30
+ language?: string;
31
+ timezone?: string;
32
+ sdk_name?: string;
33
+ sdk_version?: string;
34
+ }
35
+ export interface SendOptions {
36
+ keepalive?: boolean;
37
+ }
38
+ export interface Transport {
39
+ send(endpoint: string, apiKey: string, payload: unknown, options?: SendOptions): Promise<boolean>;
40
+ }
41
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +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;CACvB;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;CACpB;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;CACrB;AAED,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"}
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "@qurvo/sdk-core",
3
+ "version": "0.0.1",
4
+ "description": "Core transport and event queue for Qurvo analytics SDKs",
5
+ "license": "MIT",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "files": [
9
+ "dist"
10
+ ],
11
+ "publishConfig": {
12
+ "access": "public"
13
+ },
14
+ "devDependencies": {
15
+ "typescript": "^5.7.0",
16
+ "@qurvo/tsconfig": "0.0.0"
17
+ },
18
+ "scripts": {
19
+ "build": "tsc",
20
+ "dev": "tsc --watch",
21
+ "clean": "rm -rf dist .turbo"
22
+ }
23
+ }