@pristine-ts/common 3.0.1 → 3.0.2
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/lib/cjs/managers/event-context.als.browser.js +28 -0
- package/dist/lib/cjs/managers/event-context.als.browser.js.map +1 -0
- package/dist/lib/cjs/managers/event-context.als.js +12 -0
- package/dist/lib/cjs/managers/event-context.als.js.map +1 -0
- package/dist/lib/cjs/managers/event-context.manager.js +12 -16
- package/dist/lib/cjs/managers/event-context.manager.js.map +1 -1
- package/dist/lib/cjs/models/span.model.js +2 -2
- package/dist/lib/cjs/models/span.model.js.map +1 -1
- package/dist/lib/cjs/models/trace.model.js +2 -2
- package/dist/lib/cjs/models/trace.model.js.map +1 -1
- package/dist/lib/cjs/utils/utils.js +1 -0
- package/dist/lib/cjs/utils/utils.js.map +1 -1
- package/dist/lib/cjs/utils/uuid.util.js +46 -0
- package/dist/lib/cjs/utils/uuid.util.js.map +1 -0
- package/dist/lib/esm/managers/event-context.als.browser.js +25 -0
- package/dist/lib/esm/managers/event-context.als.browser.js.map +1 -0
- package/dist/lib/esm/managers/event-context.als.js +9 -0
- package/dist/lib/esm/managers/event-context.als.js.map +1 -0
- package/dist/lib/esm/managers/event-context.manager.js +12 -16
- package/dist/lib/esm/managers/event-context.manager.js.map +1 -1
- package/dist/lib/esm/models/span.model.js +2 -2
- package/dist/lib/esm/models/span.model.js.map +1 -1
- package/dist/lib/esm/models/trace.model.js +2 -2
- package/dist/lib/esm/models/trace.model.js.map +1 -1
- package/dist/lib/esm/utils/utils.js +1 -0
- package/dist/lib/esm/utils/utils.js.map +1 -1
- package/dist/lib/esm/utils/uuid.util.js +42 -0
- package/dist/lib/esm/utils/uuid.util.js.map +1 -0
- package/dist/lib/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/lib/tsconfig.tsbuildinfo +1 -1
- package/dist/types/managers/event-context.als.browser.d.ts +2 -0
- package/dist/types/managers/event-context.als.d.ts +19 -0
- package/dist/types/managers/event-context.manager.d.ts +5 -7
- package/dist/types/utils/utils.d.ts +1 -0
- package/dist/types/utils/uuid.util.d.ts +15 -0
- package/package.json +6 -2
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.eventContextStorage = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Browser substitute for the Node `AsyncLocalStorage`-backed {@link EventContextStorage}.
|
|
6
|
+
* Browsers have no `async_hooks`, so this keeps the active `EventContext` in a single
|
|
7
|
+
* synchronous slot: it correctly scopes — and restores — the context for the synchronous
|
|
8
|
+
* portion of `run()` (including nested `run()` calls), but, unlike Node's
|
|
9
|
+
* `AsyncLocalStorage`, it cannot propagate across `await` boundaries, which no browser API
|
|
10
|
+
* supports.
|
|
11
|
+
*/
|
|
12
|
+
class SynchronousEventContextStorage {
|
|
13
|
+
run(store, callback) {
|
|
14
|
+
const previous = this.store;
|
|
15
|
+
this.store = store;
|
|
16
|
+
try {
|
|
17
|
+
return callback();
|
|
18
|
+
}
|
|
19
|
+
finally {
|
|
20
|
+
this.store = previous;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
getStore() {
|
|
24
|
+
return this.store;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.eventContextStorage = new SynchronousEventContextStorage();
|
|
28
|
+
//# sourceMappingURL=event-context.als.browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-context.als.browser.js","sourceRoot":"","sources":["../../../../src/managers/event-context.als.browser.ts"],"names":[],"mappings":";;;AAGA;;;;;;;GAOG;AACH,MAAM,8BAA8B;IAGlC,GAAG,CAAI,KAAmB,EAAE,QAAiB;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC;QAC5B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC;YACH,OAAO,QAAQ,EAAE,CAAC;QACpB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;QACxB,CAAC;IACH,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF;AAEY,QAAA,mBAAmB,GAAwB,IAAI,8BAA8B,EAAE,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.eventContextStorage = void 0;
|
|
4
|
+
const async_hooks_1 = require("async_hooks");
|
|
5
|
+
/**
|
|
6
|
+
* Process-wide storage backing the active `EventContext`. A single instance is essential —
|
|
7
|
+
* multiple `AsyncLocalStorage` instances would each track their own propagation chain and
|
|
8
|
+
* contexts wouldn't be visible across them. On Node this propagates the context across
|
|
9
|
+
* `await` boundaries, `Promise.all`, `setImmediate`, and the rest of the async machinery.
|
|
10
|
+
*/
|
|
11
|
+
exports.eventContextStorage = new async_hooks_1.AsyncLocalStorage();
|
|
12
|
+
//# sourceMappingURL=event-context.als.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-context.als.js","sourceRoot":"","sources":["../../../../src/managers/event-context.als.ts"],"names":[],"mappings":";;;AAAA,6CAA8C;AAe9C;;;;;GAKG;AACU,QAAA,mBAAmB,GAAwB,IAAI,+BAAiB,EAAgB,CAAC"}
|
|
@@ -8,8 +8,8 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
8
8
|
var EventContextManager_1;
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
10
|
exports.EventContextManager = void 0;
|
|
11
|
-
const async_hooks_1 = require("async_hooks");
|
|
12
11
|
const tsyringe_1 = require("tsyringe");
|
|
12
|
+
const event_context_als_1 = require("./event-context.als");
|
|
13
13
|
/**
|
|
14
14
|
* Owns the `AsyncLocalStorage` instance that propagates the active `EventContext`
|
|
15
15
|
* across `await` boundaries, `Promise.all`, `setImmediate`, and the rest of Node's
|
|
@@ -25,21 +25,20 @@ const tsyringe_1 = require("tsyringe");
|
|
|
25
25
|
* Captures the current context and returns a wrapped function that restores it
|
|
26
26
|
* on call.
|
|
27
27
|
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
* shared and consistent.
|
|
28
|
+
* The backing storage lives in `./event-context.als` (a single process-wide
|
|
29
|
+
* `AsyncLocalStorage`) rather than being constructed here, so a browser build can swap it
|
|
30
|
+
* for a synchronous shim — `async_hooks` is Node-only. Keeping the storage shared while the
|
|
31
|
+
* class stays `@injectable()` lets DI consumers resolve the manager normally (and substitute
|
|
32
|
+
* fakes in tests) while the underlying state stays shared and consistent.
|
|
34
33
|
*/
|
|
35
34
|
let EventContextManager = EventContextManager_1 = class EventContextManager {
|
|
36
35
|
run(ctx, fn) {
|
|
37
|
-
return
|
|
36
|
+
return event_context_als_1.eventContextStorage.run(ctx, fn);
|
|
38
37
|
}
|
|
39
38
|
/** Returns the active `EventContext`, or `undefined` if no context is installed
|
|
40
39
|
* (i.e. we're outside any `run()` call). */
|
|
41
40
|
current() {
|
|
42
|
-
return
|
|
41
|
+
return event_context_als_1.eventContextStorage.getStore();
|
|
43
42
|
}
|
|
44
43
|
/** Convenience: the `eventId` of the active context, or `undefined`. */
|
|
45
44
|
eventId() {
|
|
@@ -74,15 +73,14 @@ let EventContextManager = EventContextManager_1 = class EventContextManager {
|
|
|
74
73
|
const ctx = this.current();
|
|
75
74
|
if (ctx === undefined)
|
|
76
75
|
return fn;
|
|
77
|
-
|
|
78
|
-
return ((...args) => als.run(ctx, () => fn(...args)));
|
|
76
|
+
return ((...args) => event_context_als_1.eventContextStorage.run(ctx, () => fn(...args)));
|
|
79
77
|
}
|
|
80
78
|
// ── Static convenience mirrors. ────────────────────────────────────────────────
|
|
81
79
|
// For callers that don't want DI noise (e.g. utility code, decorators, helpers
|
|
82
80
|
// that don't have a constructor to inject through). All forwarding to the same
|
|
83
|
-
// shared
|
|
81
|
+
// shared storage instance.
|
|
84
82
|
static current() {
|
|
85
|
-
return
|
|
83
|
+
return event_context_als_1.eventContextStorage.getStore();
|
|
86
84
|
}
|
|
87
85
|
static eventId() {
|
|
88
86
|
var _a;
|
|
@@ -104,12 +102,10 @@ let EventContextManager = EventContextManager_1 = class EventContextManager {
|
|
|
104
102
|
const ctx = EventContextManager_1.current();
|
|
105
103
|
if (ctx === undefined)
|
|
106
104
|
return fn;
|
|
107
|
-
|
|
108
|
-
return ((...args) => als.run(ctx, () => fn(...args)));
|
|
105
|
+
return ((...args) => event_context_als_1.eventContextStorage.run(ctx, () => fn(...args)));
|
|
109
106
|
}
|
|
110
107
|
};
|
|
111
108
|
exports.EventContextManager = EventContextManager;
|
|
112
|
-
EventContextManager.als = new async_hooks_1.AsyncLocalStorage();
|
|
113
109
|
exports.EventContextManager = EventContextManager = EventContextManager_1 = __decorate([
|
|
114
110
|
(0, tsyringe_1.injectable)()
|
|
115
111
|
], EventContextManager);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-context.manager.js","sourceRoot":"","sources":["../../../../src/managers/event-context.manager.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"event-context.manager.js","sourceRoot":"","sources":["../../../../src/managers/event-context.manager.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,uCAAyD;AAGzD,2DAAwD;AAExD;;;;;;;;;;;;;;;;;;;;GAoBG;AAEI,IAAM,mBAAmB,2BAAzB,MAAM,mBAAmB;IAQ9B,GAAG,CAAI,GAAiB,EAAE,EAAwB;QAChD,OAAO,uCAAmB,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED;iDAC6C;IAC7C,OAAO;QACL,OAAO,uCAAmB,CAAC,QAAQ,EAAE,CAAC;IACxC,CAAC;IAED,wEAAwE;IACxE,OAAO;;QACL,OAAO,MAAA,IAAI,CAAC,OAAO,EAAE,0CAAE,OAAO,CAAC;IACjC,CAAC;IAED,wEAAwE;IACxE,OAAO;;QACL,OAAO,MAAA,IAAI,CAAC,OAAO,EAAE,0CAAE,OAAO,CAAC;IACjC,CAAC;IAED,qEAAqE;IACrE,SAAS;;QACP,OAAO,MAAA,IAAI,CAAC,OAAO,EAAE,0CAAE,SAAS,CAAC;IACnC,CAAC;IAED,sFAAsF;IACtF,cAAc;;QACZ,OAAO,MAAA,IAAI,CAAC,OAAO,EAAE,0CAAE,cAAc,CAAC;IACxC,CAAC;IAED;;;;;;;;OAQG;IACH,IAAI,CAAoC,EAAK;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC3B,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO,EAAE,CAAC;QACjC,OAAO,CAAC,CAAC,GAAG,IAAW,EAAE,EAAE,CAAC,uCAAmB,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAM,CAAC;IACpF,CAAC;IAED,kFAAkF;IAClF,+EAA+E;IAC/E,+EAA+E;IAC/E,2BAA2B;IAE3B,MAAM,CAAC,OAAO;QACZ,OAAO,uCAAmB,CAAC,QAAQ,EAAE,CAAC;IACxC,CAAC;IAED,MAAM,CAAC,OAAO;;QACZ,OAAO,MAAA,qBAAmB,CAAC,OAAO,EAAE,0CAAE,OAAO,CAAC;IAChD,CAAC;IAED,MAAM,CAAC,OAAO;;QACZ,OAAO,MAAA,qBAAmB,CAAC,OAAO,EAAE,0CAAE,OAAO,CAAC;IAChD,CAAC;IAED,MAAM,CAAC,SAAS;;QACd,OAAO,MAAA,qBAAmB,CAAC,OAAO,EAAE,0CAAE,SAAS,CAAC;IAClD,CAAC;IAED,MAAM,CAAC,cAAc;;QACnB,OAAO,MAAA,qBAAmB,CAAC,OAAO,EAAE,0CAAE,cAAc,CAAC;IACvD,CAAC;IAED,MAAM,CAAC,IAAI,CAAoC,EAAK;QAClD,MAAM,GAAG,GAAG,qBAAmB,CAAC,OAAO,EAAE,CAAC;QAC1C,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO,EAAE,CAAC;QACjC,OAAO,CAAC,CAAC,GAAG,IAAW,EAAE,EAAE,CAAC,uCAAmB,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAM,CAAC;IACpF,CAAC;CACF,CAAA;AAnFY,kDAAmB;8BAAnB,mBAAmB;IAD/B,IAAA,qBAAU,GAAE;GACA,mBAAmB,CAmF/B"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Span = void 0;
|
|
4
|
-
const
|
|
4
|
+
const uuid_util_1 = require("../utils/uuid.util");
|
|
5
5
|
/**
|
|
6
6
|
* This model represents a span.
|
|
7
7
|
*/
|
|
@@ -40,7 +40,7 @@ class Span {
|
|
|
40
40
|
* Whether or not the span is in progress, meaning it has not ended.
|
|
41
41
|
*/
|
|
42
42
|
this.inProgress = true;
|
|
43
|
-
this.id = id !== null && id !== void 0 ? id :
|
|
43
|
+
this.id = id !== null && id !== void 0 ? id : uuid_util_1.UuidGenerator.generate();
|
|
44
44
|
this.context = context !== null && context !== void 0 ? context : {};
|
|
45
45
|
}
|
|
46
46
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"span.model.js","sourceRoot":"","sources":["../../../../src/models/span.model.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"span.model.js","sourceRoot":"","sources":["../../../../src/models/span.model.ts"],"names":[],"mappings":";;;AAAA,kDAAiD;AAKjD;;GAEG;AACH,MAAa,IAAI;IA0Df;;;;;OAKG;IACH,YAA0B,OAAe,EAAE,EAAW,EAAE,OAAmC;QAAjE,YAAO,GAAP,OAAO,CAAQ;QA/CzC;;WAEG;QACI,cAAS,GAAW,IAAI,CAAC,GAAG,EAAE,CAAC;QAYtC;;WAEG;QACI,aAAQ,GAAW,EAAE,CAAC;QAE7B;;;;;;;;WAQG;QACI,YAAO,GAAiB,EAAE,CAAC;QAElC;;WAEG;QACI,YAAO,GAA8B,EAAE,CAAC;QAE/C;;WAEG;QACI,eAAU,GAAG,IAAI,CAAC;QASvB,IAAI,CAAC,EAAE,GAAG,EAAE,aAAF,EAAE,cAAF,EAAE,GAAI,yBAAa,CAAC,QAAQ,EAAE,CAAC;QACzC,IAAI,CAAC,OAAO,GAAG,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,EAAE,CAAC;IAC/B,CAAC;IAED;;OAEG;IACI,WAAW;;QAChB,OAAO,CAAC,MAAA,IAAI,CAAC,OAAO,mCAAI,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;IACvD,CAAC;IAED;;OAEG;IACI,GAAG;;QACR,MAAA,IAAI,CAAC,cAAc,0CAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAED;;;OAGG;IACI,QAAQ,CAAC,KAAY;QAC1B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QAEnB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAChE,CAAC;IAED;;;OAGG;IACI,QAAQ,CAAC,IAAU;QACxB,MAAM,iBAAiB,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;QAEpF,IAAI,iBAAiB,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;CACF;AA3GD,oBA2GC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Trace = void 0;
|
|
4
|
-
const
|
|
4
|
+
const uuid_util_1 = require("../utils/uuid.util");
|
|
5
5
|
/**
|
|
6
6
|
* This model represents a trace.
|
|
7
7
|
*/
|
|
@@ -31,7 +31,7 @@ class Trace {
|
|
|
31
31
|
* Whether or not the trace was ended.
|
|
32
32
|
*/
|
|
33
33
|
this.hasEnded = false;
|
|
34
|
-
this.id = id !== null && id !== void 0 ? id :
|
|
34
|
+
this.id = id !== null && id !== void 0 ? id : uuid_util_1.UuidGenerator.generate();
|
|
35
35
|
this.context = context !== null && context !== void 0 ? context : {};
|
|
36
36
|
}
|
|
37
37
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace.model.js","sourceRoot":"","sources":["../../../../src/models/trace.model.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"trace.model.js","sourceRoot":"","sources":["../../../../src/models/trace.model.ts"],"names":[],"mappings":";;;AAAA,kDAAiD;AAGjD;;GAEG;AACH,MAAa,KAAK;IAuChB;;;;OAIG;IACH,YAAmB,EAAW,EAAE,OAAmC;QAtCnE;;WAEG;QACI,cAAS,GAAW,IAAI,CAAC,GAAG,EAAE,CAAC;QAYtC;;;;;WAKG;QACI,mBAAc,GAAkC,EAAE,CAAC;QAE1D;;WAEG;QACI,YAAO,GAA+B,EAAE,CAAC;QAEhD;;WAEG;QACI,aAAQ,GAAY,KAAK,CAAC;QAQ/B,IAAI,CAAC,EAAE,GAAG,EAAE,aAAF,EAAE,cAAF,EAAE,GAAI,yBAAa,CAAC,QAAQ,EAAE,CAAC;QACzC,IAAI,CAAC,OAAO,GAAG,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,EAAE,CAAC;IAC/B,CAAC;IAED;;OAEG;IACI,WAAW;;QAChB,OAAO,CAAC,MAAA,IAAI,CAAC,OAAO,mCAAI,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;IACvD,CAAC;CACF;AAvDD,sBAuDC"}
|
|
@@ -18,4 +18,5 @@ __exportStar(require("./date.util"), exports);
|
|
|
18
18
|
__exportStar(require("./enum.util"), exports);
|
|
19
19
|
__exportStar(require("./metadata.util"), exports);
|
|
20
20
|
__exportStar(require("./object.util"), exports);
|
|
21
|
+
__exportStar(require("./uuid.util"), exports);
|
|
21
22
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/utils/utils.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA4B;AAC5B,8CAA4B;AAC5B,kDAAgC;AAChC,gDAA8B"}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/utils/utils.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA4B;AAC5B,8CAA4B;AAC5B,kDAAgC;AAChC,gDAA8B;AAC9B,8CAA4B"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UuidGenerator = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Cross-runtime UUID generation. Replaces Node's `crypto.randomUUID()` with the Web Crypto
|
|
6
|
+
* API exposed on `globalThis.crypto`, which is available in browsers, Node.js (19+), Deno,
|
|
7
|
+
* Bun and Cloudflare Workers — keeping `@pristine-ts/common` importable outside Node without
|
|
8
|
+
* pulling in the Node-only `crypto` module.
|
|
9
|
+
*/
|
|
10
|
+
class UuidGenerator {
|
|
11
|
+
/**
|
|
12
|
+
* Returns an RFC 4122 version 4 UUID. Prefers the native `crypto.randomUUID()`, then
|
|
13
|
+
* derives one from `crypto.getRandomValues()`, and only as a last resort (no Web Crypto at
|
|
14
|
+
* all) falls back to `Math.random()` — which is NOT cryptographically secure but keeps
|
|
15
|
+
* exotic runtimes working rather than throwing.
|
|
16
|
+
*/
|
|
17
|
+
static generate() {
|
|
18
|
+
const webCrypto = globalThis.crypto;
|
|
19
|
+
if (typeof (webCrypto === null || webCrypto === void 0 ? void 0 : webCrypto.randomUUID) === "function") {
|
|
20
|
+
return webCrypto.randomUUID();
|
|
21
|
+
}
|
|
22
|
+
if (typeof (webCrypto === null || webCrypto === void 0 ? void 0 : webCrypto.getRandomValues) === "function") {
|
|
23
|
+
const bytes = webCrypto.getRandomValues(new Uint8Array(16));
|
|
24
|
+
// Set the version (4) and variant (RFC 4122) bits.
|
|
25
|
+
bytes[6] = (bytes[6] & 0x0f) | 0x40;
|
|
26
|
+
bytes[8] = (bytes[8] & 0x3f) | 0x80;
|
|
27
|
+
const hex = [];
|
|
28
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
29
|
+
hex.push(bytes[i].toString(16).padStart(2, "0"));
|
|
30
|
+
}
|
|
31
|
+
return (hex.slice(0, 4).join("") + "-" +
|
|
32
|
+
hex.slice(4, 6).join("") + "-" +
|
|
33
|
+
hex.slice(6, 8).join("") + "-" +
|
|
34
|
+
hex.slice(8, 10).join("") + "-" +
|
|
35
|
+
hex.slice(10, 16).join(""));
|
|
36
|
+
}
|
|
37
|
+
// Last-resort, non-cryptographic fallback.
|
|
38
|
+
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (char) => {
|
|
39
|
+
const random = (Math.random() * 16) | 0;
|
|
40
|
+
const value = char === "x" ? random : (random & 0x3) | 0x8;
|
|
41
|
+
return value.toString(16);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
exports.UuidGenerator = UuidGenerator;
|
|
46
|
+
//# sourceMappingURL=uuid.util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uuid.util.js","sourceRoot":"","sources":["../../../../src/utils/uuid.util.ts"],"names":[],"mappings":";;;AASA;;;;;GAKG;AACH,MAAa,aAAa;IACxB;;;;;OAKG;IACI,MAAM,CAAC,QAAQ;QACpB,MAAM,SAAS,GAA+B,UAAyC,CAAC,MAAM,CAAC;QAE/F,IAAI,OAAO,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,UAAU,CAAA,KAAK,UAAU,EAAE,CAAC;YAChD,OAAO,SAAS,CAAC,UAAU,EAAE,CAAC;QAChC,CAAC;QAED,IAAI,OAAO,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,eAAe,CAAA,KAAK,UAAU,EAAE,CAAC;YACrD,MAAM,KAAK,GAAG,SAAS,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5D,mDAAmD;YACnD,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;YACpC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;YAEpC,MAAM,GAAG,GAAa,EAAE,CAAC;YACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACnD,CAAC;YAED,OAAO,CACL,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG;gBAC9B,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG;gBAC9B,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG;gBAC9B,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG;gBAC/B,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAC3B,CAAC;QACJ,CAAC;QAED,2CAA2C;QAC3C,OAAO,sCAAsC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACtE,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;YACxC,MAAM,KAAK,GAAG,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;YAC3D,OAAO,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAzCD,sCAyCC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser substitute for the Node `AsyncLocalStorage`-backed {@link EventContextStorage}.
|
|
3
|
+
* Browsers have no `async_hooks`, so this keeps the active `EventContext` in a single
|
|
4
|
+
* synchronous slot: it correctly scopes — and restores — the context for the synchronous
|
|
5
|
+
* portion of `run()` (including nested `run()` calls), but, unlike Node's
|
|
6
|
+
* `AsyncLocalStorage`, it cannot propagate across `await` boundaries, which no browser API
|
|
7
|
+
* supports.
|
|
8
|
+
*/
|
|
9
|
+
class SynchronousEventContextStorage {
|
|
10
|
+
run(store, callback) {
|
|
11
|
+
const previous = this.store;
|
|
12
|
+
this.store = store;
|
|
13
|
+
try {
|
|
14
|
+
return callback();
|
|
15
|
+
}
|
|
16
|
+
finally {
|
|
17
|
+
this.store = previous;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
getStore() {
|
|
21
|
+
return this.store;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export const eventContextStorage = new SynchronousEventContextStorage();
|
|
25
|
+
//# sourceMappingURL=event-context.als.browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-context.als.browser.js","sourceRoot":"","sources":["../../../../src/managers/event-context.als.browser.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AACH,MAAM,8BAA8B;IAGlC,GAAG,CAAI,KAAmB,EAAE,QAAiB;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC;QAC5B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC;YACH,OAAO,QAAQ,EAAE,CAAC;QACpB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;QACxB,CAAC;IACH,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAwB,IAAI,8BAA8B,EAAE,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from "async_hooks";
|
|
2
|
+
/**
|
|
3
|
+
* Process-wide storage backing the active `EventContext`. A single instance is essential —
|
|
4
|
+
* multiple `AsyncLocalStorage` instances would each track their own propagation chain and
|
|
5
|
+
* contexts wouldn't be visible across them. On Node this propagates the context across
|
|
6
|
+
* `await` boundaries, `Promise.all`, `setImmediate`, and the rest of the async machinery.
|
|
7
|
+
*/
|
|
8
|
+
export const eventContextStorage = new AsyncLocalStorage();
|
|
9
|
+
//# sourceMappingURL=event-context.als.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-context.als.js","sourceRoot":"","sources":["../../../../src/managers/event-context.als.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,iBAAiB,EAAC,MAAM,aAAa,CAAC;AAe9C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAwB,IAAI,iBAAiB,EAAgB,CAAC"}
|
|
@@ -5,8 +5,8 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
5
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
};
|
|
7
7
|
var EventContextManager_1;
|
|
8
|
-
import { AsyncLocalStorage } from "async_hooks";
|
|
9
8
|
import { injectable } from "tsyringe";
|
|
9
|
+
import { eventContextStorage } from "./event-context.als";
|
|
10
10
|
/**
|
|
11
11
|
* Owns the `AsyncLocalStorage` instance that propagates the active `EventContext`
|
|
12
12
|
* across `await` boundaries, `Promise.all`, `setImmediate`, and the rest of Node's
|
|
@@ -22,21 +22,20 @@ import { injectable } from "tsyringe";
|
|
|
22
22
|
* Captures the current context and returns a wrapped function that restores it
|
|
23
23
|
* on call.
|
|
24
24
|
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
* shared and consistent.
|
|
25
|
+
* The backing storage lives in `./event-context.als` (a single process-wide
|
|
26
|
+
* `AsyncLocalStorage`) rather than being constructed here, so a browser build can swap it
|
|
27
|
+
* for a synchronous shim — `async_hooks` is Node-only. Keeping the storage shared while the
|
|
28
|
+
* class stays `@injectable()` lets DI consumers resolve the manager normally (and substitute
|
|
29
|
+
* fakes in tests) while the underlying state stays shared and consistent.
|
|
31
30
|
*/
|
|
32
31
|
let EventContextManager = EventContextManager_1 = class EventContextManager {
|
|
33
32
|
run(ctx, fn) {
|
|
34
|
-
return
|
|
33
|
+
return eventContextStorage.run(ctx, fn);
|
|
35
34
|
}
|
|
36
35
|
/** Returns the active `EventContext`, or `undefined` if no context is installed
|
|
37
36
|
* (i.e. we're outside any `run()` call). */
|
|
38
37
|
current() {
|
|
39
|
-
return
|
|
38
|
+
return eventContextStorage.getStore();
|
|
40
39
|
}
|
|
41
40
|
/** Convenience: the `eventId` of the active context, or `undefined`. */
|
|
42
41
|
eventId() {
|
|
@@ -71,15 +70,14 @@ let EventContextManager = EventContextManager_1 = class EventContextManager {
|
|
|
71
70
|
const ctx = this.current();
|
|
72
71
|
if (ctx === undefined)
|
|
73
72
|
return fn;
|
|
74
|
-
|
|
75
|
-
return ((...args) => als.run(ctx, () => fn(...args)));
|
|
73
|
+
return ((...args) => eventContextStorage.run(ctx, () => fn(...args)));
|
|
76
74
|
}
|
|
77
75
|
// ── Static convenience mirrors. ────────────────────────────────────────────────
|
|
78
76
|
// For callers that don't want DI noise (e.g. utility code, decorators, helpers
|
|
79
77
|
// that don't have a constructor to inject through). All forwarding to the same
|
|
80
|
-
// shared
|
|
78
|
+
// shared storage instance.
|
|
81
79
|
static current() {
|
|
82
|
-
return
|
|
80
|
+
return eventContextStorage.getStore();
|
|
83
81
|
}
|
|
84
82
|
static eventId() {
|
|
85
83
|
var _a;
|
|
@@ -101,11 +99,9 @@ let EventContextManager = EventContextManager_1 = class EventContextManager {
|
|
|
101
99
|
const ctx = EventContextManager_1.current();
|
|
102
100
|
if (ctx === undefined)
|
|
103
101
|
return fn;
|
|
104
|
-
|
|
105
|
-
return ((...args) => als.run(ctx, () => fn(...args)));
|
|
102
|
+
return ((...args) => eventContextStorage.run(ctx, () => fn(...args)));
|
|
106
103
|
}
|
|
107
104
|
};
|
|
108
|
-
EventContextManager.als = new AsyncLocalStorage();
|
|
109
105
|
EventContextManager = EventContextManager_1 = __decorate([
|
|
110
106
|
injectable()
|
|
111
107
|
], EventContextManager);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-context.manager.js","sourceRoot":"","sources":["../../../../src/managers/event-context.manager.ts"],"names":[],"mappings":";;;;;;;AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"event-context.manager.js","sourceRoot":"","sources":["../../../../src/managers/event-context.manager.ts"],"names":[],"mappings":";;;;;;;AAAA,OAAO,EAAsB,UAAU,EAAC,MAAM,UAAU,CAAC;AAGzD,OAAO,EAAC,mBAAmB,EAAC,MAAM,qBAAqB,CAAC;AAExD;;;;;;;;;;;;;;;;;;;;GAoBG;AAEI,IAAM,mBAAmB,2BAAzB,MAAM,mBAAmB;IAQ9B,GAAG,CAAI,GAAiB,EAAE,EAAwB;QAChD,OAAO,mBAAmB,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED;iDAC6C;IAC7C,OAAO;QACL,OAAO,mBAAmB,CAAC,QAAQ,EAAE,CAAC;IACxC,CAAC;IAED,wEAAwE;IACxE,OAAO;;QACL,OAAO,MAAA,IAAI,CAAC,OAAO,EAAE,0CAAE,OAAO,CAAC;IACjC,CAAC;IAED,wEAAwE;IACxE,OAAO;;QACL,OAAO,MAAA,IAAI,CAAC,OAAO,EAAE,0CAAE,OAAO,CAAC;IACjC,CAAC;IAED,qEAAqE;IACrE,SAAS;;QACP,OAAO,MAAA,IAAI,CAAC,OAAO,EAAE,0CAAE,SAAS,CAAC;IACnC,CAAC;IAED,sFAAsF;IACtF,cAAc;;QACZ,OAAO,MAAA,IAAI,CAAC,OAAO,EAAE,0CAAE,cAAc,CAAC;IACxC,CAAC;IAED;;;;;;;;OAQG;IACH,IAAI,CAAoC,EAAK;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC3B,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO,EAAE,CAAC;QACjC,OAAO,CAAC,CAAC,GAAG,IAAW,EAAE,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAM,CAAC;IACpF,CAAC;IAED,kFAAkF;IAClF,+EAA+E;IAC/E,+EAA+E;IAC/E,2BAA2B;IAE3B,MAAM,CAAC,OAAO;QACZ,OAAO,mBAAmB,CAAC,QAAQ,EAAE,CAAC;IACxC,CAAC;IAED,MAAM,CAAC,OAAO;;QACZ,OAAO,MAAA,qBAAmB,CAAC,OAAO,EAAE,0CAAE,OAAO,CAAC;IAChD,CAAC;IAED,MAAM,CAAC,OAAO;;QACZ,OAAO,MAAA,qBAAmB,CAAC,OAAO,EAAE,0CAAE,OAAO,CAAC;IAChD,CAAC;IAED,MAAM,CAAC,SAAS;;QACd,OAAO,MAAA,qBAAmB,CAAC,OAAO,EAAE,0CAAE,SAAS,CAAC;IAClD,CAAC;IAED,MAAM,CAAC,cAAc;;QACnB,OAAO,MAAA,qBAAmB,CAAC,OAAO,EAAE,0CAAE,cAAc,CAAC;IACvD,CAAC;IAED,MAAM,CAAC,IAAI,CAAoC,EAAK;QAClD,MAAM,GAAG,GAAG,qBAAmB,CAAC,OAAO,EAAE,CAAC;QAC1C,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO,EAAE,CAAC;QACjC,OAAO,CAAC,CAAC,GAAG,IAAW,EAAE,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAM,CAAC;IACpF,CAAC;CACF,CAAA;AAnFY,mBAAmB;IAD/B,UAAU,EAAE;GACA,mBAAmB,CAmF/B"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { UuidGenerator } from "../utils/uuid.util";
|
|
2
2
|
/**
|
|
3
3
|
* This model represents a span.
|
|
4
4
|
*/
|
|
@@ -37,7 +37,7 @@ export class Span {
|
|
|
37
37
|
* Whether or not the span is in progress, meaning it has not ended.
|
|
38
38
|
*/
|
|
39
39
|
this.inProgress = true;
|
|
40
|
-
this.id = id !== null && id !== void 0 ? id :
|
|
40
|
+
this.id = id !== null && id !== void 0 ? id : UuidGenerator.generate();
|
|
41
41
|
this.context = context !== null && context !== void 0 ? context : {};
|
|
42
42
|
}
|
|
43
43
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"span.model.js","sourceRoot":"","sources":["../../../../src/models/span.model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,
|
|
1
|
+
{"version":3,"file":"span.model.js","sourceRoot":"","sources":["../../../../src/models/span.model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAC,MAAM,oBAAoB,CAAC;AAKjD;;GAEG;AACH,MAAM,OAAO,IAAI;IA0Df;;;;;OAKG;IACH,YAA0B,OAAe,EAAE,EAAW,EAAE,OAAmC;QAAjE,YAAO,GAAP,OAAO,CAAQ;QA/CzC;;WAEG;QACI,cAAS,GAAW,IAAI,CAAC,GAAG,EAAE,CAAC;QAYtC;;WAEG;QACI,aAAQ,GAAW,EAAE,CAAC;QAE7B;;;;;;;;WAQG;QACI,YAAO,GAAiB,EAAE,CAAC;QAElC;;WAEG;QACI,YAAO,GAA8B,EAAE,CAAC;QAE/C;;WAEG;QACI,eAAU,GAAG,IAAI,CAAC;QASvB,IAAI,CAAC,EAAE,GAAG,EAAE,aAAF,EAAE,cAAF,EAAE,GAAI,aAAa,CAAC,QAAQ,EAAE,CAAC;QACzC,IAAI,CAAC,OAAO,GAAG,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,EAAE,CAAC;IAC/B,CAAC;IAED;;OAEG;IACI,WAAW;;QAChB,OAAO,CAAC,MAAA,IAAI,CAAC,OAAO,mCAAI,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;IACvD,CAAC;IAED;;OAEG;IACI,GAAG;;QACR,MAAA,IAAI,CAAC,cAAc,0CAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAED;;;OAGG;IACI,QAAQ,CAAC,KAAY;QAC1B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QAEnB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAChE,CAAC;IAED;;;OAGG;IACI,QAAQ,CAAC,IAAU;QACxB,MAAM,iBAAiB,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;QAEpF,IAAI,iBAAiB,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;CACF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { UuidGenerator } from "../utils/uuid.util";
|
|
2
2
|
/**
|
|
3
3
|
* This model represents a trace.
|
|
4
4
|
*/
|
|
@@ -28,7 +28,7 @@ export class Trace {
|
|
|
28
28
|
* Whether or not the trace was ended.
|
|
29
29
|
*/
|
|
30
30
|
this.hasEnded = false;
|
|
31
|
-
this.id = id !== null && id !== void 0 ? id :
|
|
31
|
+
this.id = id !== null && id !== void 0 ? id : UuidGenerator.generate();
|
|
32
32
|
this.context = context !== null && context !== void 0 ? context : {};
|
|
33
33
|
}
|
|
34
34
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace.model.js","sourceRoot":"","sources":["../../../../src/models/trace.model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,
|
|
1
|
+
{"version":3,"file":"trace.model.js","sourceRoot":"","sources":["../../../../src/models/trace.model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAC,MAAM,oBAAoB,CAAC;AAGjD;;GAEG;AACH,MAAM,OAAO,KAAK;IAuChB;;;;OAIG;IACH,YAAmB,EAAW,EAAE,OAAmC;QAtCnE;;WAEG;QACI,cAAS,GAAW,IAAI,CAAC,GAAG,EAAE,CAAC;QAYtC;;;;;WAKG;QACI,mBAAc,GAAkC,EAAE,CAAC;QAE1D;;WAEG;QACI,YAAO,GAA+B,EAAE,CAAC;QAEhD;;WAEG;QACI,aAAQ,GAAY,KAAK,CAAC;QAQ/B,IAAI,CAAC,EAAE,GAAG,EAAE,aAAF,EAAE,cAAF,EAAE,GAAI,aAAa,CAAC,QAAQ,EAAE,CAAC;QACzC,IAAI,CAAC,OAAO,GAAG,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,EAAE,CAAC;IAC/B,CAAC;IAED;;OAEG;IACI,WAAW;;QAChB,OAAO,CAAC,MAAA,IAAI,CAAC,OAAO,mCAAI,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;IACvD,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/utils/utils.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/utils/utils.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-runtime UUID generation. Replaces Node's `crypto.randomUUID()` with the Web Crypto
|
|
3
|
+
* API exposed on `globalThis.crypto`, which is available in browsers, Node.js (19+), Deno,
|
|
4
|
+
* Bun and Cloudflare Workers — keeping `@pristine-ts/common` importable outside Node without
|
|
5
|
+
* pulling in the Node-only `crypto` module.
|
|
6
|
+
*/
|
|
7
|
+
export class UuidGenerator {
|
|
8
|
+
/**
|
|
9
|
+
* Returns an RFC 4122 version 4 UUID. Prefers the native `crypto.randomUUID()`, then
|
|
10
|
+
* derives one from `crypto.getRandomValues()`, and only as a last resort (no Web Crypto at
|
|
11
|
+
* all) falls back to `Math.random()` — which is NOT cryptographically secure but keeps
|
|
12
|
+
* exotic runtimes working rather than throwing.
|
|
13
|
+
*/
|
|
14
|
+
static generate() {
|
|
15
|
+
const webCrypto = globalThis.crypto;
|
|
16
|
+
if (typeof (webCrypto === null || webCrypto === void 0 ? void 0 : webCrypto.randomUUID) === "function") {
|
|
17
|
+
return webCrypto.randomUUID();
|
|
18
|
+
}
|
|
19
|
+
if (typeof (webCrypto === null || webCrypto === void 0 ? void 0 : webCrypto.getRandomValues) === "function") {
|
|
20
|
+
const bytes = webCrypto.getRandomValues(new Uint8Array(16));
|
|
21
|
+
// Set the version (4) and variant (RFC 4122) bits.
|
|
22
|
+
bytes[6] = (bytes[6] & 0x0f) | 0x40;
|
|
23
|
+
bytes[8] = (bytes[8] & 0x3f) | 0x80;
|
|
24
|
+
const hex = [];
|
|
25
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
26
|
+
hex.push(bytes[i].toString(16).padStart(2, "0"));
|
|
27
|
+
}
|
|
28
|
+
return (hex.slice(0, 4).join("") + "-" +
|
|
29
|
+
hex.slice(4, 6).join("") + "-" +
|
|
30
|
+
hex.slice(6, 8).join("") + "-" +
|
|
31
|
+
hex.slice(8, 10).join("") + "-" +
|
|
32
|
+
hex.slice(10, 16).join(""));
|
|
33
|
+
}
|
|
34
|
+
// Last-resort, non-cryptographic fallback.
|
|
35
|
+
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (char) => {
|
|
36
|
+
const random = (Math.random() * 16) | 0;
|
|
37
|
+
const value = char === "x" ? random : (random & 0x3) | 0x8;
|
|
38
|
+
return value.toString(16);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=uuid.util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uuid.util.js","sourceRoot":"","sources":["../../../../src/utils/uuid.util.ts"],"names":[],"mappings":"AASA;;;;;GAKG;AACH,MAAM,OAAO,aAAa;IACxB;;;;;OAKG;IACI,MAAM,CAAC,QAAQ;QACpB,MAAM,SAAS,GAA+B,UAAyC,CAAC,MAAM,CAAC;QAE/F,IAAI,OAAO,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,UAAU,CAAA,KAAK,UAAU,EAAE,CAAC;YAChD,OAAO,SAAS,CAAC,UAAU,EAAE,CAAC;QAChC,CAAC;QAED,IAAI,OAAO,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,eAAe,CAAA,KAAK,UAAU,EAAE,CAAC;YACrD,MAAM,KAAK,GAAG,SAAS,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5D,mDAAmD;YACnD,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;YACpC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;YAEpC,MAAM,GAAG,GAAa,EAAE,CAAC;YACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACnD,CAAC;YAED,OAAO,CACL,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG;gBAC9B,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG;gBAC9B,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG;gBAC9B,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG;gBAC/B,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAC3B,CAAC;QACJ,CAAC;QAED,2CAA2C;QAC3C,OAAO,sCAAsC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACtE,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;YACxC,MAAM,KAAK,GAAG,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;YAC3D,OAAO,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|