@avibra/pulse-core 1.0.0

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 (53) hide show
  1. package/dist/api/APIClient.d.ts +50 -0
  2. package/dist/api/APIClient.d.ts.map +1 -0
  3. package/dist/api/APIClient.js +324 -0
  4. package/dist/api/APIClient.js.map +1 -0
  5. package/dist/audio/CallRecorder.d.ts +64 -0
  6. package/dist/audio/CallRecorder.d.ts.map +1 -0
  7. package/dist/audio/CallRecorder.js +370 -0
  8. package/dist/audio/CallRecorder.js.map +1 -0
  9. package/dist/core/EventTracker.d.ts +21 -0
  10. package/dist/core/EventTracker.d.ts.map +1 -0
  11. package/dist/core/EventTracker.js +133 -0
  12. package/dist/core/EventTracker.js.map +1 -0
  13. package/dist/core/SessionManager.d.ts +18 -0
  14. package/dist/core/SessionManager.d.ts.map +1 -0
  15. package/dist/core/SessionManager.js +70 -0
  16. package/dist/core/SessionManager.js.map +1 -0
  17. package/dist/core/TriggerManager.d.ts +15 -0
  18. package/dist/core/TriggerManager.d.ts.map +1 -0
  19. package/dist/core/TriggerManager.js +61 -0
  20. package/dist/core/TriggerManager.js.map +1 -0
  21. package/dist/core/UserIdentityManager.d.ts +20 -0
  22. package/dist/core/UserIdentityManager.d.ts.map +1 -0
  23. package/dist/core/UserIdentityManager.js +71 -0
  24. package/dist/core/UserIdentityManager.js.map +1 -0
  25. package/dist/index.d.ts +15 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +19 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/platform.d.ts +64 -0
  30. package/dist/platform.d.ts.map +1 -0
  31. package/dist/platform.js +8 -0
  32. package/dist/platform.js.map +1 -0
  33. package/dist/types.d.ts +175 -0
  34. package/dist/types.d.ts.map +1 -0
  35. package/dist/types.js +6 -0
  36. package/dist/types.js.map +1 -0
  37. package/dist/utils/crypto.d.ts +3 -0
  38. package/dist/utils/crypto.d.ts.map +1 -0
  39. package/dist/utils/crypto.js +34 -0
  40. package/dist/utils/crypto.js.map +1 -0
  41. package/dist/utils/logger.d.ts +8 -0
  42. package/dist/utils/logger.d.ts.map +1 -0
  43. package/dist/utils/logger.js +29 -0
  44. package/dist/utils/logger.js.map +1 -0
  45. package/dist/utils/queue.d.ts +21 -0
  46. package/dist/utils/queue.d.ts.map +1 -0
  47. package/dist/utils/queue.js +81 -0
  48. package/dist/utils/queue.js.map +1 -0
  49. package/dist/utils/retry.d.ts +12 -0
  50. package/dist/utils/retry.d.ts.map +1 -0
  51. package/dist/utils/retry.js +66 -0
  52. package/dist/utils/retry.js.map +1 -0
  53. package/package.json +25 -0
