@ddd-ts/event-sourcing-firestore 0.0.36 → 0.0.38

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 (95) hide show
  1. package/LICENSE +21 -0
  2. package/dist/_virtual/_rolldown/runtime.js +29 -0
  3. package/dist/firestore.event-lake.aggregate-store.d.ts +4 -8
  4. package/dist/firestore.event-lake.aggregate-store.d.ts.map +1 -1
  5. package/dist/firestore.event-lake.aggregate-store.js +35 -33
  6. package/dist/firestore.event-lake.aggregate-store.mjs +36 -0
  7. package/dist/firestore.event-lake.storage-layer.d.ts +2 -2
  8. package/dist/firestore.event-lake.storage-layer.d.ts.map +1 -1
  9. package/dist/firestore.event-lake.storage-layer.js +67 -117
  10. package/dist/firestore.event-lake.storage-layer.mjs +65 -0
  11. package/dist/firestore.event-lake.store.d.ts +1 -1
  12. package/dist/firestore.event-lake.store.d.ts.map +1 -1
  13. package/dist/firestore.event-lake.store.js +14 -12
  14. package/dist/firestore.event-lake.store.mjs +13 -0
  15. package/dist/firestore.event-stream.aggregate-store.d.ts +2 -2
  16. package/dist/firestore.event-stream.aggregate-store.d.ts.map +1 -1
  17. package/dist/firestore.event-stream.aggregate-store.js +35 -37
  18. package/dist/firestore.event-stream.aggregate-store.mjs +36 -0
  19. package/dist/firestore.event-stream.storage-layer.d.ts +2 -2
  20. package/dist/firestore.event-stream.storage-layer.d.ts.map +1 -1
  21. package/dist/firestore.event-stream.storage-layer.js +67 -110
  22. package/dist/firestore.event-stream.storage-layer.mjs +65 -0
  23. package/dist/firestore.event-stream.store.d.ts +1 -1
  24. package/dist/firestore.event-stream.store.d.ts.map +1 -1
  25. package/dist/firestore.event-stream.store.js +14 -12
  26. package/dist/firestore.event-stream.store.mjs +13 -0
  27. package/dist/firestore.projected-stream.reader.d.ts +1 -1
  28. package/dist/firestore.projected-stream.reader.d.ts.map +1 -1
  29. package/dist/firestore.projected-stream.reader.js +35 -37
  30. package/dist/firestore.projected-stream.reader.mjs +34 -0
  31. package/dist/firestore.projected-stream.storage-layer.d.ts +1 -1
  32. package/dist/firestore.projected-stream.storage-layer.d.ts.map +1 -1
  33. package/dist/firestore.projected-stream.storage-layer.js +119 -140
  34. package/dist/firestore.projected-stream.storage-layer.mjs +118 -0
  35. package/dist/firestore.snapshotter.js +36 -40
  36. package/dist/firestore.snapshotter.mjs +35 -0
  37. package/dist/index.js +30 -32
  38. package/dist/index.mjs +12 -0
  39. package/dist/projection/firestore.projector.d.ts +1 -1
  40. package/dist/projection/firestore.projector.d.ts.map +1 -1
  41. package/dist/projection/firestore.projector.js +477 -630
  42. package/dist/projection/firestore.projector.mjs +479 -0
  43. package/dist/projection/testkit/case-fixture.d.ts.map +1 -1
  44. package/dist/projection/testkit.d.ts +1 -1
  45. package/dist/projection/testkit.d.ts.map +1 -1
  46. package/package.json +43 -32
  47. package/dist/firestore.event-lake.aggregate-store.js.map +0 -1
  48. package/dist/firestore.event-lake.aggregate-store.spec.js +0 -58
  49. package/dist/firestore.event-lake.aggregate-store.spec.js.map +0 -1
  50. package/dist/firestore.event-lake.storage-layer.js.map +0 -1
  51. package/dist/firestore.event-lake.store.js.map +0 -1
  52. package/dist/firestore.event-lake.store.spec.js +0 -50
  53. package/dist/firestore.event-lake.store.spec.js.map +0 -1
  54. package/dist/firestore.event-stream-store.spec.js +0 -50
  55. package/dist/firestore.event-stream-store.spec.js.map +0 -1
  56. package/dist/firestore.event-stream.aggregate-store.js.map +0 -1
  57. package/dist/firestore.event-stream.aggregate-store.spec.js +0 -54
  58. package/dist/firestore.event-stream.aggregate-store.spec.js.map +0 -1
  59. package/dist/firestore.event-stream.storage-layer.js.map +0 -1
  60. package/dist/firestore.event-stream.store.js.map +0 -1
  61. package/dist/firestore.projected-stream.reader.js.map +0 -1
  62. package/dist/firestore.projected-stream.reader.spec.js +0 -54
  63. package/dist/firestore.projected-stream.reader.spec.js.map +0 -1
  64. package/dist/firestore.projected-stream.storage-layer.js.map +0 -1
  65. package/dist/firestore.snapshotter.js.map +0 -1
  66. package/dist/index.js.map +0 -1
  67. package/dist/projection/cases/attempts.spec.js +0 -42
  68. package/dist/projection/cases/attempts.spec.js.map +0 -1
  69. package/dist/projection/cases/batchlast.spec.js +0 -51
  70. package/dist/projection/cases/batchlast.spec.js.map +0 -1
  71. package/dist/projection/cases/bigshuffle.spec.js +0 -59
  72. package/dist/projection/cases/bigshuffle.spec.js.map +0 -1
  73. package/dist/projection/cases/burst.spec.js +0 -38
  74. package/dist/projection/cases/burst.spec.js.map +0 -1
  75. package/dist/projection/cases/claimtimeout.spec.js +0 -40
  76. package/dist/projection/cases/claimtimeout.spec.js.map +0 -1
  77. package/dist/projection/cases/concurrency.spec.js +0 -49
  78. package/dist/projection/cases/concurrency.spec.js.map +0 -1
  79. package/dist/projection/cases/deduplicate.spec.js +0 -22
  80. package/dist/projection/cases/deduplicate.spec.js.map +0 -1
  81. package/dist/projection/cases/defer.spec.js +0 -44
  82. package/dist/projection/cases/defer.spec.js.map +0 -1
  83. package/dist/projection/cases/lock.spec.js +0 -91
  84. package/dist/projection/cases/lock.spec.js.map +0 -1
  85. package/dist/projection/cases/skip.spec.js +0 -86
  86. package/dist/projection/cases/skip.spec.js.map +0 -1
  87. package/dist/projection/cases/stress.spec.js +0 -73
  88. package/dist/projection/cases/stress.spec.js.map +0 -1
  89. package/dist/projection/firestore.projector.js.map +0 -1
  90. package/dist/projection/testkit/case-fixture.js +0 -341
  91. package/dist/projection/testkit/case-fixture.js.map +0 -1
  92. package/dist/projection/testkit.js +0 -77
  93. package/dist/projection/testkit.js.map +0 -1
  94. package/dist/projection/trace.decorator.js +0 -35
  95. package/dist/projection/trace.decorator.js.map +0 -1
