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