@enbox/browser 0.3.77 → 0.3.78

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.
@@ -53,7 +53,9 @@ const DEFAULT_ACK_TIMEOUT_MS = 5000;
53
53
  */
54
54
  export class WalletPostMessageTransport {
55
55
  constructor(params) {
56
+ this._closed = false;
56
57
  this._requestReceived = false;
58
+ this._requestSettled = false;
57
59
  this._dappOrigin = params.dappOrigin;
58
60
  this._dappWindow = params.dappWindow;
59
61
  this._recipientPrivateKey = params.recipientPrivateKey;
@@ -66,8 +68,7 @@ export class WalletPostMessageTransport {
66
68
  this._messageListener = (event) => { this.onMessage(event); };
67
69
  window.addEventListener('message', this._messageListener);
68
70
  this._timeoutId = setTimeout(() => {
69
- this.close();
70
- this._rejectRequest(new Error('[@enbox/browser] Timed out waiting for the connect request from the dapp.'));
71
+ this.settleRequest(new Error('[@enbox/browser] Timed out waiting for the connect request from the dapp.'));
71
72
  }, params.timeoutMs);
72
73
  }
73
74
  /**
@@ -97,12 +98,18 @@ export class WalletPostMessageTransport {
97
98
  recipientPrivateKey,
98
99
  timeoutMs: (_b = options.timeoutMs) !== null && _b !== void 0 ? _b : DEFAULT_REQUEST_TIMEOUT_MS,
99
100
  });
100
- // The listener is registered, so the beacon cannot race the request.
101
- dappWindow.postMessage({
102
- type: DWEB_CONNECT_LOADED_MESSAGE_TYPE,
103
- walletEpk,
104
- walletOrigin: globalThis.location.origin,
105
- }, dappOrigin);
101
+ try {
102
+ // The listener is registered, so the beacon cannot race the request.
103
+ dappWindow.postMessage({
104
+ type: DWEB_CONNECT_LOADED_MESSAGE_TYPE,
105
+ walletEpk,
106
+ walletOrigin: globalThis.location.origin,
107
+ }, dappOrigin);
108
+ }
109
+ catch (error) {
110
+ transport.close();
111
+ throw error;
112
+ }
106
113
  return transport;
107
114
  });
108
115
  }
@@ -130,11 +137,13 @@ export class WalletPostMessageTransport {
130
137
  * @param idToken - The sealed response JWE, or the literal deny token.
131
138
  */
132
139
  sendResponse(idToken) {
133
- this._dappWindow.postMessage({
134
- type: DWEB_CONNECT_RESPONSE_MESSAGE_TYPE,
135
- payload: idToken,
136
- }, this._dappOrigin);
137
- this.close();
140
+ this.assertOpen();
141
+ try {
142
+ this.postResponse(idToken);
143
+ }
144
+ finally {
145
+ this.close();
146
+ }
138
147
  }
139
148
  /**
140
149
  * Posts the sealed response JWE back to the dapp like
@@ -155,38 +164,59 @@ export class WalletPostMessageTransport {
155
164
  sendResponseAwaitingAck(idToken_1) {
156
165
  return __awaiter(this, arguments, void 0, function* (idToken, options = {}) {
157
166
  var _a;
167
+ this.assertOpen();
168
+ if (this._resolveAck !== undefined) {
169
+ throw new Error('[@enbox/browser] A connect response is already awaiting acknowledgement.');
170
+ }
158
171
  const ackPromise = new Promise((resolve) => {
159
172
  this._resolveAck = resolve;
160
173
  });
161
- this._dappWindow.postMessage({
162
- type: DWEB_CONNECT_RESPONSE_MESSAGE_TYPE,
163
- payload: idToken,
164
- }, this._dappOrigin);
165
- const ackTimeoutId = setTimeout(() => {
166
- var _a;
167
- (_a = this._resolveAck) === null || _a === void 0 ? void 0 : _a.call(this, false);
168
- }, (_a = options.timeoutMs) !== null && _a !== void 0 ? _a : DEFAULT_ACK_TIMEOUT_MS);
169
- const acked = yield ackPromise;
170
- clearTimeout(ackTimeoutId);
171
- this._resolveAck = undefined;
172
- this.close();
173
- return acked;
174
+ let ackTimeoutId;
175
+ try {
176
+ this.postResponse(idToken);
177
+ ackTimeoutId = setTimeout(() => {
178
+ var _a;
179
+ (_a = this._resolveAck) === null || _a === void 0 ? void 0 : _a.call(this, false);
180
+ }, (_a = options.timeoutMs) !== null && _a !== void 0 ? _a : DEFAULT_ACK_TIMEOUT_MS);
181
+ return yield ackPromise;
182
+ }
183
+ finally {
184
+ clearTimeout(ackTimeoutId);
185
+ this.close();
186
+ }
174
187
  });
175
188
  }
176
189
  /** Posts the deny token back to the dapp — the user rejected the request. */
177
190
  deny() {
178
191
  this.sendResponse(CONNECT_DENIED_TOKEN);
179
192
  }
180
- /** Stops listening and releases the session's timers. Idempotent. */
193
+ /**
194
+ * Stops listening and releases the session's timers. A request or response
195
+ * acknowledgement still pending at close is settled immediately. Idempotent.
196
+ */
181
197
  close() {
198
+ if (this._closed) {
199
+ return;
200
+ }
201
+ this._closed = true;
182
202
  clearTimeout(this._timeoutId);
183
203
  if (this._messageListener !== undefined) {
184
204
  window.removeEventListener('message', this._messageListener);
185
205
  this._messageListener = undefined;
186
206
  }
207
+ if (!this._requestSettled) {
208
+ this._requestSettled = true;
209
+ this._rejectRequest(new Error('[@enbox/browser] Wallet connect transport closed before receiving a request.'));
210
+ }
211
+ const resolveAck = this._resolveAck;
212
+ this._resolveAck = undefined;
213
+ resolveAck === null || resolveAck === void 0 ? void 0 : resolveAck(false);
187
214
  }
188
215
  onMessage(event) {
189
216
  var _a;
217
+ if (this._closed) {
218
+ return;
219
+ }
190
220
  const message = getTrustedMessage(event, this._dappOrigin, this._dappWindow);
191
221
  if (message === undefined) {
192
222
  return;
@@ -228,6 +258,10 @@ export class WalletPostMessageTransport {
228
258
  });
229
259
  }
230
260
  settleRequest(outcome) {
261
+ if (this._requestSettled) {
262
+ return;
263
+ }
264
+ this._requestSettled = true;
231
265
  clearTimeout(this._timeoutId);
232
266
  if (outcome instanceof Error) {
233
267
  this.close();
@@ -236,6 +270,17 @@ export class WalletPostMessageTransport {
236
270
  }
237
271
  this._resolveRequest(outcome);
238
272
  }
273
+ assertOpen() {
274
+ if (this._closed) {
275
+ throw new Error('[@enbox/browser] Wallet connect transport is closed.');
276
+ }
277
+ }
278
+ postResponse(idToken) {
279
+ this._dappWindow.postMessage({
280
+ type: DWEB_CONNECT_RESPONSE_MESSAGE_TYPE,
281
+ payload: idToken,
282
+ }, this._dappOrigin);
283
+ }
239
284
  }
240
285
  /**
241
286
  * Resolves the dapp origin to pin: the explicit option when provided,
@@ -1 +1 @@
1
- {"version":3,"file":"dweb-connect-wallet.js","sourceRoot":"","sources":["../../src/dweb-connect-wallet.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dweb-connect-wallet.js","sourceRoot":"","sources":["../../src/dweb-connect-wallet.ts"],"names":[],"mappings":"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"}
@@ -58,7 +58,9 @@ export declare class WalletPostMessageTransport {
58
58
  private readonly _dappOrigin;
59
59
  private readonly _dappWindow;
60
60
  private readonly _recipientPrivateKey;
61
+ private _closed;
61
62
  private _requestReceived;
63
+ private _requestSettled;
62
64
  private readonly _timeoutId?;
63
65
  private _messageListener?;
64
66
  private _resolveAck?;
@@ -114,10 +116,15 @@ export declare class WalletPostMessageTransport {
114
116
  }): Promise<boolean>;
115
117
  /** Posts the deny token back to the dapp — the user rejected the request. */
116
118
  deny(): void;
117
- /** Stops listening and releases the session's timers. Idempotent. */
119
+ /**
120
+ * Stops listening and releases the session's timers. A request or response
121
+ * acknowledgement still pending at close is settled immediately. Idempotent.
122
+ */
118
123
  close(): void;
119
124
  private onMessage;
120
125
  private openRequest;
121
126
  private settleRequest;
127
+ private assertOpen;
128
+ private postResponse;
122
129
  }
123
130
  //# sourceMappingURL=dweb-connect-wallet.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dweb-connect-wallet.d.ts","sourceRoot":"","sources":["../../src/dweb-connect-wallet.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAqBrD,iEAAiE;AACjE,MAAM,MAAM,iCAAiC,GAAG;IAC9C;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,qBAAa,0BAA0B;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAM;IAE3C,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAgC;IAC5D,OAAO,CAAC,gBAAgB,CAAC,CAAgC;IACzD,OAAO,CAAC,WAAW,CAAC,CAA2B;IAE/C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA0B;IAC1D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAoC;IACpE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAyB;IAExD,OAAO;IAqBP;;;;;;;OAOG;WACiB,MAAM,CAAC,OAAO,GAAE,iCAAsC,GAAG,OAAO,CAAC,0BAA0B,CAAC;IAgChH,4EAA4E;IAC5E,IAAW,UAAU,IAAI,MAAM,CAE9B;IAED;;;;;;OAMG;IACU,YAAY,IAAI,OAAO,CAAC,cAAc,CAAC;IAIpD;;;;;;OAMG;IACI,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAQ1C;;;;;;;;;;;;;;;OAeG;IACU,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAqB7G,6EAA6E;IACtE,IAAI,IAAI,IAAI;IAInB,qEAAqE;IAC9D,KAAK,IAAI,IAAI;IAQpB,OAAO,CAAC,SAAS;YAoBH,WAAW;IAsBzB,OAAO,CAAC,aAAa;CAStB"}
1
+ {"version":3,"file":"dweb-connect-wallet.d.ts","sourceRoot":"","sources":["../../src/dweb-connect-wallet.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAqBrD,iEAAiE;AACjE,MAAM,MAAM,iCAAiC,GAAG;IAC9C;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,qBAAa,0BAA0B;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAM;IAE3C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAgC;IAC5D,OAAO,CAAC,gBAAgB,CAAC,CAAgC;IACzD,OAAO,CAAC,WAAW,CAAC,CAA2B;IAE/C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA0B;IAC1D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAoC;IACpE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAyB;IAExD,OAAO;IAoBP;;;;;;;OAOG;WACiB,MAAM,CAAC,OAAO,GAAE,iCAAsC,GAAG,OAAO,CAAC,0BAA0B,CAAC;IAqChH,4EAA4E;IAC5E,IAAW,UAAU,IAAI,MAAM,CAE9B;IAED;;;;;;OAMG;IACU,YAAY,IAAI,OAAO,CAAC,cAAc,CAAC;IAIpD;;;;;;OAMG;IACI,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAS1C;;;;;;;;;;;;;;;OAeG;IACU,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAyB7G,6EAA6E;IACtE,IAAI,IAAI,IAAI;IAInB;;;OAGG;IACI,KAAK,IAAI,IAAI;IAkBpB,OAAO,CAAC,SAAS;YAqBH,WAAW;IAsBzB,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,YAAY;CAMrB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@enbox/browser",
3
- "version": "0.3.77",
3
+ "version": "0.3.78",
4
4
  "description": "Enbox tools and features to use in the browser",
5
5
  "type": "module",
6
6
  "main": "./dist/esm/index.js",
@@ -66,15 +66,15 @@
66
66
  "access": "public"
67
67
  },
68
68
  "dependencies": {
69
- "@enbox/agent": "0.8.46",
70
- "@enbox/api": "0.6.85",
71
- "@enbox/auth": "0.6.92",
72
- "@enbox/common": "0.1.7",
73
- "@enbox/connect": "0.1.22",
74
- "@enbox/crypto": "0.1.10",
75
- "@enbox/dids": "0.1.11",
76
- "@enbox/dwn-sdk-js": "0.4.26",
77
- "@enbox/protocols": "0.2.112"
69
+ "@enbox/agent": "0.8.47",
70
+ "@enbox/api": "0.6.86",
71
+ "@enbox/auth": "0.6.93",
72
+ "@enbox/common": "0.1.8",
73
+ "@enbox/connect": "0.1.23",
74
+ "@enbox/crypto": "0.1.11",
75
+ "@enbox/dids": "0.1.12",
76
+ "@enbox/dwn-sdk-js": "0.4.27",
77
+ "@enbox/protocols": "0.2.113"
78
78
  },
79
79
  "devDependencies": {
80
80
  "@types/qrcode": "^1.5.6",
@@ -83,7 +83,9 @@ export class WalletPostMessageTransport {
83
83
  private readonly _dappWindow: Window;
84
84
  private readonly _recipientPrivateKey: Jwk;
85
85
 
86
+ private _closed = false;
86
87
  private _requestReceived = false;
88
+ private _requestSettled = false;
87
89
  private readonly _timeoutId?: ReturnType<typeof setTimeout>;
88
90
  private _messageListener?: (event: MessageEvent) => void;
89
91
  private _resolveAck?: (acked: boolean) => void;
@@ -108,8 +110,7 @@ export class WalletPostMessageTransport {
108
110
  window.addEventListener('message', this._messageListener);
109
111
 
110
112
  this._timeoutId = setTimeout((): void => {
111
- this.close();
112
- this._rejectRequest(new Error('[@enbox/browser] Timed out waiting for the connect request from the dapp.'));
113
+ this.settleRequest(new Error('[@enbox/browser] Timed out waiting for the connect request from the dapp.'));
113
114
  }, params.timeoutMs);
114
115
  }
115
116
 
@@ -143,12 +144,17 @@ export class WalletPostMessageTransport {
143
144
  timeoutMs: options.timeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS,
144
145
  });
145
146
 
146
- // The listener is registered, so the beacon cannot race the request.
147
- dappWindow.postMessage({
148
- type : DWEB_CONNECT_LOADED_MESSAGE_TYPE,
149
- walletEpk,
150
- walletOrigin : globalThis.location.origin,
151
- }, dappOrigin);
147
+ try {
148
+ // The listener is registered, so the beacon cannot race the request.
149
+ dappWindow.postMessage({
150
+ type : DWEB_CONNECT_LOADED_MESSAGE_TYPE,
151
+ walletEpk,
152
+ walletOrigin : globalThis.location.origin,
153
+ }, dappOrigin);
154
+ } catch (error) {
155
+ transport.close();
156
+ throw error;
157
+ }
152
158
 
153
159
  return transport;
154
160
  }
@@ -177,11 +183,12 @@ export class WalletPostMessageTransport {
177
183
  * @param idToken - The sealed response JWE, or the literal deny token.
178
184
  */
179
185
  public sendResponse(idToken: string): void {
180
- this._dappWindow.postMessage({
181
- type : DWEB_CONNECT_RESPONSE_MESSAGE_TYPE,
182
- payload : idToken,
183
- }, this._dappOrigin);
184
- this.close();
186
+ this.assertOpen();
187
+ try {
188
+ this.postResponse(idToken);
189
+ } finally {
190
+ this.close();
191
+ }
185
192
  }
186
193
 
187
194
  /**
@@ -201,24 +208,28 @@ export class WalletPostMessageTransport {
201
208
  * @returns Whether the dapp acknowledged completion within the budget.
202
209
  */
203
210
  public async sendResponseAwaitingAck(idToken: string, options: { timeoutMs?: number } = {}): Promise<boolean> {
211
+ this.assertOpen();
212
+ if (this._resolveAck !== undefined) {
213
+ throw new Error('[@enbox/browser] A connect response is already awaiting acknowledgement.');
214
+ }
215
+
204
216
  const ackPromise = new Promise<boolean>((resolve): void => {
205
217
  this._resolveAck = resolve;
206
218
  });
207
219
 
208
- this._dappWindow.postMessage({
209
- type : DWEB_CONNECT_RESPONSE_MESSAGE_TYPE,
210
- payload : idToken,
211
- }, this._dappOrigin);
220
+ let ackTimeoutId: ReturnType<typeof setTimeout> | undefined;
221
+ try {
222
+ this.postResponse(idToken);
212
223
 
213
- const ackTimeoutId = setTimeout((): void => {
214
- this._resolveAck?.(false);
215
- }, options.timeoutMs ?? DEFAULT_ACK_TIMEOUT_MS);
224
+ ackTimeoutId = setTimeout((): void => {
225
+ this._resolveAck?.(false);
226
+ }, options.timeoutMs ?? DEFAULT_ACK_TIMEOUT_MS);
216
227
 
217
- const acked = await ackPromise;
218
- clearTimeout(ackTimeoutId);
219
- this._resolveAck = undefined;
220
- this.close();
221
- return acked;
228
+ return await ackPromise;
229
+ } finally {
230
+ clearTimeout(ackTimeoutId);
231
+ this.close();
232
+ }
222
233
  }
223
234
 
224
235
  /** Posts the deny token back to the dapp — the user rejected the request. */
@@ -226,16 +237,30 @@ export class WalletPostMessageTransport {
226
237
  this.sendResponse(CONNECT_DENIED_TOKEN);
227
238
  }
228
239
 
229
- /** Stops listening and releases the session's timers. Idempotent. */
240
+ /**
241
+ * Stops listening and releases the session's timers. A request or response
242
+ * acknowledgement still pending at close is settled immediately. Idempotent.
243
+ */
230
244
  public close(): void {
245
+ if (this._closed) { return; }
246
+ this._closed = true;
231
247
  clearTimeout(this._timeoutId);
232
248
  if (this._messageListener !== undefined) {
233
249
  window.removeEventListener('message', this._messageListener);
234
250
  this._messageListener = undefined;
235
251
  }
252
+
253
+ if (!this._requestSettled) {
254
+ this._requestSettled = true;
255
+ this._rejectRequest(new Error('[@enbox/browser] Wallet connect transport closed before receiving a request.'));
256
+ }
257
+ const resolveAck = this._resolveAck;
258
+ this._resolveAck = undefined;
259
+ resolveAck?.(false);
236
260
  }
237
261
 
238
262
  private onMessage(event: MessageEvent): void {
263
+ if (this._closed) { return; }
239
264
  const message = getTrustedMessage(event, this._dappOrigin, this._dappWindow);
240
265
  if (message === undefined) { return; }
241
266
 
@@ -278,6 +303,8 @@ export class WalletPostMessageTransport {
278
303
  }
279
304
 
280
305
  private settleRequest(outcome: ConnectRequest | Error): void {
306
+ if (this._requestSettled) { return; }
307
+ this._requestSettled = true;
281
308
  clearTimeout(this._timeoutId);
282
309
  if (outcome instanceof Error) {
283
310
  this.close();
@@ -286,6 +313,19 @@ export class WalletPostMessageTransport {
286
313
  }
287
314
  this._resolveRequest(outcome);
288
315
  }
316
+
317
+ private assertOpen(): void {
318
+ if (this._closed) {
319
+ throw new Error('[@enbox/browser] Wallet connect transport is closed.');
320
+ }
321
+ }
322
+
323
+ private postResponse(idToken: string): void {
324
+ this._dappWindow.postMessage({
325
+ type : DWEB_CONNECT_RESPONSE_MESSAGE_TYPE,
326
+ payload : idToken,
327
+ }, this._dappOrigin);
328
+ }
289
329
  }
290
330
 
291
331
  /**