@@ -0,0 +1,21 @@
1
+ import type { StorageAdapter, NetworkAdapter } from '../platform';
2
+ import { QueuedRequest } from '../types';
3
+ export declare class OfflineQueue {
4
+ private queue;
5
+ private readonly maxSize;
6
+ private readonly storage;
7
+ private drainHandler;
8
+ private unsubscribeNetwork;
9
+ constructor(maxSize: number, storage: StorageAdapter, network: NetworkAdapter);
10
+ onDrain(handler: () => Promise<void>): void;
11
+ enqueue(item: QueuedRequest): void;
12
+ flush(): QueuedRequest[];
13
+ get size(): number;
14
+ get isEmpty(): boolean;
15
+ peek(): ReadonlyArray<QueuedRequest>;
16
+ clear(): void;
17
+ destroy(): void;
18
+ private persist;
19
+ private loadFromStorage;
20
+ }
21
+ //# sourceMappingURL=queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/utils/queue.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAKzC,qBAAa,YAAY;IACrB,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,YAAY,CAAsC;IAC1D,OAAO,CAAC,kBAAkB,CAA6B;gBAE3C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,cAAc;IAYtE,OAAO,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAI3C,OAAO,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAUlC,KAAK,IAAI,aAAa,EAAE;IAO/B,IAAW,IAAI,IAAI,MAAM,CAA8B;IACvD,IAAW,OAAO,IAAI,OAAO,CAAoC;IAC1D,IAAI,IAAI,aAAa,CAAC,aAAa,CAAC;IAEpC,KAAK,IAAI,IAAI;IAKb,OAAO,IAAI,IAAI;YAKR,OAAO;YAQP,eAAe;CAkBhC"}
@@ -0,0 +1,81 @@
1
+ // ─────────────────────────────────────────────────────────────────────────────
2
+ // Pulse Core — Offline Event Queue
3
+ // Uses StorageAdapter + NetworkAdapter instead of direct localStorage/NetInfo.
4
+ // ─────────────────────────────────────────────────────────────────────────────
5
+ import { logger } from './logger';
6
+ const STORAGE_KEY = '__pulse_offline_queue__';
7
+ export class OfflineQueue {
8
+ constructor(maxSize, storage, network) {
9
+ this.queue = [];
10
+ this.drainHandler = null;
11
+ this.unsubscribeNetwork = null;
12
+ this.maxSize = maxSize;
13
+ this.storage = storage;
14
+ void this.loadFromStorage();
15
+ this.unsubscribeNetwork = network.onOnline(() => {
16
+ logger.info('[OfflineQueue] Connection restored — draining queue');
17
+ if (this.drainHandler && !this.isEmpty) {
18
+ void this.drainHandler();
19
+ }
20
+ });
21
+ }
22
+ onDrain(handler) {
23
+ this.drainHandler = handler;
24
+ }
25
+ enqueue(item) {
26
+ if (this.queue.length >= this.maxSize) {
27
+ this.queue.shift();
28
+ logger.warn('[OfflineQueue] Queue full — dropping oldest event');
29
+ }
30
+ this.queue.push(item);
31
+ void this.persist();
32
+ logger.debug(`[OfflineQueue] Enqueued ${item.endpoint} (queue size: ${this.queue.length})`);
33
+ }
34
+ flush() {
35
+ const items = [...this.queue];
36
+ this.queue = [];
37
+ void this.persist();
38
+ return items;
39
+ }
40
+ get size() { return this.queue.length; }
41
+ get isEmpty() { return this.queue.length === 0; }
42
+ peek() { return this.queue; }
43
+ clear() {
44
+ this.queue = [];
45
+ void this.persist();
46
+ }
47
+ destroy() {
48
+ this.unsubscribeNetwork?.();
49
+ this.unsubscribeNetwork = null;
50
+ }
51
+ async persist() {
52
+ try {
53
+ await this.storage.setItem(STORAGE_KEY, JSON.stringify(this.queue));
54
+ }
55
+ catch {
56
+ logger.warn('[OfflineQueue] Failed to persist queue');
57
+ }
58
+ }
59
+ async loadFromStorage() {
60
+ try {
61
+ const raw = await this.storage.getItem(STORAGE_KEY);
62
+ if (!raw)
63
+ return;
64
+ const parsed = JSON.parse(raw);
65
+ if (!Array.isArray(parsed))
66
+ return;
67
+ const persisted = parsed;
68
+ const existingIds = new Set(this.queue.map((q) => q.id));
69
+ for (const item of persisted) {
70
+ if (!existingIds.has(item.id)) {
71
+ this.queue.push(item);
72
+ }
73
+ }
74
+ logger.debug(`[OfflineQueue] Restored ${persisted.length} queued event(s)`);
75
+ }
76
+ catch {
77
+ // Corrupt storage — proceed with in-memory only
78
+ }
79
+ }
80
+ }
81
+ //# sourceMappingURL=queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/utils/queue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { RetryConfig } from '../types';
2
+ export declare const DEFAULT_RETRY_CONFIG: RetryConfig;
3
+ export declare class RetryableError extends Error {
4
+ readonly statusCode?: number | undefined;
5
+ constructor(message: string, statusCode?: number | undefined);
6
+ }
7
+ export declare class NonRetryableError extends Error {
8
+ readonly statusCode?: number | undefined;
9
+ constructor(message: string, statusCode?: number | undefined);
10
+ }
11
+ export declare function withRetry<T>(fn: () => Promise<T>, config?: Partial<RetryConfig>, context?: string): Promise<T>;
12
+ //# sourceMappingURL=retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAGvC,eAAO,MAAM,oBAAoB,EAAE,WAKlC,CAAC;AAEF,qBAAa,cAAe,SAAQ,KAAK;aACQ,UAAU,CAAC,EAAE,MAAM;gBAApD,OAAO,EAAE,MAAM,EAAkB,UAAU,CAAC,EAAE,MAAM,YAAA;CAInE;AAED,qBAAa,iBAAkB,SAAQ,KAAK;aACK,UAAU,CAAC,EAAE,MAAM;gBAApD,OAAO,EAAE,MAAM,EAAkB,UAAU,CAAC,EAAE,MAAM,YAAA;CAInE;AAYD,wBAAsB,SAAS,CAAC,CAAC,EAC7B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,MAAM,GAAE,OAAO,CAAC,WAAW,CAAM,EACjC,OAAO,SAAY,GACpB,OAAO,CAAC,CAAC,CAAC,CAwCZ"}
@@ -0,0 +1,66 @@
1
+ // ─────────────────────────────────────────────────────────────────────────────
2
+ // Pulse Core — Exponential Backoff Retry Utility
3
+ // ─────────────────────────────────────────────────────────────────────────────
4
+ import { logger } from './logger';
5
+ export const DEFAULT_RETRY_CONFIG = {
6
+ maxAttempts: 3,
7
+ baseDelayMs: 500,
8
+ maxDelayMs: 10000,
9
+ noRetryStatuses: [400, 401, 403, 404, 422],
10
+ };
11
+ export class RetryableError extends Error {
12
+ constructor(message, statusCode) {
13
+ super(message);
14
+ this.statusCode = statusCode;
15
+ this.name = 'RetryableError';
16
+ }
17
+ }
18
+ export class NonRetryableError extends Error {
19
+ constructor(message, statusCode) {
20
+ super(message);
21
+ this.statusCode = statusCode;
22
+ this.name = 'NonRetryableError';
23
+ }
24
+ }
25
+ function computeDelay(attempt, config) {
26
+ const exponential = config.baseDelayMs * Math.pow(2, attempt);
27
+ const capped = Math.min(config.maxDelayMs, exponential);
28
+ return Math.random() * capped;
29
+ }
30
+ function sleep(ms) {
31
+ return new Promise((resolve) => setTimeout(resolve, ms));
32
+ }
33
+ export async function withRetry(fn, config = {}, context = 'request') {
34
+ const cfg = { ...DEFAULT_RETRY_CONFIG, ...config };
35
+ let lastError = new Error('Unknown error');
36
+ for (let attempt = 0; attempt < cfg.maxAttempts; attempt++) {
37
+ try {
38
+ return await fn();
39
+ }
40
+ catch (err) {
41
+ const error = err instanceof Error ? err : new Error(String(err));
42
+ if (error instanceof NonRetryableError) {
43
+ logger.warn(`[Retry] Non-retryable error for ${context}:`, error.message);
44
+ throw error;
45
+ }
46
+ if (error instanceof RetryableError && error.statusCode !== undefined) {
47
+ if (cfg.noRetryStatuses.includes(error.statusCode)) {
48
+ logger.warn(`[Retry] Status ${error.statusCode} is non-retryable for ${context}`);
49
+ throw error;
50
+ }
51
+ }
52
+ lastError = error;
53
+ const isLastAttempt = attempt === cfg.maxAttempts - 1;
54
+ if (isLastAttempt) {
55
+ logger.error(`[Retry] All ${cfg.maxAttempts} attempts failed for ${context}`);
56
+ break;
57
+ }
58
+ const delay = computeDelay(attempt, cfg);
59
+ logger.debug(`[Retry] Attempt ${attempt + 1}/${cfg.maxAttempts} failed for ${context}. ` +
60
+ `Retrying in ${Math.round(delay)}ms...`);
61
+ await sleep(delay);
62
+ }
63
+ }
64
+ throw lastError;
65
+ }
66
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "@avibra/pulse-core",
3
+ "version": "1.0.0",
4
+ "description": "Pulse shared core — platform adapters, API client, and utilities",
5
+ "author": "Pulse Engineering <engineering@pulse.io>",
6
+ "license": "MIT",
7
+ "main": "dist/index.js",
8
+ "module": "dist/index.mjs",
9
+ "types": "dist/index.d.ts",
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "scripts": {
14
+ "build": "tsc -p tsconfig.build.json",
15
+ "clean": "rm -rf dist",
16
+ "typecheck": "tsc --noEmit",
17
+ "prepublishOnly": "npm run clean && npm run build"
18
+ },
19
+ "publishConfig": {
20
+ "access": "public"
21
+ },
22
+ "devDependencies": {
23
+ "typescript": "^5.3.0"
24
+ }
25
+ }