@doow/track 0.1.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.
@@ -0,0 +1,290 @@
1
+ import { generateUUID } from './uuid.js';
2
+ import { createDebugLogger } from './debug.js';
3
+ import { Exporter } from './exporter.js';
4
+ import { EventProcessor } from './event-processor.js';
5
+
6
+ /**
7
+ * S76: DoowTracker — public API surface
8
+ *
9
+ * The customer-facing class. Four lines to start emitting:
10
+ *
11
+ * import { DoowTracker } from '@doow/track';
12
+ * const meter = new DoowTracker('dk_...');
13
+ * meter.track({ metric: 'api_calls', quantity: 1, license_id: '...' });
14
+ * await meter.shutdown();
15
+ */
16
+ // ─── Defaults ──────────────────────────────────────────────────────────────
17
+ const DEFAULTS = {
18
+ endpoint: 'https://api.doow.co',
19
+ enabled: true,
20
+ debug: false,
21
+ flushAt: 20,
22
+ flushInterval: 10000,
23
+ maxPayloadBytes: 450 * 1024,
24
+ maxQueueSize: 10000,
25
+ timeout: 10000,
26
+ retryCount: 3,
27
+ disableCompression: false,
28
+ maxConcurrentFlushes: 30,
29
+ shutdownTimeout: 5000,
30
+ };
31
+ // ─── Env var parsing ───────────────────────────────────────────────────────
32
+ function resolveEnvOverrides(opts) {
33
+ const env = typeof process !== 'undefined' ? process.env : undefined;
34
+ // Spread opts without creating explicit undefined keys that would override DEFAULTS
35
+ const result = { ...opts };
36
+ if (env === null || env === void 0 ? void 0 : env.DOOW_TRACK_ENDPOINT)
37
+ result.endpoint = env.DOOW_TRACK_ENDPOINT;
38
+ if ((env === null || env === void 0 ? void 0 : env.DOOW_TRACK_DISABLED) === 'true')
39
+ result.enabled = false;
40
+ if ((env === null || env === void 0 ? void 0 : env.DOOW_TRACK_DEBUG) === 'true')
41
+ result.debug = true;
42
+ if ((env === null || env === void 0 ? void 0 : env.DOOW_TRACK_FLUSH_AT) !== undefined) {
43
+ const n = parseInt(env.DOOW_TRACK_FLUSH_AT, 10);
44
+ if (!isNaN(n) && n > 0)
45
+ result.flushAt = n;
46
+ }
47
+ if ((env === null || env === void 0 ? void 0 : env.DOOW_TRACK_FLUSH_INTERVAL) !== undefined) {
48
+ const n = parseInt(env.DOOW_TRACK_FLUSH_INTERVAL, 10);
49
+ if (!isNaN(n) && n > 0)
50
+ result.flushInterval = n;
51
+ }
52
+ if ((env === null || env === void 0 ? void 0 : env.DOOW_TRACK_ATTRIBUTION) !== undefined) {
53
+ try {
54
+ result.attribution = JSON.parse(env.DOOW_TRACK_ATTRIBUTION);
55
+ }
56
+ catch {
57
+ /* keep opts.attribution */
58
+ }
59
+ }
60
+ return result;
61
+ }
62
+ // ─── DoowTracker ───────────────────────────────────────────────────────────
63
+ class DoowTracker {
64
+ constructor(apiKey, options = {}) {
65
+ var _a, _b, _c;
66
+ this._shutdownCalled = false;
67
+ this._sigHandlers = null;
68
+ // Validate API key prefix
69
+ const envApiKey = typeof process !== 'undefined' ? ((_a = process.env['DOOW_TRACK_API_KEY']) !== null && _a !== void 0 ? _a : apiKey) : apiKey;
70
+ if (!envApiKey.startsWith('dk_')) {
71
+ console.warn(`[doow/track] API key must start with "dk_". Got: "${envApiKey.slice(0, 10)}..."`);
72
+ }
73
+ this._apiKey = envApiKey;
74
+ // Merge options with env var overrides (env takes precedence)
75
+ const merged = resolveEnvOverrides(options);
76
+ // Log unknown options in debug mode
77
+ const knownKeys = new Set([
78
+ 'endpoint',
79
+ 'enabled',
80
+ 'attribution',
81
+ 'debug',
82
+ 'flushAt',
83
+ 'flushInterval',
84
+ 'maxPayloadBytes',
85
+ 'maxQueueSize',
86
+ 'timeout',
87
+ 'retryCount',
88
+ 'disableCompression',
89
+ 'onError',
90
+ 'beforeSend',
91
+ 'beforeFlush',
92
+ 'transport',
93
+ 'offlineStore',
94
+ 'maxConcurrentFlushes',
95
+ 'shutdownTimeout',
96
+ ]);
97
+ this._options = {
98
+ ...DEFAULTS,
99
+ ...merged,
100
+ };
101
+ const unknownKeys = Object.keys(options).filter((k) => !knownKeys.has(k));
102
+ const debugLogger = createDebugLogger((_b = this._options.debug) !== null && _b !== void 0 ? _b : false);
103
+ if (unknownKeys.length > 0) {
104
+ debugLogger.warn(`Unknown init options ignored: ${unknownKeys.join(', ')}`);
105
+ }
106
+ // If disabled — complete no-op, no buffers allocated
107
+ if (!this._options.enabled) {
108
+ debugLogger.log('SDK disabled — all operations are no-ops');
109
+ this._processor = null;
110
+ this._exporter = null;
111
+ return;
112
+ }
113
+ const onError = (_c = this._options.onError) !== null && _c !== void 0 ? _c : ((e) => console.warn(`[doow/track] ${e.kind}: ${e.message}`));
114
+ const exporterConfig = {
115
+ endpoint: this._options.endpoint,
116
+ apiKey: this._apiKey,
117
+ timeout: this._options.timeout,
118
+ retryCount: this._options.retryCount,
119
+ disableCompression: this._options.disableCompression,
120
+ maxConcurrentFlushes: this._options.maxConcurrentFlushes,
121
+ onError,
122
+ debug: debugLogger,
123
+ };
124
+ if (this._options.transport)
125
+ exporterConfig.transport = this._options.transport;
126
+ if (this._options.offlineStore)
127
+ exporterConfig.offlineStore = this._options.offlineStore;
128
+ this._exporter = new Exporter(exporterConfig);
129
+ const processorConfig = {
130
+ flushAt: this._options.flushAt,
131
+ flushInterval: this._options.flushInterval,
132
+ maxPayloadBytes: this._options.maxPayloadBytes,
133
+ maxQueueSize: this._options.maxQueueSize,
134
+ debug: debugLogger,
135
+ };
136
+ if (this._options.beforeSend)
137
+ processorConfig.beforeSend = this._options.beforeSend;
138
+ if (this._options.beforeFlush)
139
+ processorConfig.beforeFlush = this._options.beforeFlush;
140
+ this._processor = new EventProcessor(processorConfig, this._exporter);
141
+ if (typeof process !== 'undefined') {
142
+ const sigterm = () => {
143
+ void this.shutdown();
144
+ };
145
+ const beforeExit = () => {
146
+ void this.shutdown();
147
+ };
148
+ process.setMaxListeners(process.getMaxListeners() + 2);
149
+ process.on('SIGTERM', sigterm);
150
+ process.on('beforeExit', beforeExit);
151
+ this._sigHandlers = { sigterm, beforeExit };
152
+ }
153
+ }
154
+ /**
155
+ * Track a usage event.
156
+ * - Generates UUID v4 event_id at call time
157
+ * - Merges SDK-level attribution defaults
158
+ * - Enqueues to EventProcessor
159
+ * - No-op if SDK is disabled or stopped
160
+ */
161
+ track(event) {
162
+ var _a, _b, _c, _d;
163
+ if (!this._processor || !this._exporter)
164
+ return; // disabled
165
+ if (this._exporter.stopped)
166
+ return; // auth failure
167
+ if (this._shutdownCalled)
168
+ return;
169
+ const serialized = {
170
+ ...event,
171
+ event_id: generateUUID(),
172
+ timestamp: (_a = event.timestamp) !== null && _a !== void 0 ? _a : new Date().toISOString(),
173
+ attribution: {
174
+ ...((_b = this._options.attribution) !== null && _b !== void 0 ? _b : {}),
175
+ ...((_c = event.attribution) !== null && _c !== void 0 ? _c : {}),
176
+ },
177
+ kind: (_d = event.kind) !== null && _d !== void 0 ? _d : 'USAGE',
178
+ };
179
+ // Fire-and-forget enqueue — errors surface via onError
180
+ void this._processor.enqueue(serialized);
181
+ }
182
+ /**
183
+ * Manually flush the current buffer.
184
+ * Returns a Promise that resolves when the flush completes.
185
+ */
186
+ async flush() {
187
+ if (!this._processor)
188
+ return;
189
+ await this._processor.flush();
190
+ }
191
+ /**
192
+ * Drain all pending events and shut down.
193
+ * Registers SIGTERM + beforeExit handlers automatically.
194
+ * Best-effort — hard kill loses buffered events.
195
+ */
196
+ async shutdown(timeout) {
197
+ if (this._shutdownCalled)
198
+ return;
199
+ this._shutdownCalled = true;
200
+ // Remove signal handlers
201
+ if (this._sigHandlers && typeof process !== 'undefined') {
202
+ process.removeListener('SIGTERM', this._sigHandlers.sigterm);
203
+ process.removeListener('beforeExit', this._sigHandlers.beforeExit);
204
+ process.setMaxListeners(Math.max(0, process.getMaxListeners() - 2));
205
+ this._sigHandlers = null;
206
+ }
207
+ if (!this._processor)
208
+ return;
209
+ const timeoutMs = timeout !== null && timeout !== void 0 ? timeout : this._options.shutdownTimeout;
210
+ const shutdownPromise = this._processor.shutdown();
211
+ const timeoutPromise = new Promise((resolve) => setTimeout(resolve, timeoutMs));
212
+ await Promise.race([shutdownPromise, timeoutPromise]);
213
+ }
214
+ /** True if the SDK is enabled */
215
+ get enabled() {
216
+ return !!this._processor;
217
+ }
218
+ /** True if auth has failed and SDK stopped emitting */
219
+ get stopped() {
220
+ var _a, _b;
221
+ return (_b = (_a = this._exporter) === null || _a === void 0 ? void 0 : _a.stopped) !== null && _b !== void 0 ? _b : false;
222
+ }
223
+ /** S79: True if a per-category rate limit is currently active */
224
+ get rateLimited() {
225
+ var _a, _b;
226
+ return (_b = (_a = this._exporter) === null || _a === void 0 ? void 0 : _a.rateLimited) !== null && _b !== void 0 ? _b : false;
227
+ }
228
+ // ─── S81: Serverless wrappers ─────────────────────────────────────────────
229
+ /**
230
+ * Wrap an AWS Lambda handler.
231
+ * Sets flushAt=1 internally, calls shutdown() in a finally block.
232
+ *
233
+ * @example
234
+ * export const handler = meter.withLambda(async (event, context) => {
235
+ * meter.track({ ... });
236
+ * return { statusCode: 200 };
237
+ * });
238
+ */
239
+ withLambda(handler) {
240
+ // Override flushAt to 1 so every track() flushes immediately
241
+ if (this._processor) {
242
+ this._processor.setFlushAt(1);
243
+ }
244
+ return async (event, context) => {
245
+ try {
246
+ return await handler(event, context);
247
+ }
248
+ finally {
249
+ await this.flush();
250
+ }
251
+ };
252
+ }
253
+ /**
254
+ * Wrap a Vercel serverless function handler.
255
+ * Sets flushAt=1 internally, calls flush() in a finally block.
256
+ */
257
+ withVercel(handler) {
258
+ if (this._processor) {
259
+ this._processor.setFlushAt(1);
260
+ }
261
+ return async (req, res) => {
262
+ try {
263
+ await handler(req, res);
264
+ }
265
+ finally {
266
+ await this.flush();
267
+ }
268
+ };
269
+ }
270
+ /**
271
+ * Wrap an Azure Function handler.
272
+ * Sets flushAt=1 internally, calls flush() in a finally block.
273
+ */
274
+ withAzureFunction(handler) {
275
+ if (this._processor) {
276
+ this._processor.setFlushAt(1);
277
+ }
278
+ return async (context, input) => {
279
+ try {
280
+ return await handler(context, input);
281
+ }
282
+ finally {
283
+ await this.flush();
284
+ }
285
+ };
286
+ }
287
+ }
288
+
289
+ export { DoowTracker };
290
+ //# sourceMappingURL=tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracker.js","sources":["../../../src/tracker.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { randomUUID } from 'crypto';
2
+
3
+ /**
4
+ * UUID v4 generation — stdlib only, no dependencies.
5
+ */
6
+ function generateUUID() {
7
+ return randomUUID();
8
+ }
9
+
10
+ export { generateUUID };
11
+ //# sourceMappingURL=uuid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uuid.js","sources":["../../../src/uuid.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAAA;;AAEG;SAGa,YAAY,GAAA;IAC1B,OAAO,UAAU,EAAE;AACrB;;;;"}