@@ -1,341 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.runtimeTrace = exports.traits = exports.locks = void 0;
37
- exports.cashflowDefaults = cashflowDefaults;
38
- exports.caseFixture = caseFixture;
39
- process.env.FIRESTORE_EMULATOR_HOST =
40
- process.env.FIRESTORE_EMULATOR_HOST || "localhost:8080";
41
- const fb = __importStar(require("firebase-admin"));
42
- const firestore_1 = require("firebase-admin/firestore");
43
- const core_1 = require("@ddd-ts/core");
44
- const traits_1 = require("@ddd-ts/traits");
45
- const store_firestore_1 = require("@ddd-ts/store-firestore");
46
- const firestore_event_stream_aggregate_store_1 = require("../../firestore.event-stream.aggregate-store");
47
- const firestore_projected_stream_reader_1 = require("../../firestore.projected-stream.reader");
48
- const firestore_projector_1 = require("../firestore.projector");
49
- const { Account, AccountOpened, Deposited, Withdrawn, AccountRenamed, Registry, } = core_1.ProjectorTesting;
50
- exports.locks = {
51
- wholeAccount: (e) => new core_1.Lock({ accountId: e.payload.accountId.serialize() }),
52
- accountAndEventId: (e) => new core_1.Lock({
53
- accountId: e.payload.accountId.serialize(),
54
- eventId: e.id.serialize(),
55
- }),
56
- rename: (e) => new core_1.Lock({ accountId: e.payload.accountId.serialize(), type: "rename" }),
57
- };
58
- exports.traits = {
59
- Transaction: () => core_1.Handler.Transaction(),
60
- Context: () => core_1.Handler.Context,
61
- Suspense: () => core_1.Handler.Suspense,
62
- Parallel: () => core_1.Handler.Parallel,
63
- Sequential: () => core_1.Handler.Sequential,
64
- LocalRetry: (attempts, delay) => core_1.Handler.LocalRetry(attempts, delay),
65
- LocalTimeout: (ms) => core_1.Handler.LocalTimeout(ms),
66
- ClaimTimeout: (ms) => core_1.Handler.ClaimTimeout(ms),
67
- Delay: (ms) => core_1.Handler.Delay(ms),
68
- SkipAfter: (ms) => core_1.Handler.SkipAfter(ms),
69
- IsolateAfter: (ms) => core_1.Handler.IsolateAfter(ms),
70
- };
71
- exports.runtimeTrace = {
72
- entries: [],
73
- reset() {
74
- this.entries.length = 0;
75
- },
76
- };
77
- function compose(...t) {
78
- return t;
79
- }
80
- function cashflowDefaults() {
81
- return {
82
- override(overrides) {
83
- return { overrides };
84
- },
85
- toHandlers() {
86
- return {};
87
- },
88
- };
89
- }
90
- function makeOnOpened(store, trx, recipe) {
91
- const Derived = (0, traits_1.Derive)(core_1.Handler.Base, core_1.Handler.WithProps(), core_1.Handler.OnProcessed, ...recipe.chain);
92
- class Impl extends Derived {
93
- locks(e) {
94
- return exports.locks.wholeAccount(e);
95
- }
96
- async handleOne(e) {
97
- exports.runtimeTrace.entries.push({
98
- id: e.id.serialize(),
99
- phase: "start",
100
- t: Date.now(),
101
- });
102
- await this.props.store.init(e.payload.accountId, e);
103
- exports.runtimeTrace.entries.push({
104
- id: e.id.serialize(),
105
- phase: "finish",
106
- t: Date.now(),
107
- });
108
- }
109
- }
110
- return new Impl({ store, transaction: trx });
111
- }
112
- function makeOnFlow(store, trx, recipe) {
113
- const Derived = (0, traits_1.Derive)(core_1.Handler.Base, core_1.Handler.WithProps(), core_1.Handler.OnProcessed, ...recipe.chain);
114
- class Impl extends Derived {
115
- locks(e) {
116
- return recipe.lock(e);
117
- }
118
- async handleOne(e) {
119
- await this.props.store.increment(e.payload.accountId, e.payload.amount, e);
120
- }
121
- async process(events, context) {
122
- for (const e of events)
123
- exports.runtimeTrace.entries.push({
124
- id: e.id.serialize(),
125
- phase: "start",
126
- t: Date.now(),
127
- });
128
- const res = await super.process(events, context);
129
- for (const e of events)
130
- exports.runtimeTrace.entries.push({
131
- id: e.id.serialize(),
132
- phase: "finish",
133
- t: Date.now(),
134
- });
135
- return res;
136
- }
137
- }
138
- return new Impl({ store, transaction: trx });
139
- }
140
- function makeOnRenamed(store, trx, recipe) {
141
- const Derived = (0, traits_1.Derive)(core_1.Handler.Base, core_1.Handler.WithProps(), core_1.Handler.OnProcessed, ...recipe.chain);
142
- class Impl extends Derived {
143
- locks(e) {
144
- return recipe.lock(e);
145
- }
146
- async handleLast(e) {
147
- await this.props.store.rename(e.payload.accountId, e.payload.newName, e);
148
- }
149
- async process(events, context) {
150
- for (const e of events)
151
- exports.runtimeTrace.entries.push({
152
- id: e.id.serialize(),
153
- phase: "start",
154
- t: Date.now(),
155
- });
156
- const res = await super.process(events, context);
157
- for (const e of events)
158
- exports.runtimeTrace.entries.push({
159
- id: e.id.serialize(),
160
- phase: "finish",
161
- t: Date.now(),
162
- });
163
- return res;
164
- }
165
- }
166
- return new Impl({ store, transaction: trx });
167
- }
168
- class CashflowDocStore extends store_firestore_1.FirestoreStore {
169
- constructor(db, collName) {
170
- super(db.collection(collName), new core_1.ProjectorTesting.CashflowSerializer(), "Cashflow");
171
- }
172
- async init(accountId, event, context = core_1.ProjectionContext.get()) {
173
- await context.trx?.transaction.create(this.collection.doc(accountId.serialize()), {
174
- id: accountId.serialize(),
175
- flow: 0,
176
- name: accountId.serialize(),
177
- all_names: [],
178
- ops_trace: event ? [event.id.serialize()] : [],
179
- version: 1,
180
- });
181
- }
182
- async increment(accountId, amount, event, context = core_1.ProjectionContext.get()) {
183
- await context.trx?.transaction.update(this.collection.doc(accountId.serialize()), {
184
- flow: firestore_1.FieldValue.increment(amount),
185
- ops_trace: event
186
- ? firestore_1.FieldValue.arrayUnion(event.id.serialize())
187
- : firestore_1.FieldValue.arrayUnion(),
188
- });
189
- }
190
- async rename(accountId, newName, event, context = core_1.ProjectionContext.get()) {
191
- await context.trx?.transaction.update(this.collection.doc(accountId.serialize()), {
192
- name: newName,
193
- all_names: firestore_1.FieldValue.arrayUnion(newName),
194
- ops_trace: event
195
- ? firestore_1.FieldValue.arrayUnion(event.id.serialize())
196
- : firestore_1.FieldValue.arrayUnion(),
197
- });
198
- }
199
- }
200
- class AccountStore extends (0, firestore_event_stream_aggregate_store_1.MakeFirestoreEventStreamAggregateStore)(Account) {
201
- constructor(firestore) {
202
- super(firestore, Registry);
203
- }
204
- }
205
- class CashflowCaseProjection extends core_1.ESProjection {
206
- trx;
207
- store;
208
- source = new core_1.ProjectedStream({
209
- sources: [
210
- new core_1.StreamSource({
211
- aggregateType: Account.name,
212
- shardKey: "accountId",
213
- events: [
214
- AccountOpened.name,
215
- Deposited.name,
216
- Withdrawn.name,
217
- AccountRenamed.name,
218
- ],
219
- }),
220
- ],
221
- });
222
- constructor(trx, store, recipes) {
223
- super();
224
- this.trx = trx;
225
- this.store = store;
226
- this.registerHandler(AccountOpened, makeOnOpened(store, trx, recipes.AccountOpened));
227
- this.registerHandler(Deposited, makeOnFlow(store, trx, recipes.Deposited));
228
- this.registerHandler(Withdrawn, makeOnFlow(store, trx, recipes.Withdrawn));
229
- this.registerHandler(AccountRenamed, makeOnRenamed(store, trx, recipes.AccountRenamed));
230
- }
231
- getSource() {
232
- return this.source;
233
- }
234
- getCheckpointId(e) {
235
- return core_1.CheckpointId.from("Cashflow", e.payload.accountId);
236
- }
237
- get testhandlers() {
238
- return this.handlers;
239
- }
240
- }
241
- function caseFixture(caseName, opts = {}) {
242
- const app = fb.apps.length
243
- ? fb.app()
244
- : fb.initializeApp({ projectId: "demo-es" });
245
- const db = app.firestore();
246
- const defaultFlow = {
247
- chain: compose(exports.traits.Context(), exports.traits.Transaction(), exports.traits.Suspense(), exports.traits.LocalTimeout(200), exports.traits.LocalRetry(2, 10), exports.traits.ClaimTimeout(2000), exports.traits.Parallel()),
248
- lock: exports.locks.accountAndEventId,
249
- };
250
- const defaultRename = {
251
- chain: compose(exports.traits.Context(), exports.traits.Transaction(), exports.traits.Suspense(), exports.traits.LocalTimeout(2000), core_1.Handler.BatchLast),
252
- lock: exports.locks.rename,
253
- };
254
- const defaultOpened = {
255
- chain: compose(exports.traits.Context(), exports.traits.Transaction(), exports.traits.Suspense(), exports.traits.Parallel()),
256
- lock: exports.locks.wholeAccount,
257
- };
258
- const recipes = {
259
- Deposited: opts.handlers?.Deposited || defaultFlow,
260
- Withdrawn: opts.handlers?.Withdrawn || defaultFlow,
261
- AccountRenamed: opts.handlers?.AccountRenamed || defaultRename,
262
- AccountOpened: opts.handlers?.AccountOpened || defaultOpened,
263
- };
264
- return {
265
- name: caseName,
266
- describe: (fn) => describe(caseName, fn),
267
- async setup() {
268
- exports.runtimeTrace.reset();
269
- const accountStore = new AccountStore(db);
270
- const cashflowStore = new CashflowDocStore(db, `Cashflow_${caseName}`);
271
- // Cleanup any leftover docs from previous runs for determinism
272
- const existing = await cashflowStore.collection.get();
273
- if (!existing.empty) {
274
- const batch = db.batch();
275
- for (const d of existing.docs) {
276
- batch.delete(d.ref);
277
- }
278
- await batch.commit();
279
- }
280
- const trx = new store_firestore_1.FirestoreTransactionPerformer(db);
281
- const projection = new CashflowCaseProjection(trx, cashflowStore, recipes);
282
- const reader = new firestore_projected_stream_reader_1.FirestoreProjectedStreamReader(db, Registry);
283
- const queueStore = new firestore_projector_1.FirestoreQueueStore(db);
284
- const projector = new firestore_projector_1.FirestoreProjector(projection, reader, queueStore, {
285
- onEnqueueError: console.log,
286
- onProcessError: console.error,
287
- retry: {
288
- attempts: opts.projector?.retry?.attempts || 10,
289
- minDelay: opts.projector?.retry?.minDelay || 100,
290
- maxDelay: opts.projector?.retry?.maxDelay || 100,
291
- backoff: opts.projector?.retry?.backoff || 1,
292
- },
293
- enqueue: opts.projector?.enqueue || { batchSize: 50 },
294
- });
295
- projector._unclaim =
296
- opts.projector?.unclaimOnFailure === false ? false : projector._unclaim;
297
- const events = {
298
- open: (name) => Account.open(name),
299
- };
300
- const act = {
301
- save: (account) => accountStore.save(account),
302
- handle: (event) => projector.handle(event),
303
- };
304
- const control = {
305
- markFailing: (event) => projection.testhandlers[event.name].markFailing(event),
306
- suspend: (event) => projection.testhandlers[event.name].suspend(event),
307
- wait: (ms) => new Promise((r) => setTimeout(r, ms)),
308
- };
309
- const assert = {
310
- cashflow: (id) => ({
311
- async toHave(partial) {
312
- const doc = await cashflowStore.load(id);
313
- expect(doc).toMatchObject(partial);
314
- },
315
- async toNotExist() {
316
- const doc = await cashflowStore.load(id);
317
- expect(doc).toBeUndefined();
318
- },
319
- }),
320
- async fetch(id) {
321
- return cashflowStore.load(id);
322
- },
323
- };
324
- return {
325
- db,
326
- accountStore,
327
- cashflowStore,
328
- projection,
329
- reader,
330
- queueStore,
331
- projector,
332
- trace: exports.runtimeTrace,
333
- events,
334
- act,
335
- control,
336
- assert,
337
- };
338
- },
339
- };
340
- }
341
- //# sourceMappingURL=case-fixture.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"case-fixture.js","sourceRoot":"","sources":["../../../src/projection/testkit/case-fixture.ts"],"names":[],"mappings":"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","sourcesContent":["process.env.FIRESTORE_EMULATOR_HOST =\n process.env.FIRESTORE_EMULATOR_HOST || \"localhost:8080\";\nimport * as fb from \"firebase-admin\";\nimport { FieldValue, Firestore } from \"firebase-admin/firestore\";\nimport {\n ESProjection,\n ProjectedStream,\n StreamSource,\n CheckpointId,\n Lock,\n ProjectorTesting,\n Handler,\n ProjectionContext,\n} from \"@ddd-ts/core\";\nimport { Derive } from \"@ddd-ts/traits\";\nimport {\n FirestoreTransactionPerformer,\n FirestoreTransaction,\n FirestoreStore,\n} from \"@ddd-ts/store-firestore\";\nimport { MakeFirestoreEventStreamAggregateStore } from \"../../firestore.event-stream.aggregate-store\";\nimport { FirestoreProjectedStreamReader } from \"../../firestore.projected-stream.reader\";\nimport {\n FirestoreProjector,\n FirestoreQueueStore,\n} from \"../firestore.projector\";\nimport { AccountId } from \"@ddd-ts/core/dist/projections/spec/account/account\";\nimport { Cashflow } from \"@ddd-ts/core/dist/projections/spec/cashflow/cashflow\";\n\nconst {\n Account,\n AccountOpened,\n Deposited,\n Withdrawn,\n AccountRenamed,\n Registry,\n} = ProjectorTesting as any;\n\nexport const locks = {\n wholeAccount: (e: any) =>\n new Lock({ accountId: e.payload.accountId.serialize() }),\n accountAndEventId: (e: any) =>\n new Lock({\n accountId: e.payload.accountId.serialize(),\n eventId: e.id.serialize(),\n }),\n rename: (e: any) =>\n new Lock({ accountId: e.payload.accountId.serialize(), type: \"rename\" }),\n};\n\nexport const traits = {\n Transaction: () => Handler.Transaction<any>(),\n Context: () => Handler.Context,\n Suspense: () => Handler.Suspense,\n Parallel: () => Handler.Parallel,\n Sequential: () => Handler.Sequential,\n LocalRetry: (attempts: number, delay: number) =>\n Handler.LocalRetry(attempts, delay),\n LocalTimeout: (ms: number) => Handler.LocalTimeout(ms),\n ClaimTimeout: (ms: number) => Handler.ClaimTimeout(ms),\n Delay: (ms: number) => Handler.Delay(ms),\n SkipAfter: (ms: number) => Handler.SkipAfter(ms),\n IsolateAfter: (ms: number) => Handler.IsolateAfter(ms),\n};\n\nexport const runtimeTrace = {\n entries: [] as Array<{ id: string; phase: \"start\" | \"finish\"; t: number }>,\n reset() {\n this.entries.length = 0;\n },\n};\n\ntype TraitCtor = any;\n\nfunction compose(...t: TraitCtor[]) {\n return t;\n}\n\ntype HandlerRecipe = {\n chain: TraitCtor[];\n lock: (e: any) => Lock;\n};\n\nexport function cashflowDefaults() {\n return {\n override(overrides: Partial<Record<string, HandlerRecipe>>) {\n return { overrides };\n },\n toHandlers() {\n return {} as any;\n },\n };\n}\n\nfunction makeOnOpened(\n store: CashflowDocStore,\n trx: FirestoreTransactionPerformer,\n recipe: HandlerRecipe,\n) {\n const Derived = Derive(\n Handler.Base,\n Handler.WithProps<{ store: CashflowDocStore }>(),\n Handler.OnProcessed,\n ...recipe.chain,\n );\n class Impl extends Derived {\n locks(e: InstanceType<typeof AccountOpened>) {\n return locks.wholeAccount(e);\n }\n async handleOne(e: InstanceType<typeof AccountOpened>) {\n runtimeTrace.entries.push({\n id: e.id.serialize(),\n phase: \"start\",\n t: Date.now(),\n });\n await this.props.store.init(e.payload.accountId, e);\n runtimeTrace.entries.push({\n id: e.id.serialize(),\n phase: \"finish\",\n t: Date.now(),\n });\n }\n }\n return new Impl({ store, transaction: trx }) as any;\n}\n\nfunction makeOnFlow(\n store: CashflowDocStore,\n trx: FirestoreTransactionPerformer,\n recipe: HandlerRecipe,\n) {\n const Derived = Derive(\n Handler.Base,\n Handler.WithProps<{ store: CashflowDocStore }>(),\n Handler.OnProcessed,\n ...recipe.chain,\n );\n class Impl extends Derived {\n locks(e: InstanceType<typeof Deposited> | InstanceType<typeof Withdrawn>) {\n return recipe.lock(e);\n }\n async handleOne(\n e: InstanceType<typeof Deposited> | InstanceType<typeof Withdrawn>,\n ) {\n await this.props.store.increment(\n e.payload.accountId,\n e.payload.amount,\n e,\n );\n }\n async process(events: any[], context: any) {\n for (const e of events)\n runtimeTrace.entries.push({\n id: e.id.serialize(),\n phase: \"start\",\n t: Date.now(),\n });\n const res = await super.process(events as any, context as any);\n for (const e of events)\n runtimeTrace.entries.push({\n id: e.id.serialize(),\n phase: \"finish\",\n t: Date.now(),\n });\n return res as any;\n }\n }\n return new Impl({ store, transaction: trx }) as any;\n}\n\nfunction makeOnRenamed(\n store: CashflowDocStore,\n trx: FirestoreTransactionPerformer,\n recipe: HandlerRecipe,\n) {\n const Derived = Derive(\n Handler.Base,\n Handler.WithProps<{ store: CashflowDocStore }>(),\n Handler.OnProcessed,\n ...recipe.chain,\n );\n class Impl extends Derived {\n locks(e: InstanceType<typeof AccountRenamed>) {\n return recipe.lock(e);\n }\n async handleLast(e: InstanceType<typeof AccountRenamed>) {\n await this.props.store.rename(e.payload.accountId, e.payload.newName, e);\n }\n async process(events: any[], context: any) {\n for (const e of events)\n runtimeTrace.entries.push({\n id: e.id.serialize(),\n phase: \"start\",\n t: Date.now(),\n });\n const res = await super.process(events as any, context as any);\n for (const e of events)\n runtimeTrace.entries.push({\n id: e.id.serialize(),\n phase: \"finish\",\n t: Date.now(),\n });\n return res as any;\n }\n }\n return new Impl({ store, transaction: trx }) as any;\n}\n\nclass CashflowDocStore extends FirestoreStore<Cashflow> {\n constructor(db: Firestore, collName: string) {\n super(\n db.collection(collName),\n new ProjectorTesting.CashflowSerializer(),\n \"Cashflow\",\n );\n }\n async init(\n accountId: any,\n event?: { id: { serialize(): string } },\n context = ProjectionContext.get<{ trx: FirestoreTransaction }>(),\n ) {\n await context.trx?.transaction.create(\n this.collection.doc(accountId.serialize()),\n {\n id: accountId.serialize(),\n flow: 0,\n name: accountId.serialize(),\n all_names: [],\n ops_trace: event ? [event.id.serialize()] : [],\n version: 1,\n } as any,\n );\n }\n async increment(\n accountId: any,\n amount: number,\n event?: { id: { serialize(): string } },\n context = ProjectionContext.get<{ trx: FirestoreTransaction }>(),\n ) {\n await context.trx?.transaction.update(\n this.collection.doc(accountId.serialize()),\n {\n flow: FieldValue.increment(amount),\n ops_trace: event\n ? FieldValue.arrayUnion(event.id.serialize())\n : FieldValue.arrayUnion(),\n } as any,\n );\n }\n async rename(\n accountId: any,\n newName: string,\n event?: { id: { serialize(): string } },\n context = ProjectionContext.get<{ trx: FirestoreTransaction }>(),\n ) {\n await context.trx?.transaction.update(\n this.collection.doc(accountId.serialize()),\n {\n name: newName,\n all_names: FieldValue.arrayUnion(newName),\n ops_trace: event\n ? FieldValue.arrayUnion(event.id.serialize())\n : FieldValue.arrayUnion(),\n } as any,\n );\n }\n}\n\nclass AccountStore extends MakeFirestoreEventStreamAggregateStore(Account) {\n constructor(firestore: Firestore) {\n super(firestore, Registry);\n }\n}\n\nclass CashflowCaseProjection extends ESProjection<any, any> {\n source = new ProjectedStream({\n sources: [\n new StreamSource({\n aggregateType: Account.name,\n shardKey: \"accountId\",\n events: [\n AccountOpened.name,\n Deposited.name,\n Withdrawn.name,\n AccountRenamed.name,\n ],\n }),\n ],\n });\n\n constructor(\n public readonly trx: FirestoreTransactionPerformer,\n public readonly store: CashflowDocStore,\n recipes: {\n Deposited: HandlerRecipe;\n Withdrawn: HandlerRecipe;\n AccountRenamed: HandlerRecipe;\n AccountOpened: HandlerRecipe;\n },\n ) {\n super();\n this.registerHandler(\n AccountOpened,\n makeOnOpened(store, trx, recipes.AccountOpened) as any,\n );\n this.registerHandler(\n Deposited,\n makeOnFlow(store, trx, recipes.Deposited) as any,\n );\n this.registerHandler(\n Withdrawn,\n makeOnFlow(store, trx, recipes.Withdrawn) as any,\n );\n this.registerHandler(\n AccountRenamed,\n makeOnRenamed(store, trx, recipes.AccountRenamed) as any,\n );\n }\n\n getSource() {\n return this.source;\n }\n getCheckpointId(e: any) {\n return CheckpointId.from(\"Cashflow\", e.payload.accountId);\n }\n\n get testhandlers() {\n return this.handlers as any;\n }\n}\n\nexport function caseFixture(\n caseName: string,\n opts: {\n handlers?: {\n Deposited?: HandlerRecipe;\n Withdrawn?: HandlerRecipe;\n AccountRenamed?: HandlerRecipe;\n AccountOpened?: HandlerRecipe;\n };\n projector?: {\n unclaimOnFailure?: boolean;\n retry?: {\n attempts: number;\n minDelay: number;\n maxDelay: number;\n backoff?: number;\n };\n enqueue?: { batchSize: number };\n };\n } = {},\n) {\n const app = fb.apps.length\n ? fb.app()\n : fb.initializeApp({ projectId: \"demo-es\" });\n const db = app.firestore();\n const defaultFlow: HandlerRecipe = {\n chain: compose(\n traits.Context(),\n traits.Transaction(),\n traits.Suspense(),\n traits.LocalTimeout(200),\n traits.LocalRetry(2, 10),\n traits.ClaimTimeout(2000),\n traits.Parallel(),\n ),\n lock: locks.accountAndEventId,\n };\n const defaultRename: HandlerRecipe = {\n chain: compose(\n traits.Context(),\n traits.Transaction(),\n traits.Suspense(),\n traits.LocalTimeout(2000),\n Handler.BatchLast,\n ),\n lock: locks.rename,\n } as any;\n\n const defaultOpened: HandlerRecipe = {\n chain: compose(\n traits.Context(),\n traits.Transaction(),\n traits.Suspense(),\n traits.Parallel(),\n ),\n lock: locks.wholeAccount,\n } as any;\n\n const recipes = {\n Deposited: opts.handlers?.Deposited || defaultFlow,\n Withdrawn: opts.handlers?.Withdrawn || defaultFlow,\n AccountRenamed: opts.handlers?.AccountRenamed || defaultRename,\n AccountOpened: opts.handlers?.AccountOpened || defaultOpened,\n } as const;\n\n return {\n name: caseName,\n describe: (fn: () => any) => describe(caseName, fn),\n async setup() {\n runtimeTrace.reset();\n const accountStore = new AccountStore(db);\n const cashflowStore = new CashflowDocStore(\n db as any,\n `Cashflow_${caseName}`,\n );\n // Cleanup any leftover docs from previous runs for determinism\n const existing = await (cashflowStore as any).collection.get();\n if (!existing.empty) {\n const batch = db.batch();\n for (const d of existing.docs as any) {\n batch.delete(d.ref);\n }\n await batch.commit();\n }\n const trx = new FirestoreTransactionPerformer(db);\n const projection = new CashflowCaseProjection(\n trx,\n cashflowStore,\n recipes as any,\n );\n const reader = new FirestoreProjectedStreamReader<any>(db, Registry);\n const queueStore = new FirestoreQueueStore(db);\n const projector = new FirestoreProjector(\n projection as any,\n reader,\n queueStore,\n {\n onEnqueueError: console.log,\n onProcessError: console.error,\n retry: {\n attempts: opts.projector?.retry?.attempts || 10,\n minDelay: opts.projector?.retry?.minDelay || 100,\n maxDelay: opts.projector?.retry?.maxDelay || 100,\n backoff: opts.projector?.retry?.backoff || 1,\n },\n enqueue: opts.projector?.enqueue || { batchSize: 50 },\n },\n );\n projector._unclaim =\n opts.projector?.unclaimOnFailure === false ? false : projector._unclaim;\n\n const events = {\n open: (name: string) => Account.open(name),\n };\n\n const act = {\n save: (account: any) => accountStore.save(account),\n handle: (event: any) => projector.handle(event),\n };\n\n const control = {\n markFailing: (event: any) =>\n projection.testhandlers[event.name].markFailing(event),\n suspend: (event: any) =>\n projection.testhandlers[event.name].suspend(event),\n wait: (ms: number) => new Promise((r) => setTimeout(r, ms)),\n };\n\n const assert = {\n cashflow: (id: any) => ({\n async toHave(partial: any) {\n const doc = await cashflowStore.load(id);\n expect(doc).toMatchObject(partial);\n },\n async toNotExist() {\n const doc = await cashflowStore.load(id);\n expect(doc).toBeUndefined();\n },\n }),\n async fetch(id: any) {\n return cashflowStore.load(id);\n },\n };\n\n return {\n db,\n accountStore,\n cashflowStore,\n projection,\n reader,\n queueStore,\n projector,\n trace: runtimeTrace,\n events,\n act,\n control,\n assert,\n } as const;\n },\n };\n}\n"]}
@@ -1,77 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.AccountStore = exports.registry = void 0;
37
- exports.getDb = getDb;
38
- exports.makeProjector = makeProjector;
39
- exports.makeTransaction = makeTransaction;
40
- process.env.FIRESTORE_EMULATOR_HOST = "localhost:8080";
41
- const fb = __importStar(require("firebase-admin"));
42
- const firestore_projector_1 = require("./firestore.projector");
43
- const firestore_projected_stream_reader_1 = require("../firestore.projected-stream.reader");
44
- const firestore_event_stream_aggregate_store_1 = require("../firestore.event-stream.aggregate-store");
45
- const core_1 = require("@ddd-ts/core");
46
- const store_firestore_1 = require("@ddd-ts/store-firestore");
47
- // Common registry for account events used across tests
48
- exports.registry = core_1.ProjectorTesting.Registry;
49
- function getDb(projectId = "demo-es") {
50
- const app = fb.apps.length ? fb.app() : fb.initializeApp({ projectId });
51
- return { app, db: app.firestore() };
52
- }
53
- // Account event store helper (used by most projector tests)
54
- class AccountStore extends (0, firestore_event_stream_aggregate_store_1.MakeFirestoreEventStreamAggregateStore)(core_1.ProjectorTesting.Account) {
55
- constructor(firestore, eventBus) {
56
- super(firestore, exports.registry, eventBus);
57
- }
58
- }
59
- exports.AccountStore = AccountStore;
60
- // Minimal projector wiring util
61
- function makeProjector(params) {
62
- const { db, projection } = params;
63
- const reader = new firestore_projected_stream_reader_1.FirestoreProjectedStreamReader(db, exports.registry);
64
- const queueStore = new firestore_projector_1.FirestoreQueueStore(db);
65
- const projector = new firestore_projector_1.FirestoreProjector(projection, reader, queueStore, {
66
- onEnqueueError: console.log,
67
- onProcessError: console.error,
68
- retry: { attempts: 40, minDelay: 100, maxDelay: 1000, backoff: 1.5 },
69
- enqueue: { batchSize: 50 },
70
- });
71
- return { reader, queueStore, projector };
72
- }
73
- // Firestore transaction performer (commonly passed to handlers)
74
- function makeTransaction(db) {
75
- return new store_firestore_1.FirestoreTransactionPerformer(db);
76
- }
77
- //# sourceMappingURL=testkit.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"testkit.js","sourceRoot":"","sources":["../../src/projection/testkit.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiBA,sBAGC;AAYD,sCAeC;AAGD,0CAEC;AApDD,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,gBAAgB,CAAC;AACvD,mDAAqC;AAErC,+DAAgF;AAChF,4FAAsF;AACtF,sGAAmG;AACnG,uCAA2D;AAC3D,6DAAwE;AAExE,uDAAuD;AAC1C,QAAA,QAAQ,GAAG,uBAAgB,CAAC,QAAQ,CAAC;AAOlD,SAAgB,KAAK,CAAC,SAAS,GAAG,SAAS;IACzC,MAAM,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IACxE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC;AACtC,CAAC;AAED,4DAA4D;AAC5D,MAAa,YAAa,SAAQ,IAAA,+EAAsC,EACtE,uBAAgB,CAAC,OAAO,CACzB;IACC,YAAY,SAAoB,EAAE,QAAoB;QACpD,KAAK,CAAC,SAAS,EAAE,gBAAQ,EAAE,QAAQ,CAAC,CAAC;IACvC,CAAC;CACF;AAND,oCAMC;AAED,gCAAgC;AAChC,SAAgB,aAAa,CAAC,MAG7B;IACC,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;IAClC,MAAM,MAAM,GAAG,IAAI,kEAA8B,CAAM,EAAE,EAAE,gBAAQ,CAAC,CAAC;IACrE,MAAM,UAAU,GAAG,IAAI,yCAAmB,CAAC,EAAE,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,IAAI,wCAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE;QACvE,cAAc,EAAE,OAAO,CAAC,GAAG;QAC3B,cAAc,EAAE,OAAO,CAAC,KAAK;QAC7B,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE;QACpE,OAAO,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;KAC3B,CAAC,CAAC;IAEH,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;AAC3C,CAAC;AAED,gEAAgE;AAChE,SAAgB,eAAe,CAAC,EAAa;IAC3C,OAAO,IAAI,+CAA6B,CAAC,EAAE,CAAC,CAAC;AAC/C,CAAC","sourcesContent":["process.env.FIRESTORE_EMULATOR_HOST = \"localhost:8080\";\nimport * as fb from \"firebase-admin\";\nimport type { Firestore } from \"firebase-admin/firestore\";\nimport { FirestoreProjector, FirestoreQueueStore } from \"./firestore.projector\";\nimport { FirestoreProjectedStreamReader } from \"../firestore.projected-stream.reader\";\nimport { MakeFirestoreEventStreamAggregateStore } from \"../firestore.event-stream.aggregate-store\";\nimport { IEventBus, ProjectorTesting } from \"@ddd-ts/core\";\nimport { FirestoreTransactionPerformer } from \"@ddd-ts/store-firestore\";\n\n// Common registry for account events used across tests\nexport const registry = ProjectorTesting.Registry;\n\nexport type DbHandle = {\n app: fb.app.App;\n db: Firestore;\n};\n\nexport function getDb(projectId = \"demo-es\"): DbHandle {\n const app = fb.apps.length ? fb.app() : fb.initializeApp({ projectId });\n return { app, db: app.firestore() };\n}\n\n// Account event store helper (used by most projector tests)\nexport class AccountStore extends MakeFirestoreEventStreamAggregateStore(\n ProjectorTesting.Account,\n) {\n constructor(firestore: Firestore, eventBus?: IEventBus) {\n super(firestore, registry, eventBus);\n }\n}\n\n// Minimal projector wiring util\nexport function makeProjector(params: {\n db: Firestore;\n projection: any; // ESProjection<IEsEvent>\n}) {\n const { db, projection } = params;\n const reader = new FirestoreProjectedStreamReader<any>(db, registry);\n const queueStore = new FirestoreQueueStore(db);\n const projector = new FirestoreProjector(projection, reader, queueStore, {\n onEnqueueError: console.log,\n onProcessError: console.error,\n retry: { attempts: 40, minDelay: 100, maxDelay: 1000, backoff: 1.5 },\n enqueue: { batchSize: 50 },\n });\n\n return { reader, queueStore, projector };\n}\n\n// Firestore transaction performer (commonly passed to handlers)\nexport function makeTransaction(db: Firestore) {\n return new FirestoreTransactionPerformer(db);\n}\n"]}
@@ -1,35 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Trace = Trace;
4
- const api_1 = require("@opentelemetry/api");
5
- function Trace(spanName, attributes) {
6
- return (_target, _propertyKey, descriptor) => {
7
- const originalMethod = descriptor.value;
8
- descriptor.value = async function (...args) {
9
- const tracer = api_1.trace.getTracer("projector", "1.0.0");
10
- return tracer.startActiveSpan(spanName, async (span) => {
11
- try {
12
- if (attributes) {
13
- span.setAttributes(attributes(this, ...args));
14
- }
15
- const result = await originalMethod.apply(this, args);
16
- span.setStatus({ code: api_1.SpanStatusCode.OK });
17
- return result;
18
- }
19
- catch (error) {
20
- span.recordException(error);
21
- span.setStatus({
22
- code: api_1.SpanStatusCode.ERROR,
23
- message: error.message,
24
- });
25
- throw error;
26
- }
27
- finally {
28
- span.end();
29
- }
30
- });
31
- };
32
- return descriptor;
33
- };
34
- }
35
- //# sourceMappingURL=trace.decorator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"trace.decorator.js","sourceRoot":"","sources":["../../src/projection/trace.decorator.ts"],"names":[],"mappings":";;AAEA,sBAsCC;AAxCD,4CAA2D;AAE3D,SAAgB,KAAK,CACnB,QAAgB,EAChB,UAAwE;IAExE,OAAO,CACL,OAAU,EACV,YAAoB,EACpB,UAAuC,EACvC,EAAE;QACF,MAAM,cAAc,GAAG,UAAU,CAAC,KAAK,CAAC;QAEvC,UAAkB,CAAC,KAAK,GAAG,KAAK,WAAW,GAAG,IAAoB;YACjE,MAAM,MAAM,GAAG,WAAK,CAAC,SAAS,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAErD,OAAO,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gBACrD,IAAI,CAAC;oBACH,IAAI,UAAU,EAAE,CAAC;wBACf,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;oBAChD,CAAC;oBAED,MAAM,MAAM,GAAG,MAAO,cAAsB,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;oBAC/D,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,oBAAc,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC5C,OAAO,MAAM,CAAC;gBAChB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,eAAe,CAAC,KAAc,CAAC,CAAC;oBACrC,IAAI,CAAC,SAAS,CAAC;wBACb,IAAI,EAAE,oBAAc,CAAC,KAAK;wBAC1B,OAAO,EAAG,KAAe,CAAC,OAAO;qBAClC,CAAC,CAAC;oBACH,MAAM,KAAK,CAAC;gBACd,CAAC;wBAAS,CAAC;oBACT,IAAI,CAAC,GAAG,EAAE,CAAC;gBACb,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,OAAO,UAAU,CAAC;IACpB,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import { trace, SpanStatusCode } from \"@opentelemetry/api\";\n\nexport function Trace<U, const Fn extends (...args: any[]) => Promise<any>>(\n spanName: string,\n attributes?: (target: U, ...args: Parameters<Fn>) => Record<string, any>,\n) {\n return (\n _target: U,\n _propertyKey: string,\n descriptor: TypedPropertyDescriptor<Fn>,\n ) => {\n const originalMethod = descriptor.value;\n\n (descriptor as any).value = async function (...args: Parameters<Fn>) {\n const tracer = trace.getTracer(\"projector\", \"1.0.0\");\n\n return tracer.startActiveSpan(spanName, async (span) => {\n try {\n if (attributes) {\n span.setAttributes(attributes(this, ...args));\n }\n\n const result = await (originalMethod as any).apply(this, args);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: (error as Error).message,\n });\n throw error;\n } finally {\n span.end();\n }\n });\n };\n\n return descriptor;\n };\n}\n"]}