@allmightypush/push-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 (133) hide show
  1. package/dist/cjs/circuit-breaker/CircuitBreaker.js +84 -0
  2. package/dist/cjs/circuit-breaker/CircuitBreaker.js.map +1 -0
  3. package/dist/cjs/circuit-breaker/index.js +6 -0
  4. package/dist/cjs/circuit-breaker/index.js.map +1 -0
  5. package/dist/cjs/core/PushCore.js +307 -0
  6. package/dist/cjs/core/PushCore.js.map +1 -0
  7. package/dist/cjs/core/index.js +6 -0
  8. package/dist/cjs/core/index.js.map +1 -0
  9. package/dist/cjs/index.js +26 -0
  10. package/dist/cjs/index.js.map +1 -0
  11. package/dist/cjs/rate-limiter/TokenBucketRateLimiter.js +43 -0
  12. package/dist/cjs/rate-limiter/TokenBucketRateLimiter.js.map +1 -0
  13. package/dist/cjs/rate-limiter/index.js +6 -0
  14. package/dist/cjs/rate-limiter/index.js.map +1 -0
  15. package/dist/cjs/retry/calculateNextRetry.js +22 -0
  16. package/dist/cjs/retry/calculateNextRetry.js.map +1 -0
  17. package/dist/cjs/retry/index.js +8 -0
  18. package/dist/cjs/retry/index.js.map +1 -0
  19. package/dist/cjs/retry/shouldRetry.js +19 -0
  20. package/dist/cjs/retry/shouldRetry.js.map +1 -0
  21. package/dist/cjs/types/adapters.js +3 -0
  22. package/dist/cjs/types/adapters.js.map +1 -0
  23. package/dist/cjs/types/configuration.js +26 -0
  24. package/dist/cjs/types/configuration.js.map +1 -0
  25. package/dist/cjs/types/errors.js +55 -0
  26. package/dist/cjs/types/errors.js.map +1 -0
  27. package/dist/cjs/types/index.js +23 -0
  28. package/dist/cjs/types/index.js.map +1 -0
  29. package/dist/cjs/types/notification.js +3 -0
  30. package/dist/cjs/types/notification.js.map +1 -0
  31. package/dist/cjs/types/results.js +3 -0
  32. package/dist/cjs/types/results.js.map +1 -0
  33. package/dist/cjs/types/subscription.js +3 -0
  34. package/dist/cjs/types/subscription.js.map +1 -0
  35. package/dist/cjs/vapid/generateVapidKeys.js +67 -0
  36. package/dist/cjs/vapid/generateVapidKeys.js.map +1 -0
  37. package/dist/cjs/vapid/index.js +19 -0
  38. package/dist/cjs/vapid/index.js.map +1 -0
  39. package/dist/cjs/vapid/validateVapidKeys.js +44 -0
  40. package/dist/cjs/vapid/validateVapidKeys.js.map +1 -0
  41. package/dist/cjs/worker/RetryWorker.js +151 -0
  42. package/dist/cjs/worker/RetryWorker.js.map +1 -0
  43. package/dist/cjs/worker/index.js +18 -0
  44. package/dist/cjs/worker/index.js.map +1 -0
  45. package/dist/esm/circuit-breaker/CircuitBreaker.js +80 -0
  46. package/dist/esm/circuit-breaker/CircuitBreaker.js.map +1 -0
  47. package/dist/esm/circuit-breaker/index.js +2 -0
  48. package/dist/esm/circuit-breaker/index.js.map +1 -0
  49. package/dist/esm/core/PushCore.js +303 -0
  50. package/dist/esm/core/PushCore.js.map +1 -0
  51. package/dist/esm/core/index.js +2 -0
  52. package/dist/esm/core/index.js.map +1 -0
  53. package/dist/esm/index.js +9 -0
  54. package/dist/esm/index.js.map +1 -0
  55. package/dist/esm/rate-limiter/TokenBucketRateLimiter.js +39 -0
  56. package/dist/esm/rate-limiter/TokenBucketRateLimiter.js.map +1 -0
  57. package/dist/esm/rate-limiter/index.js +2 -0
  58. package/dist/esm/rate-limiter/index.js.map +1 -0
  59. package/dist/esm/retry/calculateNextRetry.js +19 -0
  60. package/dist/esm/retry/calculateNextRetry.js.map +1 -0
  61. package/dist/esm/retry/index.js +3 -0
  62. package/dist/esm/retry/index.js.map +1 -0
  63. package/dist/esm/retry/shouldRetry.js +16 -0
  64. package/dist/esm/retry/shouldRetry.js.map +1 -0
  65. package/dist/esm/types/adapters.js +2 -0
  66. package/dist/esm/types/adapters.js.map +1 -0
  67. package/dist/esm/types/configuration.js +23 -0
  68. package/dist/esm/types/configuration.js.map +1 -0
  69. package/dist/esm/types/errors.js +45 -0
  70. package/dist/esm/types/errors.js.map +1 -0
  71. package/dist/esm/types/index.js +7 -0
  72. package/dist/esm/types/index.js.map +1 -0
  73. package/dist/esm/types/notification.js +2 -0
  74. package/dist/esm/types/notification.js.map +1 -0
  75. package/dist/esm/types/results.js +2 -0
  76. package/dist/esm/types/results.js.map +1 -0
  77. package/dist/esm/types/subscription.js +2 -0
  78. package/dist/esm/types/subscription.js.map +1 -0
  79. package/dist/esm/vapid/generateVapidKeys.js +31 -0
  80. package/dist/esm/vapid/generateVapidKeys.js.map +1 -0
  81. package/dist/esm/vapid/index.js +3 -0
  82. package/dist/esm/vapid/index.js.map +1 -0
  83. package/dist/esm/vapid/validateVapidKeys.js +41 -0
  84. package/dist/esm/vapid/validateVapidKeys.js.map +1 -0
  85. package/dist/esm/worker/RetryWorker.js +147 -0
  86. package/dist/esm/worker/RetryWorker.js.map +1 -0
  87. package/dist/esm/worker/index.js +2 -0
  88. package/dist/esm/worker/index.js.map +1 -0
  89. package/dist/types/circuit-breaker/CircuitBreaker.d.ts +18 -0
  90. package/dist/types/circuit-breaker/CircuitBreaker.d.ts.map +1 -0
  91. package/dist/types/circuit-breaker/index.d.ts +2 -0
  92. package/dist/types/circuit-breaker/index.d.ts.map +1 -0
  93. package/dist/types/core/PushCore.d.ts +23 -0
  94. package/dist/types/core/PushCore.d.ts.map +1 -0
  95. package/dist/types/core/index.d.ts +2 -0
  96. package/dist/types/core/index.d.ts.map +1 -0
  97. package/dist/types/index.d.ts +9 -0
  98. package/dist/types/index.d.ts.map +1 -0
  99. package/dist/types/rate-limiter/TokenBucketRateLimiter.d.ts +14 -0
  100. package/dist/types/rate-limiter/TokenBucketRateLimiter.d.ts.map +1 -0
  101. package/dist/types/rate-limiter/index.d.ts +2 -0
  102. package/dist/types/rate-limiter/index.d.ts.map +1 -0
  103. package/dist/types/retry/calculateNextRetry.d.ts +3 -0
  104. package/dist/types/retry/calculateNextRetry.d.ts.map +1 -0
  105. package/dist/types/retry/index.d.ts +3 -0
  106. package/dist/types/retry/index.d.ts.map +1 -0
  107. package/dist/types/retry/shouldRetry.d.ts +3 -0
  108. package/dist/types/retry/shouldRetry.d.ts.map +1 -0
  109. package/dist/types/types/adapters.d.ts +32 -0
  110. package/dist/types/types/adapters.d.ts.map +1 -0
  111. package/dist/types/types/configuration.d.ts +53 -0
  112. package/dist/types/types/configuration.d.ts.map +1 -0
  113. package/dist/types/types/errors.d.ts +27 -0
  114. package/dist/types/types/errors.d.ts.map +1 -0
  115. package/dist/types/types/index.d.ts +7 -0
  116. package/dist/types/types/index.d.ts.map +1 -0
  117. package/dist/types/types/notification.d.ts +21 -0
  118. package/dist/types/types/notification.d.ts.map +1 -0
  119. package/dist/types/types/results.d.ts +36 -0
  120. package/dist/types/types/results.d.ts.map +1 -0
  121. package/dist/types/types/subscription.d.ts +31 -0
  122. package/dist/types/types/subscription.d.ts.map +1 -0
  123. package/dist/types/vapid/generateVapidKeys.d.ts +3 -0
  124. package/dist/types/vapid/generateVapidKeys.d.ts.map +1 -0
  125. package/dist/types/vapid/index.d.ts +3 -0
  126. package/dist/types/vapid/index.d.ts.map +1 -0
  127. package/dist/types/vapid/validateVapidKeys.d.ts +3 -0
  128. package/dist/types/vapid/validateVapidKeys.d.ts.map +1 -0
  129. package/dist/types/worker/RetryWorker.d.ts +25 -0
  130. package/dist/types/worker/RetryWorker.d.ts.map +1 -0
  131. package/dist/types/worker/index.d.ts +2 -0
  132. package/dist/types/worker/index.d.ts.map +1 -0
  133. package/package.json +57 -0
