@matter/general 0.12.4-alpha.0-20250211-56b2c53a0 → 0.12.4-alpha.0-20250213-1187f81eb

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 (138) hide show
  1. package/dist/cjs/MatterError.d.ts +12 -0
  2. package/dist/cjs/MatterError.d.ts.map +1 -1
  3. package/dist/cjs/MatterError.js +12 -0
  4. package/dist/cjs/MatterError.js.map +1 -1
  5. package/dist/cjs/index.d.ts +1 -0
  6. package/dist/cjs/index.d.ts.map +1 -1
  7. package/dist/cjs/index.js +1 -0
  8. package/dist/cjs/index.js.map +1 -1
  9. package/dist/cjs/log/Logger.d.ts.map +1 -1
  10. package/dist/cjs/log/Logger.js +2 -0
  11. package/dist/cjs/log/Logger.js.map +1 -1
  12. package/dist/cjs/time/Time.d.ts +1 -1
  13. package/dist/cjs/time/Time.d.ts.map +1 -1
  14. package/dist/cjs/time/Time.js +2 -2
  15. package/dist/cjs/time/Time.js.map +1 -1
  16. package/dist/cjs/transaction/Participant.d.ts +47 -0
  17. package/dist/cjs/transaction/Participant.d.ts.map +1 -0
  18. package/dist/cjs/transaction/Participant.js +22 -0
  19. package/dist/cjs/transaction/Participant.js.map +6 -0
  20. package/dist/cjs/transaction/Resource.d.ts +29 -0
  21. package/dist/cjs/transaction/Resource.d.ts.map +1 -0
  22. package/dist/cjs/transaction/Resource.js +40 -0
  23. package/dist/cjs/transaction/Resource.js.map +6 -0
  24. package/dist/cjs/transaction/ResourceSet.d.ts +36 -0
  25. package/dist/cjs/transaction/ResourceSet.d.ts.map +1 -0
  26. package/dist/cjs/transaction/ResourceSet.js +155 -0
  27. package/dist/cjs/transaction/ResourceSet.js.map +6 -0
  28. package/dist/cjs/transaction/Status.d.ts +49 -0
  29. package/dist/cjs/transaction/Status.d.ts.map +1 -0
  30. package/dist/cjs/transaction/Status.js +55 -0
  31. package/dist/cjs/transaction/Status.js.map +6 -0
  32. package/dist/cjs/transaction/Transaction.d.ts +197 -0
  33. package/dist/cjs/transaction/Transaction.d.ts.map +1 -0
  34. package/dist/cjs/transaction/Transaction.js +50 -0
  35. package/dist/cjs/transaction/Transaction.js.map +6 -0
  36. package/dist/cjs/transaction/Tx.d.ts +47 -0
  37. package/dist/cjs/transaction/Tx.d.ts.map +1 -0
  38. package/dist/cjs/transaction/Tx.js +586 -0
  39. package/dist/cjs/transaction/Tx.js.map +6 -0
  40. package/dist/cjs/transaction/errors.d.ts +52 -0
  41. package/dist/cjs/transaction/errors.d.ts.map +1 -0
  42. package/dist/cjs/transaction/errors.js +47 -0
  43. package/dist/cjs/transaction/errors.js.map +6 -0
  44. package/dist/cjs/transaction/index.d.ts +8 -0
  45. package/dist/cjs/transaction/index.d.ts.map +1 -0
  46. package/dist/cjs/transaction/index.js +25 -0
  47. package/dist/cjs/transaction/index.js.map +6 -0
  48. package/dist/cjs/util/Cancelable.d.ts +101 -0
  49. package/dist/cjs/util/Cancelable.d.ts.map +1 -0
  50. package/dist/cjs/util/Cancelable.js +279 -0
  51. package/dist/cjs/util/Cancelable.js.map +6 -0
  52. package/dist/cjs/util/Observable.js +1 -1
  53. package/dist/cjs/util/Observable.js.map +1 -1
  54. package/dist/cjs/util/Promises.d.ts +0 -15
  55. package/dist/cjs/util/Promises.d.ts.map +1 -1
  56. package/dist/cjs/util/Promises.js +0 -33
  57. package/dist/cjs/util/Promises.js.map +1 -1
  58. package/dist/cjs/util/index.d.ts +1 -0
  59. package/dist/cjs/util/index.d.ts.map +1 -1
  60. package/dist/cjs/util/index.js +1 -0
  61. package/dist/cjs/util/index.js.map +1 -1
  62. package/dist/esm/MatterError.d.ts +12 -0
  63. package/dist/esm/MatterError.d.ts.map +1 -1
  64. package/dist/esm/MatterError.js +12 -0
  65. package/dist/esm/MatterError.js.map +1 -1
  66. package/dist/esm/index.d.ts +1 -0
  67. package/dist/esm/index.d.ts.map +1 -1
  68. package/dist/esm/index.js +1 -0
  69. package/dist/esm/index.js.map +1 -1
  70. package/dist/esm/log/Logger.d.ts.map +1 -1
  71. package/dist/esm/log/Logger.js +2 -0
  72. package/dist/esm/log/Logger.js.map +1 -1
  73. package/dist/esm/time/Time.d.ts +1 -1
  74. package/dist/esm/time/Time.d.ts.map +1 -1
  75. package/dist/esm/time/Time.js +1 -1
  76. package/dist/esm/transaction/Participant.d.ts +47 -0
  77. package/dist/esm/transaction/Participant.d.ts.map +1 -0
  78. package/dist/esm/transaction/Participant.js +6 -0
  79. package/dist/esm/transaction/Participant.js.map +6 -0
  80. package/dist/esm/transaction/Resource.d.ts +29 -0
  81. package/dist/esm/transaction/Resource.d.ts.map +1 -0
  82. package/dist/esm/transaction/Resource.js +20 -0
  83. package/dist/esm/transaction/Resource.js.map +6 -0
  84. package/dist/esm/transaction/ResourceSet.d.ts +36 -0
  85. package/dist/esm/transaction/ResourceSet.d.ts.map +1 -0
  86. package/dist/esm/transaction/ResourceSet.js +135 -0
  87. package/dist/esm/transaction/ResourceSet.js.map +6 -0
  88. package/dist/esm/transaction/Status.d.ts +49 -0
  89. package/dist/esm/transaction/Status.d.ts.map +1 -0
  90. package/dist/esm/transaction/Status.js +35 -0
  91. package/dist/esm/transaction/Status.js.map +6 -0
  92. package/dist/esm/transaction/Transaction.d.ts +197 -0
  93. package/dist/esm/transaction/Transaction.d.ts.map +1 -0
  94. package/dist/esm/transaction/Transaction.js +30 -0
  95. package/dist/esm/transaction/Transaction.js.map +6 -0
  96. package/dist/esm/transaction/Tx.d.ts +47 -0
  97. package/dist/esm/transaction/Tx.d.ts.map +1 -0
  98. package/dist/esm/transaction/Tx.js +566 -0
  99. package/dist/esm/transaction/Tx.js.map +6 -0
  100. package/dist/esm/transaction/errors.d.ts +52 -0
  101. package/dist/esm/transaction/errors.d.ts.map +1 -0
  102. package/dist/esm/transaction/errors.js +27 -0
  103. package/dist/esm/transaction/errors.js.map +6 -0
  104. package/dist/esm/transaction/index.d.ts +8 -0
  105. package/dist/esm/transaction/index.d.ts.map +1 -0
  106. package/dist/esm/transaction/index.js +8 -0
  107. package/dist/esm/transaction/index.js.map +6 -0
  108. package/dist/esm/util/Cancelable.d.ts +101 -0
  109. package/dist/esm/util/Cancelable.d.ts.map +1 -0
  110. package/dist/esm/util/Cancelable.js +259 -0
  111. package/dist/esm/util/Cancelable.js.map +6 -0
  112. package/dist/esm/util/Observable.js +1 -1
  113. package/dist/esm/util/Observable.js.map +1 -1
  114. package/dist/esm/util/Promises.d.ts +0 -15
  115. package/dist/esm/util/Promises.d.ts.map +1 -1
  116. package/dist/esm/util/Promises.js +0 -33
  117. package/dist/esm/util/Promises.js.map +1 -1
  118. package/dist/esm/util/index.d.ts +1 -0
  119. package/dist/esm/util/index.d.ts.map +1 -1
  120. package/dist/esm/util/index.js +1 -0
  121. package/dist/esm/util/index.js.map +1 -1
  122. package/package.json +2 -2
  123. package/src/MatterError.ts +18 -0
  124. package/src/index.ts +1 -0
  125. package/src/log/Logger.ts +3 -0
  126. package/src/time/Time.ts +1 -1
  127. package/src/transaction/Participant.ts +54 -0
  128. package/src/transaction/Resource.ts +39 -0
  129. package/src/transaction/ResourceSet.ts +160 -0
  130. package/src/transaction/Status.ts +68 -0
  131. package/src/transaction/Transaction.ts +190 -0
  132. package/src/transaction/Tx.ts +734 -0
  133. package/src/transaction/errors.ts +53 -0
  134. package/src/transaction/index.ts +8 -0
  135. package/src/util/Cancelable.ts +380 -0
  136. package/src/util/Observable.ts +1 -1
  137. package/src/util/Promises.ts +0 -52
  138. package/src/util/index.ts +1 -0