@@ -0,0 +1,41 @@
1
+ import { ValidationError } from '../types/errors';
2
+ export function validateVapidKeys(keys) {
3
+ if (!keys.publicKey) {
4
+ throw new ValidationError('VAPID keys validation failed: publicKey is required', {
5
+ providedKeys: Object.keys(keys),
6
+ });
7
+ }
8
+ if (!keys.privateKey) {
9
+ throw new ValidationError('VAPID keys validation failed: privateKey is required', {
10
+ providedKeys: Object.keys(keys),
11
+ });
12
+ }
13
+ if (typeof keys.publicKey !== 'string') {
14
+ throw new ValidationError('VAPID keys validation failed: publicKey must be a string', {
15
+ publicKeyType: typeof keys.publicKey,
16
+ });
17
+ }
18
+ if (typeof keys.privateKey !== 'string') {
19
+ throw new ValidationError('VAPID keys validation failed: privateKey must be a string', {
20
+ privateKeyType: typeof keys.privateKey,
21
+ });
22
+ }
23
+ if (keys.publicKey.trim().length === 0) {
24
+ throw new ValidationError('VAPID keys validation failed: publicKey cannot be empty');
25
+ }
26
+ if (keys.privateKey.trim().length === 0) {
27
+ throw new ValidationError('VAPID keys validation failed: privateKey cannot be empty');
28
+ }
29
+ const base64urlPattern = /^[A-Za-z0-9_-]+$/;
30
+ if (!base64urlPattern.test(keys.publicKey)) {
31
+ throw new ValidationError('VAPID keys validation failed: publicKey is not in valid base64url format', {
32
+ publicKey: keys.publicKey.substring(0, 20) + '...',
33
+ });
34
+ }
35
+ if (!base64urlPattern.test(keys.privateKey)) {
36
+ throw new ValidationError('VAPID keys validation failed: privateKey is not in valid base64url format', {
37
+ privateKey: keys.privateKey.substring(0, 20) + '...',
38
+ });
39
+ }
40
+ }
41
+ //# sourceMappingURL=validateVapidKeys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateVapidKeys.js","sourceRoot":"","sources":["../../../src/vapid/validateVapidKeys.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAelD,MAAM,UAAU,iBAAiB,CAAC,IAAwB;IAExD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACpB,MAAM,IAAI,eAAe,CAAC,qDAAqD,EAAE;YAC/E,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;SAChC,CAAC,CAAC;IACL,CAAC;IAGD,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACrB,MAAM,IAAI,eAAe,CAAC,sDAAsD,EAAE;YAChF,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;SAChC,CAAC,CAAC;IACL,CAAC;IAGD,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,IAAI,eAAe,CAAC,0DAA0D,EAAE;YACpF,aAAa,EAAE,OAAO,IAAI,CAAC,SAAS;SACrC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;QACxC,MAAM,IAAI,eAAe,CAAC,2DAA2D,EAAE;YACrF,cAAc,EAAE,OAAO,IAAI,CAAC,UAAU;SACvC,CAAC,CAAC;IACL,CAAC;IAGD,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,eAAe,CAAC,yDAAyD,CAAC,CAAC;IACvF,CAAC;IAED,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,eAAe,CAAC,0DAA0D,CAAC,CAAC;IACxF,CAAC;IAID,MAAM,gBAAgB,GAAG,kBAAkB,CAAC;IAE5C,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,eAAe,CACvB,0EAA0E,EAC1E;YACE,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK;SACnD,CACF,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,eAAe,CACvB,2EAA2E,EAC3E;YACE,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK;SACrD,CACF,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,147 @@
1
+ import { shouldRetry } from '../retry/shouldRetry';
2
+ import { calculateNextRetry } from '../retry/calculateNextRetry';
3
+ const DEFAULT_WORKER_OPTIONS = {
4
+ pollInterval: 5000,
5
+ concurrency: 10,
6
+ batchSize: 50,
7
+ errorBackoff: 10000,
8
+ };
9
+ export class RetryWorker {
10
+ constructor(storage, provider, retryPolicy, options, metricsAdapter) {
11
+ this.storage = storage;
12
+ this.provider = provider;
13
+ this.retryPolicy = retryPolicy;
14
+ this.metricsAdapter = metricsAdapter;
15
+ this.running = false;
16
+ this.processing = new Set();
17
+ this.options = {
18
+ ...DEFAULT_WORKER_OPTIONS,
19
+ ...options,
20
+ };
21
+ }
22
+ async start() {
23
+ if (this.running) {
24
+ throw new Error('Worker is already running');
25
+ }
26
+ this.running = true;
27
+ this.emitMetric('worker.started');
28
+ while (this.running) {
29
+ try {
30
+ const retries = await this.storage.dequeueRetry(this.options.batchSize);
31
+ if (retries.length > 0) {
32
+ this.emitMetric('worker.dequeued', retries.length);
33
+ await this.processRetriesWithConcurrency(retries);
34
+ }
35
+ if (retries.length === 0 || this.running) {
36
+ await this.sleep(this.options.pollInterval);
37
+ }
38
+ }
39
+ catch (error) {
40
+ console.error('Worker error:', error);
41
+ this.emitMetric('worker.error');
42
+ if (this.running) {
43
+ await this.sleep(this.options.errorBackoff);
44
+ }
45
+ }
46
+ }
47
+ this.emitMetric('worker.stopped');
48
+ }
49
+ async stop() {
50
+ if (!this.running) {
51
+ return;
52
+ }
53
+ this.running = false;
54
+ while (this.processing.size > 0) {
55
+ await this.sleep(100);
56
+ }
57
+ }
58
+ isRunning() {
59
+ return this.running;
60
+ }
61
+ async processRetriesWithConcurrency(retries) {
62
+ const chunks = [];
63
+ for (let i = 0; i < retries.length; i += this.options.concurrency) {
64
+ chunks.push(retries.slice(i, i + this.options.concurrency));
65
+ }
66
+ for (const chunk of chunks) {
67
+ if (!this.running)
68
+ break;
69
+ await Promise.all(chunk.map(retry => this.processRetry(retry)));
70
+ }
71
+ }
72
+ async processRetry(retry) {
73
+ this.processing.add(retry.id);
74
+ try {
75
+ this.emitMetric('worker.retry.processing');
76
+ const subscription = await this.storage.getSubscriptionById(retry.subscriptionId);
77
+ if (!subscription) {
78
+ await this.storage.ackRetry(retry.id);
79
+ this.emitMetric('worker.retry.subscription_not_found');
80
+ return;
81
+ }
82
+ const result = await this.provider.send(subscription, retry.payload, {});
83
+ if (result.success) {
84
+ await this.storage.ackRetry(retry.id);
85
+ await this.storage.updateSubscription(subscription.id, {
86
+ lastUsedAt: new Date(),
87
+ failedCount: 0,
88
+ });
89
+ this.emitMetric('worker.retry.success');
90
+ }
91
+ else {
92
+ const shouldRetryAgain = shouldRetry(result, retry.attempt, this.retryPolicy.maxRetries);
93
+ if (shouldRetryAgain) {
94
+ const nextRetryAt = calculateNextRetry(retry.attempt + 1, this.retryPolicy, result.retryAfter);
95
+ await this.storage.enqueueRetry({
96
+ ...retry,
97
+ attempt: retry.attempt + 1,
98
+ nextRetryAt,
99
+ lastError: result.error?.message,
100
+ });
101
+ await this.storage.ackRetry(retry.id);
102
+ this.emitMetric('worker.retry.re_enqueued');
103
+ }
104
+ else {
105
+ await this.storage.ackRetry(retry.id);
106
+ await this.storage.updateSubscription(subscription.id, {
107
+ status: 'expired',
108
+ failedCount: subscription.failedCount + 1,
109
+ });
110
+ this.emitMetric('worker.retry.max_retries_exceeded');
111
+ }
112
+ }
113
+ }
114
+ catch (error) {
115
+ console.error('Error processing retry:', error);
116
+ this.emitMetric('worker.retry.error');
117
+ try {
118
+ await this.storage.ackRetry(retry.id);
119
+ }
120
+ catch (ackError) {
121
+ console.error('Error acknowledging retry:', ackError);
122
+ }
123
+ }
124
+ finally {
125
+ this.processing.delete(retry.id);
126
+ }
127
+ }
128
+ sleep(ms) {
129
+ return new Promise(resolve => setTimeout(resolve, ms));
130
+ }
131
+ emitMetric(metric, value) {
132
+ if (this.metricsAdapter) {
133
+ try {
134
+ if (value !== undefined) {
135
+ this.metricsAdapter.gauge(metric, value);
136
+ }
137
+ else {
138
+ this.metricsAdapter.increment(metric);
139
+ }
140
+ }
141
+ catch (error) {
142
+ console.error(`Error emitting metric ${metric}:`, error);
143
+ }
144
+ }
145
+ }
146
+ }
147
+ //# sourceMappingURL=RetryWorker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RetryWorker.js","sourceRoot":"","sources":["../../../src/worker/RetryWorker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './RetryWorker';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/worker/index.ts"],"names":[],"mappings":"AAIA,cAAc,eAAe,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { CircuitBreakerConfig } from '../types/configuration';
2
+ export type CircuitBreakerState = 'closed' | 'open' | 'half-open';
3
+ export declare class CircuitBreaker {
4
+ private state;
5
+ private failureCount;
6
+ private successCount;
7
+ private lastFailureTime?;
8
+ private config;
9
+ constructor(config?: Partial<CircuitBreakerConfig>);
10
+ execute<T>(fn: () => Promise<T>): Promise<T>;
11
+ getState(): CircuitBreakerState;
12
+ getFailureCount(): number;
13
+ reset(): void;
14
+ private onSuccess;
15
+ private onFailure;
16
+ private shouldAttemptReset;
17
+ }
18
+ //# sourceMappingURL=CircuitBreaker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CircuitBreaker.d.ts","sourceRoot":"","sources":["../../../src/circuit-breaker/CircuitBreaker.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAKnE,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;AAqBlE,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,eAAe,CAAC,CAAO;IAC/B,OAAO,CAAC,MAAM,CAAuB;gBAEzB,MAAM,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC;IAW5C,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IA4BlD,QAAQ,IAAI,mBAAmB;IAO/B,eAAe,IAAI,MAAM;IAOzB,KAAK,IAAI,IAAI;IAUb,OAAO,CAAC,SAAS;IAoBjB,OAAO,CAAC,SAAS;IAcjB,OAAO,CAAC,kBAAkB;CAQ3B"}
@@ -0,0 +1,2 @@
1
+ export { CircuitBreaker, CircuitBreakerState } from './CircuitBreaker';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/circuit-breaker/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { PushConfiguration } from '../types/configuration';
2
+ import type { Subscription } from '../types/subscription';
3
+ import type { NotificationPayload, SendOptions } from '../types/notification';
4
+ import type { SendResult, BatchResult } from '../types/results';
5
+ export declare class PushCore {
6
+ private config?;
7
+ private circuitBreaker?;
8
+ private isShuttingDown;
9
+ private inFlightOperations;
10
+ configure(options: Partial<PushConfiguration>): void;
11
+ getConfiguration(): PushConfiguration | undefined;
12
+ private validateConfiguration;
13
+ private getProviderAdapter;
14
+ private ensureNotShuttingDown;
15
+ private trackOperation;
16
+ private emitHook;
17
+ private emitMetric;
18
+ verifySubscription(subscription: Subscription): Promise<void>;
19
+ sendNotification(subscription: Subscription, payload: NotificationPayload, options?: SendOptions): Promise<SendResult>;
20
+ batchSend(subscriptions: Subscription[], payload: NotificationPayload, options?: SendOptions): Promise<BatchResult>;
21
+ shutdown(timeout?: number): Promise<void>;
22
+ }
23
+ //# sourceMappingURL=PushCore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PushCore.d.ts","sourceRoot":"","sources":["../../../src/core/PushCore.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,iBAAiB,EAKlB,MAAM,wBAAwB,CAAC;AAIhC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAC9E,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAmChE,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAC,CAAoB;IACnC,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,cAAc,CAAkB;IACxC,OAAO,CAAC,kBAAkB,CAAgC;IAO1D,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,IAAI;IAiCpD,gBAAgB,IAAI,iBAAiB,GAAG,SAAS;IASjD,OAAO,CAAC,qBAAqB;IA8B7B,OAAO,CAAC,kBAAkB;IAmB1B,OAAO,CAAC,qBAAqB;IAY7B,OAAO,CAAC,cAAc;YAcR,QAAQ;IAmBtB,OAAO,CAAC,UAAU;IA2BZ,kBAAkB,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IA4C7D,gBAAgB,CACpB,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,mBAAmB,EAC5B,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,UAAU,CAAC;IAuIhB,SAAS,CACb,aAAa,EAAE,YAAY,EAAE,EAC7B,OAAO,EAAE,mBAAmB,EAC5B,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,WAAW,CAAC;IA8EjB,QAAQ,CAAC,OAAO,GAAE,MAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CA0BvD"}
@@ -0,0 +1,2 @@
1
+ export { PushCore } from './PushCore';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,9 @@
1
+ export * from './types';
2
+ export * from './vapid';
3
+ export * from './core';
4
+ export * from './retry';
5
+ export * from './circuit-breaker';
6
+ export * from './rate-limiter';
7
+ export * from './worker';
8
+ export declare const version = "1.0.0";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAMA,cAAc,SAAS,CAAC;AAGxB,cAAc,SAAS,CAAC;AAGxB,cAAc,QAAQ,CAAC;AAGvB,cAAc,SAAS,CAAC;AAGxB,cAAc,mBAAmB,CAAC;AAGlC,cAAc,gBAAgB,CAAC;AAG/B,cAAc,UAAU,CAAC;AAGzB,eAAO,MAAM,OAAO,UAAU,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { RateLimiter } from '../types/adapters';
2
+ export declare class TokenBucketRateLimiter implements RateLimiter {
3
+ private capacity;
4
+ private refillRate;
5
+ private tokens;
6
+ private lastRefill;
7
+ constructor(capacity: number, refillRate: number);
8
+ acquire(tokens?: number): Promise<void>;
9
+ tryAcquire(tokens?: number): boolean;
10
+ getAvailableTokens(): number;
11
+ private refill;
12
+ private sleep;
13
+ }
14
+ //# sourceMappingURL=TokenBucketRateLimiter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TokenBucketRateLimiter.d.ts","sourceRoot":"","sources":["../../../src/rate-limiter/TokenBucketRateLimiter.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAWrD,qBAAa,sBAAuB,YAAW,WAAW;IAWtD,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,UAAU;IAXpB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAO;gBASf,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM;IAatB,OAAO,CAAC,MAAM,GAAE,MAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBhD,UAAU,CAAC,MAAM,GAAE,MAAU,GAAG,OAAO;IAgBvC,kBAAkB,IAAI,MAAM;IAQ5B,OAAO,CAAC,MAAM;IAiBd,OAAO,CAAC,KAAK;CAGd"}
@@ -0,0 +1,2 @@
1
+ export { TokenBucketRateLimiter } from './TokenBucketRateLimiter';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/rate-limiter/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { RetryPolicy } from '../types/configuration';
2
+ export declare function calculateNextRetry(attempt: number, policy: RetryPolicy, retryAfter?: number): Date;
3
+ //# sourceMappingURL=calculateNextRetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calculateNextRetry.d.ts","sourceRoot":"","sources":["../../../src/retry/calculateNextRetry.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAe1D,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,WAAW,EACnB,UAAU,CAAC,EAAE,MAAM,GAClB,IAAI,CA8BN"}
@@ -0,0 +1,3 @@
1
+ export { calculateNextRetry } from './calculateNextRetry';
2
+ export { shouldRetry } from './shouldRetry';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/retry/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ProviderResult } from '../types/results';
2
+ export declare function shouldRetry(result: ProviderResult, attempt: number, maxRetries: number): boolean;
3
+ //# sourceMappingURL=shouldRetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shouldRetry.d.ts","sourceRoot":"","sources":["../../../src/retry/shouldRetry.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAiBvD,wBAAgB,WAAW,CACzB,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,OAAO,CAuBT"}
@@ -0,0 +1,32 @@
1
+ import { Subscription, CreateSubscriptionData, SubscriptionFilter } from './subscription';
2
+ import { NotificationPayload, SendOptions } from './notification';
3
+ import { ProviderResult, RetryEntry, QueueStats } from './results';
4
+ export interface StorageAdapter {
5
+ createSubscription(data: CreateSubscriptionData): Promise<Subscription>;
6
+ getSubscriptionById(id: string): Promise<Subscription | null>;
7
+ findSubscriptions(filter: SubscriptionFilter): Promise<Subscription[]>;
8
+ updateSubscription(id: string, updates: Partial<Subscription>): Promise<Subscription>;
9
+ deleteSubscription(id: string): Promise<void>;
10
+ enqueueRetry(retry: RetryEntry): Promise<void>;
11
+ dequeueRetry(limit: number): Promise<RetryEntry[]>;
12
+ ackRetry(retryId: string): Promise<void>;
13
+ getQueueStats(): Promise<QueueStats>;
14
+ migrate?(): Promise<void>;
15
+ close(): Promise<void>;
16
+ }
17
+ export interface ProviderAdapter {
18
+ send(subscription: Subscription, payload: NotificationPayload, options: SendOptions): Promise<ProviderResult>;
19
+ getName(): string;
20
+ }
21
+ export interface MetricsAdapter {
22
+ increment(metric: string, tags?: Record<string, string>): void;
23
+ gauge(metric: string, value: number, tags?: Record<string, string>): void;
24
+ timing(metric: string, duration: number, tags?: Record<string, string>): void;
25
+ histogram(metric: string, value: number, tags?: Record<string, string>): void;
26
+ }
27
+ export interface RateLimiter {
28
+ acquire(tokens?: number): Promise<void>;
29
+ tryAcquire(tokens?: number): boolean;
30
+ getAvailableTokens(): number;
31
+ }
32
+ //# sourceMappingURL=adapters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../../../src/types/adapters.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAC1F,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAKnE,MAAM,WAAW,cAAc;IAQ7B,kBAAkB,CAAC,IAAI,EAAE,sBAAsB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAOxE,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAO9D,iBAAiB,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAQvE,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAMtF,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAQ9C,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAO/C,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAMnD,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAMzC,aAAa,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;IAOrC,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAO1B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAKD,MAAM,WAAW,eAAe;IAQ9B,IAAI,CACF,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,mBAAmB,EAC5B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,cAAc,CAAC,CAAC;IAM3B,OAAO,IAAI,MAAM,CAAC;CACnB;AAKD,MAAM,WAAW,cAAc;IAM7B,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAQ/D,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAQ1E,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAQ9E,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;CAC/E;AAKD,MAAM,WAAW,WAAW;IAM1B,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAOxC,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAMrC,kBAAkB,IAAI,MAAM,CAAC;CAC9B"}
@@ -0,0 +1,53 @@
1
+ import { StorageAdapter, ProviderAdapter, MetricsAdapter, RateLimiter } from './adapters';
2
+ import { Subscription } from './subscription';
3
+ import { NotificationPayload } from './notification';
4
+ import { ProviderResult } from './results';
5
+ export interface VapidKeys {
6
+ publicKey: string;
7
+ privateKey: string;
8
+ subject?: string;
9
+ }
10
+ export interface RetryPolicy {
11
+ maxRetries: number;
12
+ baseDelay: number;
13
+ backoffFactor: number;
14
+ maxDelay: number;
15
+ jitter: boolean;
16
+ }
17
+ export interface CircuitBreakerConfig {
18
+ failureThreshold: number;
19
+ resetTimeout: number;
20
+ halfOpenMaxAttempts: number;
21
+ }
22
+ export interface BatchConfig {
23
+ batchSize: number;
24
+ concurrency: number;
25
+ }
26
+ export interface WorkerOptions {
27
+ pollInterval?: number;
28
+ concurrency?: number;
29
+ batchSize?: number;
30
+ errorBackoff?: number;
31
+ }
32
+ export interface LifecycleHooks {
33
+ onSend?: (subscription: Subscription, payload: NotificationPayload) => void | Promise<void>;
34
+ onSuccess?: (subscription: Subscription, result: ProviderResult) => void | Promise<void>;
35
+ onFailure?: (subscription: Subscription, error: Error) => void | Promise<void>;
36
+ onRetry?: (subscription: Subscription, attempt: number) => void | Promise<void>;
37
+ }
38
+ export interface PushConfiguration {
39
+ vapidKeys: VapidKeys;
40
+ storageAdapter: StorageAdapter;
41
+ providerAdapter?: ProviderAdapter;
42
+ retryPolicy?: Partial<RetryPolicy>;
43
+ rateLimiter?: RateLimiter;
44
+ metricsAdapter?: MetricsAdapter;
45
+ circuitBreaker?: Partial<CircuitBreakerConfig>;
46
+ batchConfig?: Partial<BatchConfig>;
47
+ lifecycleHooks?: LifecycleHooks;
48
+ }
49
+ export declare const DEFAULT_RETRY_POLICY: RetryPolicy;
50
+ export declare const DEFAULT_CIRCUIT_BREAKER_CONFIG: CircuitBreakerConfig;
51
+ export declare const DEFAULT_BATCH_CONFIG: BatchConfig;
52
+ export declare const DEFAULT_WORKER_OPTIONS: Required<WorkerOptions>;
53
+ //# sourceMappingURL=configuration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configuration.d.ts","sourceRoot":"","sources":["../../../src/types/configuration.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC1F,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAK3C,MAAM,WAAW,SAAS;IAExB,SAAS,EAAE,MAAM,CAAC;IAElB,UAAU,EAAE,MAAM,CAAC;IAEnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAKD,MAAM,WAAW,WAAW;IAE1B,UAAU,EAAE,MAAM,CAAC;IAEnB,SAAS,EAAE,MAAM,CAAC;IAElB,aAAa,EAAE,MAAM,CAAC;IAEtB,QAAQ,EAAE,MAAM,CAAC;IAEjB,MAAM,EAAE,OAAO,CAAC;CACjB;AAKD,MAAM,WAAW,oBAAoB;IAEnC,gBAAgB,EAAE,MAAM,CAAC;IAEzB,YAAY,EAAE,MAAM,CAAC;IAErB,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAKD,MAAM,WAAW,WAAW;IAE1B,SAAS,EAAE,MAAM,CAAC;IAElB,WAAW,EAAE,MAAM,CAAC;CACrB;AAKD,MAAM,WAAW,aAAa;IAE5B,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAKD,MAAM,WAAW,cAAc;IAM7B,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,mBAAmB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAO5F,SAAS,CAAC,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,cAAc,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAOzF,SAAS,CAAC,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAO/E,OAAO,CAAC,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjF;AAKD,MAAM,WAAW,iBAAiB;IAEhC,SAAS,EAAE,SAAS,CAAC;IAGrB,cAAc,EAAE,cAAc,CAAC;IAG/B,eAAe,CAAC,EAAE,eAAe,CAAC;IAGlC,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAGnC,WAAW,CAAC,EAAE,WAAW,CAAC;IAG1B,cAAc,CAAC,EAAE,cAAc,CAAC;IAGhC,cAAc,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAG/C,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAGnC,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAKD,eAAO,MAAM,oBAAoB,EAAE,WAMlC,CAAC;AAKF,eAAO,MAAM,8BAA8B,EAAE,oBAI5C,CAAC;AAKF,eAAO,MAAM,oBAAoB,EAAE,WAGlC,CAAC;AAKF,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAAC,aAAa,CAK1D,CAAC"}
@@ -0,0 +1,27 @@
1
+ export declare class PushError extends Error {
2
+ readonly code: string;
3
+ readonly details?: Record<string, unknown> | undefined;
4
+ constructor(message: string, code: string, details?: Record<string, unknown> | undefined);
5
+ }
6
+ export declare class ConfigurationError extends PushError {
7
+ constructor(message: string, details?: Record<string, unknown>);
8
+ }
9
+ export declare class ValidationError extends PushError {
10
+ constructor(message: string, details?: Record<string, unknown>);
11
+ }
12
+ export declare class ProviderError extends PushError {
13
+ readonly statusCode?: number | undefined;
14
+ readonly shouldRetry: boolean;
15
+ constructor(message: string, statusCode?: number | undefined, shouldRetry?: boolean, details?: Record<string, unknown>);
16
+ }
17
+ export declare class StorageError extends PushError {
18
+ constructor(message: string, details?: Record<string, unknown>);
19
+ }
20
+ export declare class CircuitBreakerOpenError extends PushError {
21
+ constructor(message?: string, details?: Record<string, unknown>);
22
+ }
23
+ export declare class RateLimitError extends PushError {
24
+ readonly retryAfter?: number | undefined;
25
+ constructor(message: string, retryAfter?: number | undefined, details?: Record<string, unknown>);
26
+ }
27
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/types/errors.ts"],"names":[],"mappings":"AAOA,qBAAa,SAAU,SAAQ,KAAK;aAShB,IAAI,EAAE,MAAM;aACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBAFjD,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAA;CASpD;AAKD,qBAAa,kBAAmB,SAAQ,SAAS;gBAMnC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAG/D;AAKD,qBAAa,eAAgB,SAAQ,SAAS;gBAMhC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAG/D;AAKD,qBAAa,aAAc,SAAQ,SAAS;aAUxB,UAAU,CAAC,EAAE,MAAM;aACnB,WAAW,EAAE,OAAO;gBAFpC,OAAO,EAAE,MAAM,EACC,UAAU,CAAC,EAAE,MAAM,YAAA,EACnB,WAAW,GAAE,OAAe,EAC5C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAIpC;AAKD,qBAAa,YAAa,SAAQ,SAAS;gBAM7B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAG/D;AAKD,qBAAa,uBAAwB,SAAQ,SAAS;gBAMxC,OAAO,GAAE,MAAkC,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAG3F;AAKD,qBAAa,cAAe,SAAQ,SAAS;aASzB,UAAU,CAAC,EAAE,MAAM;gBADnC,OAAO,EAAE,MAAM,EACC,UAAU,CAAC,EAAE,MAAM,YAAA,EACnC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAIpC"}
@@ -0,0 +1,7 @@
1
+ export * from './subscription';
2
+ export * from './notification';
3
+ export * from './adapters';
4
+ export * from './configuration';
5
+ export * from './errors';
6
+ export * from './results';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAIA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC"}
@@ -0,0 +1,21 @@
1
+ export interface NotificationAction {
2
+ action: string;
3
+ title: string;
4
+ icon?: string;
5
+ }
6
+ export interface NotificationPayload {
7
+ title: string;
8
+ body: string;
9
+ icon?: string;
10
+ badge?: string;
11
+ data?: Record<string, unknown>;
12
+ actions?: NotificationAction[];
13
+ tag?: string;
14
+ requireInteraction?: boolean;
15
+ }
16
+ export interface SendOptions {
17
+ ttl?: number;
18
+ urgency?: 'very-low' | 'low' | 'normal' | 'high';
19
+ topic?: string;
20
+ }
21
+ //# sourceMappingURL=notification.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification.d.ts","sourceRoot":"","sources":["../../../src/types/notification.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,kBAAkB;IAEjC,MAAM,EAAE,MAAM,CAAC;IAEf,KAAK,EAAE,MAAM,CAAC;IAEd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAKD,MAAM,WAAW,mBAAmB;IAElC,KAAK,EAAE,MAAM,CAAC;IAEd,IAAI,EAAE,MAAM,CAAC;IAEb,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE/B,OAAO,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAE/B,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAKD,MAAM,WAAW,WAAW;IAE1B,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb,OAAO,CAAC,EAAE,UAAU,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAEjD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
@@ -0,0 +1,36 @@
1
+ import { NotificationPayload } from './notification';
2
+ export interface ProviderResult {
3
+ success: boolean;
4
+ statusCode?: number;
5
+ error?: Error;
6
+ shouldRetry: boolean;
7
+ retryAfter?: number;
8
+ }
9
+ export interface SendResult {
10
+ success: boolean;
11
+ subscriptionId: string;
12
+ error?: Error;
13
+ enqueued?: boolean;
14
+ }
15
+ export interface BatchResult {
16
+ total: number;
17
+ success: number;
18
+ failed: number;
19
+ retried: number;
20
+ results: SendResult[];
21
+ }
22
+ export interface RetryEntry {
23
+ id: string;
24
+ subscriptionId: string;
25
+ payload: NotificationPayload;
26
+ attempt: number;
27
+ nextRetryAt: Date;
28
+ lastError?: string;
29
+ createdAt: Date;
30
+ }
31
+ export interface QueueStats {
32
+ pending: number;
33
+ processing: number;
34
+ failed: number;
35
+ }
36
+ //# sourceMappingURL=results.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"results.d.ts","sourceRoot":"","sources":["../../../src/types/results.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAKrD,MAAM,WAAW,cAAc;IAE7B,OAAO,EAAE,OAAO,CAAC;IAEjB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,KAAK,CAAC,EAAE,KAAK,CAAC;IAEd,WAAW,EAAE,OAAO,CAAC;IAErB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAKD,MAAM,WAAW,UAAU;IAEzB,OAAO,EAAE,OAAO,CAAC;IAEjB,cAAc,EAAE,MAAM,CAAC;IAEvB,KAAK,CAAC,EAAE,KAAK,CAAC;IAEd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAKD,MAAM,WAAW,WAAW;IAE1B,KAAK,EAAE,MAAM,CAAC;IAEd,OAAO,EAAE,MAAM,CAAC;IAEhB,MAAM,EAAE,MAAM,CAAC;IAEf,OAAO,EAAE,MAAM,CAAC;IAEhB,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAKD,MAAM,WAAW,UAAU;IAEzB,EAAE,EAAE,MAAM,CAAC;IAEX,cAAc,EAAE,MAAM,CAAC;IAEvB,OAAO,EAAE,mBAAmB,CAAC;IAE7B,OAAO,EAAE,MAAM,CAAC;IAEhB,WAAW,EAAE,IAAI,CAAC;IAElB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,SAAS,EAAE,IAAI,CAAC;CACjB;AAKD,MAAM,WAAW,UAAU;IAEzB,OAAO,EAAE,MAAM,CAAC;IAEhB,UAAU,EAAE,MAAM,CAAC;IAEnB,MAAM,EAAE,MAAM,CAAC;CAChB"}
@@ -0,0 +1,31 @@
1
+ export type SubscriptionStatus = 'active' | 'blocked' | 'expired';
2
+ export interface SubscriptionKeys {
3
+ p256dh: string;
4
+ auth: string;
5
+ }
6
+ export interface Subscription {
7
+ id: string;
8
+ endpoint: string;
9
+ keys: SubscriptionKeys;
10
+ userId?: string;
11
+ createdAt: Date;
12
+ updatedAt: Date;
13
+ lastUsedAt?: Date;
14
+ failedCount: number;
15
+ status: SubscriptionStatus;
16
+ expiresAt?: Date;
17
+ metadata?: Record<string, unknown>;
18
+ }
19
+ export interface CreateSubscriptionData {
20
+ endpoint: string;
21
+ keys: SubscriptionKeys;
22
+ userId?: string;
23
+ expiresAt?: Date;
24
+ metadata?: Record<string, unknown>;
25
+ }
26
+ export interface SubscriptionFilter {
27
+ userId?: string;
28
+ status?: SubscriptionStatus;
29
+ ids?: string[];
30
+ }
31
+ //# sourceMappingURL=subscription.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscription.d.ts","sourceRoot":"","sources":["../../../src/types/subscription.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;AAKlE,MAAM,WAAW,gBAAgB;IAE/B,MAAM,EAAE,MAAM,CAAC;IAEf,IAAI,EAAE,MAAM,CAAC;CACd;AAKD,MAAM,WAAW,YAAY;IAE3B,EAAE,EAAE,MAAM,CAAC;IAEX,QAAQ,EAAE,MAAM,CAAC;IAEjB,IAAI,EAAE,gBAAgB,CAAC;IAEvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,SAAS,EAAE,IAAI,CAAC;IAEhB,SAAS,EAAE,IAAI,CAAC;IAEhB,UAAU,CAAC,EAAE,IAAI,CAAC;IAElB,WAAW,EAAE,MAAM,CAAC;IAEpB,MAAM,EAAE,kBAAkB,CAAC;IAE3B,SAAS,CAAC,EAAE,IAAI,CAAC;IAEjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAKD,MAAM,WAAW,sBAAsB;IAErC,QAAQ,EAAE,MAAM,CAAC;IAEjB,IAAI,EAAE,gBAAgB,CAAC;IAEvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,SAAS,CAAC,EAAE,IAAI,CAAC;IAEjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAKD,MAAM,WAAW,kBAAkB;IAEjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAE5B,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;CAChB"}
@@ -0,0 +1,3 @@
1
+ import { VapidKeys } from '../types/configuration';
2
+ export declare function generateVapidKeys(): VapidKeys;
3
+ //# sourceMappingURL=generateVapidKeys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateVapidKeys.d.ts","sourceRoot":"","sources":["../../../src/vapid/generateVapidKeys.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAwBnD,wBAAgB,iBAAiB,IAAI,SAAS,CAqC7C"}
@@ -0,0 +1,3 @@
1
+ export * from './generateVapidKeys';
2
+ export * from './validateVapidKeys';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/vapid/index.ts"],"names":[],"mappings":"AAIA,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { VapidKeys } from '../types/configuration';
2
+ export declare function validateVapidKeys(keys: Partial<VapidKeys>): void;
3
+ //# sourceMappingURL=validateVapidKeys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateVapidKeys.d.ts","sourceRoot":"","sources":["../../../src/vapid/validateVapidKeys.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAgBnD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI,CA0DhE"}