@@ -0,0 +1,566 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2025 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { Diagnostic } from "#log/Diagnostic.js";
7
+ import { Logger } from "#log/Logger.js";
8
+ import { ImplementationError, ReadOnlyError } from "#MatterError.js";
9
+ import { Observable } from "#util/Observable.js";
10
+ import { MaybePromise } from "#util/Promises.js";
11
+ import { describeList } from "#util/String.js";
12
+ import { FinalizationError, TransactionDestroyedError, TransactionFlowError, UnsettledStateError } from "./errors.js";
13
+ import { ResourceSet } from "./ResourceSet.js";
14
+ import { Status } from "./Status.js";
15
+ import { Transaction } from "./Transaction.js";
16
+ const logger = Logger.get("Transaction");
17
+ const MAX_PRECOMMIT_CYCLES = 5;
18
+ const MAX_CHAINED_COMMITS = 5;
19
+ function act(via, actor) {
20
+ const tx = new Tx(via);
21
+ let commits = 0;
22
+ function commitTransaction(finalResult) {
23
+ commits++;
24
+ if (commits > MAX_CHAINED_COMMITS) {
25
+ throw new TransactionFlowError(
26
+ `Transaction commits have cascaded ${MAX_CHAINED_COMMITS} times which likely indicates an infinite loop`
27
+ );
28
+ }
29
+ const result = tx.commit();
30
+ if (MaybePromise.is(result)) {
31
+ return result.then(() => {
32
+ if (tx.status === Transaction.Status.Exclusive) {
33
+ return commitTransaction(finalResult);
34
+ }
35
+ return finalResult;
36
+ });
37
+ } else if (tx.status === Transaction.Status.Exclusive) {
38
+ return commitTransaction(finalResult);
39
+ }
40
+ return finalResult;
41
+ }
42
+ const handleTransactionError = (error) => {
43
+ if (commits) {
44
+ throw error;
45
+ }
46
+ logger.error("Rolling back", tx.via, "due to error:", Diagnostic.weak(error?.message || `${error}`));
47
+ try {
48
+ const result = tx.rollback();
49
+ if (MaybePromise.is(result)) {
50
+ return Promise.resolve(result).catch((error2) => {
51
+ if (error2 !== error) {
52
+ logger.error("Secondary error in", tx.via, "rollback:", error2);
53
+ }
54
+ throw error;
55
+ });
56
+ }
57
+ } catch (error2) {
58
+ if (error2 !== error) {
59
+ logger.error("Secondary error in", tx.via, "rollback:", error2);
60
+ }
61
+ }
62
+ throw error;
63
+ };
64
+ const closeTransaction = tx.close.bind(tx);
65
+ let isAsync = false;
66
+ try {
67
+ const actorResult = actor(tx);
68
+ if (MaybePromise.is(actorResult)) {
69
+ isAsync = tx.isAsync = true;
70
+ return Promise.resolve(actorResult).then(commitTransaction, handleTransactionError).finally(closeTransaction);
71
+ }
72
+ const commitResult = commitTransaction(actorResult);
73
+ if (MaybePromise.is(commitResult)) {
74
+ isAsync = true;
75
+ return Promise.resolve(commitResult).catch(handleTransactionError).finally(closeTransaction);
76
+ }
77
+ return commitResult;
78
+ } catch (e) {
79
+ const result = handleTransactionError(e);
80
+ isAsync = true;
81
+ return Promise.resolve(result).finally(closeTransaction);
82
+ } finally {
83
+ if (!isAsync) {
84
+ tx.close();
85
+ }
86
+ }
87
+ }
88
+ class Tx {
89
+ #participants = /* @__PURE__ */ new Set();
90
+ #roles = /* @__PURE__ */ new Map();
91
+ #resources = /* @__PURE__ */ new Set();
92
+ #status;
93
+ #waitingOn;
94
+ #via;
95
+ #shared;
96
+ #closed;
97
+ #isAsync = false;
98
+ constructor(via, readonly = false) {
99
+ this.#via = Diagnostic.via(via);
100
+ if (readonly) {
101
+ this.#status = Status.ReadOnly;
102
+ } else {
103
+ this.#status = Status.Shared;
104
+ }
105
+ }
106
+ close() {
107
+ this.#status = Status.Destroyed;
108
+ this.#resources.clear();
109
+ this.#roles.clear();
110
+ this.#participants.clear();
111
+ this.#closed?.emit();
112
+ }
113
+ get via() {
114
+ return this.#via;
115
+ }
116
+ get status() {
117
+ return this.#status;
118
+ }
119
+ get participants() {
120
+ return this.#participants;
121
+ }
122
+ get resources() {
123
+ return this.#resources;
124
+ }
125
+ get waitingOn() {
126
+ return this.#waitingOn;
127
+ }
128
+ get isAsync() {
129
+ return this.#isAsync;
130
+ }
131
+ set isAsync(isAsync) {
132
+ if (!this.#isAsync) {
133
+ this.#locksChanged(this.#resources);
134
+ }
135
+ this.#isAsync = isAsync;
136
+ }
137
+ onShared(listener, once) {
138
+ if (this.status === Status.ReadOnly) {
139
+ return;
140
+ }
141
+ if (this.#shared === void 0) {
142
+ this.#shared = Observable();
143
+ }
144
+ this.#shared[once ? "once" : "on"](listener);
145
+ }
146
+ onClose(listener) {
147
+ if (this.status === Status.ReadOnly) {
148
+ return;
149
+ }
150
+ if (this.status === Status.Destroyed) {
151
+ listener();
152
+ }
153
+ if (this.#closed === void 0) {
154
+ this.#closed = Observable();
155
+ }
156
+ this.#closed.once(listener);
157
+ }
158
+ async addResources(...resources) {
159
+ this.#assertAvailable();
160
+ if (this.#status === Status.Exclusive) {
161
+ const set = new ResourceSet(this, resources);
162
+ const locked = await set.acquireLocks();
163
+ this.#locksChanged(locked);
164
+ }
165
+ this.addResourcesSync(...resources);
166
+ }
167
+ addResourcesSync(...resources) {
168
+ this.#assertAvailable();
169
+ if (this.#status === Status.Exclusive) {
170
+ const set = new ResourceSet(this, resources);
171
+ const locked = set.acquireLocksSync();
172
+ this.#locksChanged(locked);
173
+ } else if (this.#status !== Status.Shared) {
174
+ throw new TransactionFlowError(`Cannot add resources to transaction that is ${this.status}`);
175
+ }
176
+ for (const resource of resources) {
177
+ this.#resources.add(resource);
178
+ }
179
+ }
180
+ async begin() {
181
+ this.#assertAvailable();
182
+ if (this.status === Status.Exclusive) {
183
+ return;
184
+ }
185
+ if (this.status !== Status.Shared) {
186
+ throw new TransactionFlowError(`Cannot begin write transaction because transaction is ${this.#status}`);
187
+ }
188
+ this.#status = Status.Waiting;
189
+ try {
190
+ const resources = new ResourceSet(this, this.#resources);
191
+ const locked = await resources.acquireLocks();
192
+ this.#locksChanged(locked);
193
+ this.#status = Status.Exclusive;
194
+ } catch (e) {
195
+ this.#status = Status.Shared;
196
+ throw e;
197
+ }
198
+ }
199
+ beginSync() {
200
+ this.#assertAvailable();
201
+ if (this.status === Status.Exclusive) {
202
+ return;
203
+ }
204
+ if (this.status !== Status.Shared) {
205
+ throw new TransactionFlowError(`Cannot begin write transaction because transaction is ${this.#status}`);
206
+ }
207
+ this.#status = Status.Exclusive;
208
+ try {
209
+ const resources = new ResourceSet(this, this.#resources);
210
+ const locked = resources.acquireLocksSync();
211
+ this.#locksChanged(locked);
212
+ } catch (e) {
213
+ this.#status = Status.Shared;
214
+ throw e;
215
+ }
216
+ }
217
+ addParticipants(...participants) {
218
+ this.#assertAvailable();
219
+ for (const participant of participants) {
220
+ if (this.#participants.has(participant)) {
221
+ continue;
222
+ }
223
+ if ([...this.#participants].findIndex((p) => p.toString() === participant.toString()) !== -1) {
224
+ throw new ImplementationError(`Participant ${participant} identity is not unique`);
225
+ }
226
+ this.#participants.add(participant);
227
+ if (participant.role !== void 0) {
228
+ if (this.#roles.has(participant.role)) {
229
+ throw new TransactionFlowError(`A participant is already registered for role ${participant.role}`);
230
+ }
231
+ this.#roles.set(participant.role, participant);
232
+ }
233
+ }
234
+ }
235
+ getParticipant(role) {
236
+ this.#assertAvailable();
237
+ return this.#roles.get(role);
238
+ }
239
+ commit() {
240
+ this.#assertAvailable();
241
+ if (this.#status === Status.Shared) {
242
+ return this.rollback();
243
+ }
244
+ const performCommit = () => {
245
+ const participants = [...this.#participants];
246
+ const result2 = this.#finalize(Status.CommittingPhaseOne, "committed", this.#executeCommit.bind(this));
247
+ if (MaybePromise.is(result2)) {
248
+ return result2.then(() => this.#executePostCommit(participants));
249
+ }
250
+ return this.#executePostCommit(participants);
251
+ };
252
+ const result = this.#executePreCommit();
253
+ if (MaybePromise.is(result)) {
254
+ return result.then(performCommit);
255
+ }
256
+ return performCommit();
257
+ }
258
+ rollback() {
259
+ this.#assertAvailable();
260
+ return this.#finalize(Status.RollingBack, "rolled back", () => this.#executeRollback());
261
+ }
262
+ waitFor(others) {
263
+ this.#assertAvailable();
264
+ if (this.waitingOn) {
265
+ throw new TransactionFlowError("Attempted wait on a transaction that is already waiting");
266
+ }
267
+ logger.debug("Tx", this.via, "waiting on", describeList("and", ...[...others].map((other) => other.via)));
268
+ this.#waitingOn = others;
269
+ return new Promise((resolve) => {
270
+ for (const other of others) {
271
+ other.onShared(() => {
272
+ others.delete(other);
273
+ if (!others.size) {
274
+ this.#waitingOn = void 0;
275
+ resolve();
276
+ }
277
+ }, true);
278
+ }
279
+ }).finally(() => this.#waitingOn = void 0);
280
+ }
281
+ toString() {
282
+ return `transaction<${this.via}>`;
283
+ }
284
+ /**
285
+ * Shared implementation for commit and rollback.
286
+ */
287
+ #finalize(status, why, finalizer) {
288
+ if (this.status !== Status.Shared && this.status !== Status.Exclusive) {
289
+ throw new TransactionFlowError(
290
+ `Illegal attempt to enter status ${status} when transaction is ${this.#status}`
291
+ );
292
+ }
293
+ const cleanup = () => {
294
+ const set = new ResourceSet(this, this.#resources);
295
+ const unlocked = set.releaseLocks();
296
+ this.#locksChanged(unlocked, `${why} and unlocked`);
297
+ this.#participants.clear();
298
+ this.#status = Status.Shared;
299
+ this.#shared?.emit();
300
+ };
301
+ let isAsync = false;
302
+ try {
303
+ this.#status = status;
304
+ const result = finalizer();
305
+ if (MaybePromise.is(result)) {
306
+ isAsync = true;
307
+ return Promise.resolve(result).finally(cleanup);
308
+ }
309
+ } finally {
310
+ if (!isAsync) {
311
+ cleanup();
312
+ }
313
+ }
314
+ }
315
+ /**
316
+ * Iteratively execute pre-commit until all participants "settle" and report no possible mutation.
317
+ */
318
+ #executePreCommit() {
319
+ let mayHaveMutated = false;
320
+ let abortedDueToError = false;
321
+ let iterator = this.participants[Symbol.iterator]();
322
+ let cycles = 1;
323
+ const errorRollback = (error) => {
324
+ logger.error(
325
+ "Rolling back",
326
+ this.via,
327
+ "due to pre-commit error:",
328
+ Diagnostic.weak(error?.message || `${error}`)
329
+ );
330
+ const result = this.#finalize(Status.RollingBack, "rolled back", () => this.#executeRollback());
331
+ if (MaybePromise.is(result)) {
332
+ return result.then(() => {
333
+ throw error;
334
+ });
335
+ }
336
+ throw error;
337
+ };
338
+ const nextCycle = () => {
339
+ cycles++;
340
+ if (cycles > MAX_PRECOMMIT_CYCLES) {
341
+ return errorRollback(
342
+ new UnsettledStateError(
343
+ `State has not settled after ${MAX_PRECOMMIT_CYCLES} pre-commit cycles which likely indicates an infinite loop`
344
+ )
345
+ );
346
+ }
347
+ mayHaveMutated = false;
348
+ iterator = this.participants[Symbol.iterator]();
349
+ };
350
+ const nextPreCommit = (previousResult) => {
351
+ if (abortedDueToError) {
352
+ return;
353
+ }
354
+ if (previousResult) {
355
+ mayHaveMutated = true;
356
+ }
357
+ while (true) {
358
+ const n = iterator.next();
359
+ if (n.done) {
360
+ if (mayHaveMutated) {
361
+ const result = nextCycle();
362
+ if (MaybePromise.is(result)) {
363
+ return result;
364
+ }
365
+ continue;
366
+ }
367
+ break;
368
+ }
369
+ const participant = n.value;
370
+ const handleError = (error) => {
371
+ abortedDueToError = true;
372
+ return errorRollback(error);
373
+ };
374
+ try {
375
+ const result = participant.preCommit?.();
376
+ if (MaybePromise.is(result)) {
377
+ return Promise.resolve(result).catch(handleError).then(nextPreCommit);
378
+ }
379
+ if (result) {
380
+ mayHaveMutated = true;
381
+ }
382
+ } catch (e) {
383
+ return handleError(e);
384
+ }
385
+ }
386
+ };
387
+ return nextPreCommit();
388
+ }
389
+ /**
390
+ * Commit logic passed to #finalize.
391
+ */
392
+ #executeCommit() {
393
+ const result = this.#executeCommit1();
394
+ if (MaybePromise.is(result)) {
395
+ return Promise.resolve(result).then(this.#executeCommit2.bind(this));
396
+ }
397
+ return this.#executeCommit2();
398
+ }
399
+ #executeCommit1() {
400
+ let needRollback = false;
401
+ let asyncCommits;
402
+ for (const participant of this.participants) {
403
+ const handleParticipantError = (error) => {
404
+ logger.error(`Error committing ${participant} (phase one):`, error);
405
+ needRollback = true;
406
+ };
407
+ try {
408
+ const result = participant.commit1();
409
+ if (MaybePromise.is(result)) {
410
+ if (!asyncCommits) {
411
+ asyncCommits = [];
412
+ }
413
+ asyncCommits.push(Promise.resolve(result).catch(handleParticipantError));
414
+ }
415
+ } catch (e) {
416
+ handleParticipantError(e);
417
+ break;
418
+ }
419
+ }
420
+ const abortIfFailed = () => {
421
+ if (needRollback) {
422
+ const result = this.#executeRollback();
423
+ if (MaybePromise.is(result)) {
424
+ return result.then(() => {
425
+ throw new FinalizationError("Rolled back due to commit phase one error");
426
+ });
427
+ }
428
+ throw new FinalizationError("Rolled back due to commit phase one error");
429
+ }
430
+ };
431
+ if (asyncCommits) {
432
+ return Promise.allSettled(asyncCommits).then(abortIfFailed);
433
+ }
434
+ return abortIfFailed();
435
+ }
436
+ #executeCommit2() {
437
+ this.#status = Status.CommittingPhaseTwo;
438
+ let errored;
439
+ let ongoing;
440
+ for (const participant of this.participants) {
441
+ const promise = MaybePromise.then(
442
+ () => participant.commit2(),
443
+ void 0,
444
+ (error) => {
445
+ logger.error(`Error committing (phase two) ${participant}, state inconsistency possible:`, error);
446
+ if (errored) {
447
+ errored.push(participant);
448
+ } else {
449
+ errored = [participant];
450
+ }
451
+ }
452
+ );
453
+ if (MaybePromise.is(promise)) {
454
+ if (ongoing) {
455
+ ongoing.push(promise);
456
+ } else {
457
+ ongoing = [promise];
458
+ }
459
+ }
460
+ }
461
+ if (ongoing) {
462
+ return Promise.allSettled(ongoing).then(() => throwIfErrored(errored, "in commit phase 2"));
463
+ } else {
464
+ throwIfErrored(errored, "in commit phase 2");
465
+ }
466
+ }
467
+ #executePostCommit(participants) {
468
+ const participantIterator = participants[Symbol.iterator]();
469
+ const postCommitNextParticipant = () => {
470
+ const next = participantIterator.next();
471
+ if (next.done) {
472
+ return;
473
+ }
474
+ const participant = next.value;
475
+ return MaybePromise.then(
476
+ () => participant.postCommit?.(),
477
+ () => postCommitNextParticipant(),
478
+ (error) => {
479
+ logger.error(`Error post-commit of ${participant}:`, error);
480
+ }
481
+ );
482
+ };
483
+ return postCommitNextParticipant();
484
+ }
485
+ /**
486
+ * Rollback logic passed to #finish.
487
+ */
488
+ #executeRollback() {
489
+ this.#status = Status.RollingBack;
490
+ let errored;
491
+ let ongoing;
492
+ for (const participant of this.participants) {
493
+ const promise = MaybePromise.then(
494
+ () => participant.rollback(),
495
+ void 0,
496
+ (error) => {
497
+ logger.error(`Error rolling back ${participant}, state inconsistency possible:`, error);
498
+ if (errored) {
499
+ errored.push(participant);
500
+ } else {
501
+ errored = [participant];
502
+ }
503
+ }
504
+ );
505
+ if (MaybePromise.is(promise)) {
506
+ if (ongoing) {
507
+ ongoing.push(promise);
508
+ } else {
509
+ ongoing = [promise];
510
+ }
511
+ }
512
+ }
513
+ const finished = () => {
514
+ this.#status = Status.Shared;
515
+ throwIfErrored(errored, "in commit phase 2");
516
+ };
517
+ if (ongoing) {
518
+ return Promise.allSettled(ongoing).then(finished);
519
+ } else {
520
+ finished();
521
+ }
522
+ }
523
+ #locksChanged(resources, how = "locked") {
524
+ if (!resources.size || !this.isAsync) {
525
+ return;
526
+ }
527
+ let resourceDescription;
528
+ if (how === "locked") {
529
+ resourceDescription = Diagnostic.strong(describeList("and", ...[...resources].map((r) => r.toString())));
530
+ } else {
531
+ resourceDescription = `${resources.size} resource${resources.size === 1 ? "" : "s"}`;
532
+ }
533
+ logger.debug(this.via, how, resourceDescription);
534
+ }
535
+ #assertAvailable() {
536
+ if (this.#status === Status.Destroyed) {
537
+ logger.warn(
538
+ "You have accessed transaction",
539
+ this.via,
540
+ "outside of the context in which it was active. Open a new context or ensure your operation completes before the context exits"
541
+ );
542
+ throw new TransactionDestroyedError(`Transaction ${this.#via} is destroyed`);
543
+ }
544
+ if (this.#status === Status.ReadOnly) {
545
+ throw new ReadOnlyError();
546
+ }
547
+ }
548
+ }
549
+ const ReadOnlyTransaction = new Tx("readonly", true);
550
+ function throwIfErrored(errored, when) {
551
+ if (!errored?.length) {
552
+ return;
553
+ }
554
+ const suffix = errored.length > 1 ? "s" : "";
555
+ throw new FinalizationError(
556
+ `Unhandled error${suffix} ${when} participant${suffix} ${describeList(
557
+ "and",
558
+ ...errored.map((p) => p.toString())
559
+ )}`
560
+ );
561
+ }
562
+ export {
563
+ ReadOnlyTransaction,
564
+ act
565
+ };
566
+ //# sourceMappingURL=Tx.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/transaction/Tx.ts"],
4
+ "mappings": "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",
5
+ "names": ["result"]
6
+ }
@@ -0,0 +1,52 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2025 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { MatterError } from "#MatterError.js";
7
+ /**
8
+ * Thrown when a {@link Transaction} operation cannot complete because the transaction has the wrong status.
9
+ */
10
+ export declare class TransactionFlowError extends MatterError {
11
+ }
12
+ /**
13
+ * Thrown if a {@link Transaction} attempts to lock a {@link Resource} synchronously but the resource is already locked.
14
+ *
15
+ * If you see this error you are probably modifying {@link Behavior} state. You can use
16
+ * {@link Transaction.addResources} and {@link Transaction.begin} to lock the behavior before performing your write.
17
+ */
18
+ export declare class SynchronousTransactionConflictError extends MatterError {
19
+ }
20
+ /**
21
+ * Thrown if a transaction attempts to obtain exclusivity in a manner that would lead to deadlock.
22
+ */
23
+ export declare class TransactionDeadlockError extends MatterError {
24
+ }
25
+ /**
26
+ * Thrown if an error occurs during commit or rollback.
27
+ */
28
+ export declare class FinalizationError extends MatterError {
29
+ }
30
+ /**
31
+ * Thrown if a {@link Transaction} is accessed after it has been destroyed.
32
+ *
33
+ * If you see this error, you have probably kept a reference to a contextual object its exited. You may need to create
34
+ * a new, independent transaction context.
35
+ *
36
+ * A possible cause of this error is forgetting to use await on an async function. The context will remain open so long
37
+ * as there is an unresolved {@link Promise} it can await.
38
+ */
39
+ export declare class TransactionDestroyedError extends MatterError {
40
+ }
41
+ /**
42
+ * Thrown if a {@link Transaction} cannot commit because state has mutated continuously for too many pre-commit cycles.
43
+ *
44
+ * "Pre-commit" is a commit event triggered by {@link Transaction} before stage 1 commit. During pre-commit listeners
45
+ * may mutate state. If state does change, the transaction re-runs pre-commit so all listeners see the same state.
46
+ *
47
+ * If state continues to mutate for too many of these cycles then the transaction will abort. This likely indicates a
48
+ * logic error that will result in an infinite loop.
49
+ */
50
+ export declare class UnsettledStateError extends FinalizationError {
51
+ }
52
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/transaction/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAG9C;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,WAAW;CAAG;AAExD;;;;;GAKG;AACH,qBAAa,mCAAoC,SAAQ,WAAW;CAAG;AAEvE;;GAEG;AACH,qBAAa,wBAAyB,SAAQ,WAAW;CAAG;AAE5D;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,WAAW;CAAG;AAErD;;;;;;;;GAQG;AACH,qBAAa,yBAA0B,SAAQ,WAAW;CAAG;AAE7D;;;;;;;;GAQG;AACH,qBAAa,mBAAoB,SAAQ,iBAAiB;CAAG"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2025 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { MatterError } from "#MatterError.js";
7
+ class TransactionFlowError extends MatterError {
8
+ }
9
+ class SynchronousTransactionConflictError extends MatterError {
10
+ }
11
+ class TransactionDeadlockError extends MatterError {
12
+ }
13
+ class FinalizationError extends MatterError {
14
+ }
15
+ class TransactionDestroyedError extends MatterError {
16
+ }
17
+ class UnsettledStateError extends FinalizationError {
18
+ }
19
+ export {
20
+ FinalizationError,
21
+ SynchronousTransactionConflictError,
22
+ TransactionDeadlockError,
23
+ TransactionDestroyedError,
24
+ TransactionFlowError,
25
+ UnsettledStateError
26
+ };
27
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/transaction/errors.ts"],
4
+ "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,mBAAmB;AAMrB,MAAM,6BAA6B,YAAY;AAAC;AAQhD,MAAM,4CAA4C,YAAY;AAAC;AAK/D,MAAM,iCAAiC,YAAY;AAAC;AAKpD,MAAM,0BAA0B,YAAY;AAAC;AAW7C,MAAM,kCAAkC,YAAY;AAAC;AAWrD,MAAM,4BAA4B,kBAAkB;AAAC;",
5
+ "names": []
6
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2025 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export * from "./errors.js";
7
+ export * from "./Transaction.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/transaction/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC"}