@cartridge/controller 0.5.9 → 0.7.0

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 (102) hide show
  1. package/.turbo/turbo-build$colon$deps.log +53 -115
  2. package/.turbo/turbo-build.log +54 -116
  3. package/dist/controller.cjs +860 -0
  4. package/dist/controller.cjs.map +1 -0
  5. package/dist/controller.d.cts +33 -0
  6. package/dist/controller.d.ts +4 -4
  7. package/dist/controller.js +254 -170
  8. package/dist/controller.js.map +1 -1
  9. package/dist/index.cjs +2200 -0
  10. package/dist/index.cjs.map +1 -0
  11. package/dist/index.d.cts +17 -0
  12. package/dist/index.d.ts +12 -6
  13. package/dist/index.js +296 -7666
  14. package/dist/index.js.map +1 -1
  15. package/dist/lookup.cjs +59 -0
  16. package/dist/lookup.cjs.map +1 -0
  17. package/dist/lookup.d.cts +4 -0
  18. package/dist/lookup.js +7 -7
  19. package/dist/lookup.js.map +1 -1
  20. package/dist/node/index.cjs +726 -0
  21. package/dist/node/index.cjs.map +1 -0
  22. package/dist/node/index.d.cts +56 -0
  23. package/dist/node/index.d.ts +56 -0
  24. package/dist/{telegram/provider.js → node/index.js} +521 -216
  25. package/dist/node/index.js.map +1 -0
  26. package/dist/policies-DD1aPjQ4.d.cts +21 -0
  27. package/dist/policies-DD1aPjQ4.d.ts +21 -0
  28. package/dist/{types-CVnDQVqD.d.ts → provider-ap1C1ypF.d.cts} +27 -10
  29. package/dist/provider-ap1C1ypF.d.ts +201 -0
  30. package/dist/session/{provider.js → index.cjs} +342 -168
  31. package/dist/session/index.cjs.map +1 -0
  32. package/dist/session/index.d.cts +38 -0
  33. package/dist/session/index.d.ts +37 -7
  34. package/dist/session/index.js +309 -161
  35. package/dist/session/index.js.map +1 -1
  36. package/package.json +49 -16
  37. package/src/controller.ts +44 -15
  38. package/src/iframe/base.ts +1 -11
  39. package/src/mutex.ts +22 -0
  40. package/src/node/account.ts +72 -0
  41. package/src/node/backend.ts +159 -0
  42. package/src/node/index.ts +4 -0
  43. package/src/node/provider.ts +178 -0
  44. package/src/node/server.ts +89 -0
  45. package/src/policies.ts +49 -0
  46. package/src/provider.ts +33 -2
  47. package/src/session/account.ts +2 -1
  48. package/src/session/provider.ts +123 -10
  49. package/src/telegram/provider.ts +3 -2
  50. package/src/types.ts +3 -6
  51. package/src/utils.ts +4 -1
  52. package/tsconfig.json +3 -3
  53. package/dist/__tests__/parseChainId.test.d.ts +0 -2
  54. package/dist/__tests__/parseChainId.test.js +0 -89
  55. package/dist/__tests__/parseChainId.test.js.map +0 -1
  56. package/dist/account.d.ts +0 -38
  57. package/dist/account.js +0 -106
  58. package/dist/account.js.map +0 -1
  59. package/dist/constants.d.ts +0 -5
  60. package/dist/constants.js +0 -10
  61. package/dist/constants.js.map +0 -1
  62. package/dist/errors.d.ts +0 -5
  63. package/dist/errors.js +0 -11
  64. package/dist/errors.js.map +0 -1
  65. package/dist/icon.d.ts +0 -3
  66. package/dist/icon.js +0 -6
  67. package/dist/icon.js.map +0 -1
  68. package/dist/iframe/base.d.ts +0 -5
  69. package/dist/iframe/base.js +0 -122
  70. package/dist/iframe/base.js.map +0 -1
  71. package/dist/iframe/index.d.ts +0 -5
  72. package/dist/iframe/index.js +0 -184
  73. package/dist/iframe/index.js.map +0 -1
  74. package/dist/iframe/keychain.d.ts +0 -5
  75. package/dist/iframe/keychain.js +0 -143
  76. package/dist/iframe/keychain.js.map +0 -1
  77. package/dist/iframe/profile.d.ts +0 -5
  78. package/dist/iframe/profile.js +0 -163
  79. package/dist/iframe/profile.js.map +0 -1
  80. package/dist/index.d-BbTUPBeO.d.ts +0 -68
  81. package/dist/provider.d.ts +0 -22
  82. package/dist/provider.js +0 -198
  83. package/dist/provider.js.map +0 -1
  84. package/dist/session/account.d.ts +0 -37
  85. package/dist/session/account.js +0 -92
  86. package/dist/session/account.js.map +0 -1
  87. package/dist/session/backend.d.ts +0 -60
  88. package/dist/session/backend.js +0 -39
  89. package/dist/session/backend.js.map +0 -1
  90. package/dist/session/provider.d.ts +0 -30
  91. package/dist/session/provider.js.map +0 -1
  92. package/dist/telegram/backend.d.ts +0 -33
  93. package/dist/telegram/backend.js +0 -40
  94. package/dist/telegram/backend.js.map +0 -1
  95. package/dist/telegram/provider.d.ts +0 -26
  96. package/dist/telegram/provider.js.map +0 -1
  97. package/dist/types.d.ts +0 -5
  98. package/dist/types.js +0 -13
  99. package/dist/types.js.map +0 -1
  100. package/dist/utils.d.ts +0 -18
  101. package/dist/utils.js +0 -139
  102. package/dist/utils.js.map +0 -1
@@ -1,21 +1,8 @@
1
- // src/session/provider.ts
2
- import { ec, stark } from "starknet";
3
-
4
- // src/session/account.ts
5
- import { CartridgeSessionAccount } from "@cartridge/account-wasm/session";
6
- import { WalletAccount } from "starknet";
1
+ import { stark, ec, typedData, TypedDataRevision, hash, WalletAccount, addAddressPadding, CallData } from 'starknet';
2
+ import { CartridgeSessionAccount } from '@cartridge/account-wasm/session';
3
+ import { Permission } from '@starknet-io/types-js';
7
4
 
8
- // src/utils.ts
9
- import {
10
- addAddressPadding,
11
- CallData,
12
- constants,
13
- getChecksumAddress,
14
- hash,
15
- shortString,
16
- typedData,
17
- TypedDataRevision
18
- } from "starknet";
5
+ // src/session/provider.ts
19
6
  function normalizeCalls(calls) {
20
7
  return toArray(calls).map((call) => {
21
8
  return {
@@ -30,7 +17,8 @@ function toWasmPolicies(policies) {
30
17
  ...Object.entries(policies.contracts ?? {}).flatMap(
31
18
  ([target, { methods }]) => toArray(methods).map((m) => ({
32
19
  target,
33
- method: m.entrypoint
20
+ method: m.entrypoint,
21
+ authorized: m.authorized
34
22
  }))
35
23
  ),
36
24
  ...(policies.messages ?? []).map((p) => {
@@ -46,7 +34,8 @@ function toWasmPolicies(policies) {
46
34
  TypedDataRevision.ACTIVE
47
35
  );
48
36
  return {
49
- scope_hash: hash.computePoseidonHash(domainHash, typeHash)
37
+ scope_hash: hash.computePoseidonHash(domainHash, typeHash),
38
+ authorized: p.authorized
50
39
  };
51
40
  })
52
41
  ];
@@ -75,6 +64,7 @@ var ResponseCodes = /* @__PURE__ */ ((ResponseCodes2) => {
75
64
 
76
65
  // src/session/account.ts
77
66
  var SessionAccount = class extends WalletAccount {
67
+ controller;
78
68
  constructor(provider, {
79
69
  rpcUrl,
80
70
  privateKey,
@@ -85,7 +75,8 @@ var SessionAccount = class extends WalletAccount {
85
75
  policies
86
76
  }) {
87
77
  super({ nodeUrl: rpcUrl }, provider);
88
- this.controller = CartridgeSessionAccount.new_as_registered(
78
+ this.address = address;
79
+ this.controller = CartridgeSessionAccount.newAsRegistered(
89
80
  rpcUrl,
90
81
  privateKey,
91
82
  address,
@@ -117,21 +108,16 @@ var SessionAccount = class extends WalletAccount {
117
108
  // src/constants.ts
118
109
  var KEYCHAIN_URL = "https://x.cartridge.gg";
119
110
 
120
- // src/provider.ts
121
- import {
122
- Permission
123
- } from "@starknet-io/types-js";
124
-
125
111
  // package.json
126
112
  var package_default = {
127
113
  name: "@cartridge/controller",
128
- version: "0.5.9",
114
+ version: "0.7.0",
129
115
  description: "Cartridge Controller",
130
116
  module: "dist/index.js",
131
117
  types: "dist/index.d.ts",
132
118
  type: "module",
133
119
  scripts: {
134
- "build:deps": "tsup --dts-resolve",
120
+ "build:deps": "tsup",
135
121
  build: "pnpm build:deps",
136
122
  format: 'prettier --write "src/**/*.ts"',
137
123
  "format:check": 'prettier --check "src/**/*.ts"',
@@ -139,167 +125,240 @@ var package_default = {
139
125
  version: "pnpm pkg get version"
140
126
  },
141
127
  exports: {
142
- ".": "./dist/index.js",
143
- "./session": "./dist/session/index.js",
144
- "./provider": "./dist/provider/index.js",
145
- "./types": "./dist/types/index.js"
128
+ ".": {
129
+ types: "./dist/index.d.ts",
130
+ import: "./dist/index.js",
131
+ require: "./dist/index.cjs"
132
+ },
133
+ "./session": {
134
+ types: "./dist/session/index.d.ts",
135
+ import: "./dist/session/index.js",
136
+ require: "./dist/session/index.cjs"
137
+ },
138
+ "./session/node": {
139
+ types: "./dist/node/index.d.ts",
140
+ import: "./dist/node/index.js",
141
+ require: "./dist/node/index.cjs"
142
+ },
143
+ "./provider": {
144
+ types: "./dist/provider/index.d.ts",
145
+ import: "./dist/provider/index.js"
146
+ },
147
+ "./types": {
148
+ types: "./dist/types/index.d.ts",
149
+ import: "./dist/types/index.js"
150
+ }
146
151
  },
147
152
  tsup: {
148
153
  entry: [
149
- "src/**"
154
+ "src/index.ts",
155
+ "src/controller.ts",
156
+ "src/lookup.ts",
157
+ "src/session/index.ts",
158
+ "src/node/index.ts"
150
159
  ],
151
160
  format: [
152
- "esm"
161
+ "esm",
162
+ "cjs"
153
163
  ],
154
164
  splitting: false,
155
165
  sourcemap: true,
156
- clean: true
166
+ clean: true,
167
+ dts: true,
168
+ treeshake: {
169
+ preset: "recommended"
170
+ },
171
+ exports: "named"
172
+ },
173
+ peerDependencies: {
174
+ starknet: "catalog:",
175
+ open: "^10.1.0"
157
176
  },
158
177
  dependencies: {
159
178
  "@cartridge/account-wasm": "workspace:*",
160
- "@cartridge/penpal": "^6.2.3",
161
- "@starknet-io/types-js": "^0.7.7",
179
+ "@cartridge/penpal": "catalog:",
180
+ "@starknet-io/types-js": "catalog:",
162
181
  "@telegram-apps/sdk": "^2.4.0",
163
- base64url: "^3.0.1",
182
+ base64url: "catalog:",
164
183
  "cbor-x": "^1.5.0",
165
- "fast-deep-equal": "^3.1.3",
166
- "query-string": "^7.1.1",
167
- starknet: "^6.11.0"
184
+ "fast-deep-equal": "catalog:"
168
185
  },
169
186
  devDependencies: {
170
187
  "@cartridge/tsconfig": "workspace:*",
171
188
  "@types/jest": "^29.5.14",
172
- "@types/node": "^20.6.0",
189
+ "@types/node": "catalog:",
173
190
  jest: "^29.7.0",
191
+ prettier: "catalog:",
174
192
  "ts-jest": "^29.2.5",
175
- typescript: "^5.4.5"
193
+ tsup: "catalog:",
194
+ typescript: "catalog:"
176
195
  }
177
196
  };
178
197
 
179
198
  // src/icon.ts
180
199
  var icon = "data:image/png;base64,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";
181
200
 
201
+ // src/mutex.ts
202
+ function releaseStub() {
203
+ }
204
+ var Mutex = class {
205
+ m_lastPromise = Promise.resolve();
206
+ /**
207
+ * Acquire lock
208
+ * @param [bypass=false] option to skip lock acquisition
209
+ */
210
+ async obtain(bypass = false) {
211
+ let release = releaseStub;
212
+ if (bypass) return release;
213
+ const lastPromise = this.m_lastPromise;
214
+ this.m_lastPromise = new Promise((resolve) => release = resolve);
215
+ await lastPromise;
216
+ return release;
217
+ }
218
+ };
219
+
182
220
  // src/provider.ts
221
+ var mutex = new Mutex();
183
222
  var BaseProvider = class {
184
- constructor() {
185
- this.id = "controller";
186
- this.name = "Controller";
187
- this.version = package_default.version;
188
- this.icon = icon;
189
- this.subscriptions = [];
190
- this.request = async (call) => {
191
- switch (call.type) {
192
- case "wallet_getPermissions":
193
- await this.probe();
194
- if (this.account) {
195
- return [Permission.ACCOUNTS];
196
- }
197
- return [];
198
- case "wallet_requestAccounts": {
199
- if (this.account) {
200
- return [this.account.address];
201
- }
202
- const silentMode = call.params && call.params.silent_mode;
203
- this.account = await this.probe();
204
- if (!this.account && !silentMode) {
205
- this.account = await this.connect();
206
- }
207
- if (this.account) {
208
- return [this.account.address];
209
- }
210
- return [];
223
+ id = "controller";
224
+ name = "Controller";
225
+ version = package_default.version;
226
+ icon = icon;
227
+ account;
228
+ subscriptions = [];
229
+ _probePromise = null;
230
+ async safeProbe() {
231
+ if (this.account) {
232
+ return this.account;
233
+ }
234
+ if (this._probePromise) {
235
+ return this._probePromise;
236
+ }
237
+ const release = await mutex.obtain();
238
+ return await new Promise(async (resolve) => {
239
+ try {
240
+ this._probePromise = this.probe();
241
+ const result = await this._probePromise;
242
+ resolve(result);
243
+ } finally {
244
+ this._probePromise = null;
245
+ }
246
+ }).finally(() => {
247
+ release();
248
+ });
249
+ }
250
+ request = async (call) => {
251
+ switch (call.type) {
252
+ case "wallet_getPermissions":
253
+ await this.safeProbe();
254
+ if (this.account) {
255
+ return [Permission.ACCOUNTS];
211
256
  }
212
- case "wallet_watchAsset":
213
- throw {
214
- code: 63,
215
- message: "An unexpected error occurred",
216
- data: "wallet_watchAsset not implemented"
217
- };
218
- case "wallet_addStarknetChain": {
219
- let params2 = call.params;
220
- return this.addStarknetChain(params2);
257
+ return [];
258
+ case "wallet_requestAccounts": {
259
+ if (this.account) {
260
+ return [this.account.address];
221
261
  }
222
- case "wallet_switchStarknetChain": {
223
- let params2 = call.params;
224
- return this.switchStarknetChain(params2.chainId);
262
+ const silentMode = call.params && call.params.silent_mode;
263
+ this.account = await this.safeProbe();
264
+ if (!this.account && !silentMode) {
265
+ this.account = await this.connect();
225
266
  }
226
- case "wallet_requestChainId":
227
- if (!this.account) {
228
- throw {
229
- code: 63,
230
- message: "An unexpected error occurred",
231
- data: "Account not initialized"
232
- };
233
- }
234
- return await this.account.getChainId();
235
- case "wallet_deploymentData":
267
+ if (this.account) {
268
+ return [this.account.address];
269
+ }
270
+ return [];
271
+ }
272
+ case "wallet_watchAsset":
273
+ throw {
274
+ code: 63,
275
+ message: "An unexpected error occurred",
276
+ data: "wallet_watchAsset not implemented"
277
+ };
278
+ case "wallet_addStarknetChain": {
279
+ let params2 = call.params;
280
+ return this.addStarknetChain(params2);
281
+ }
282
+ case "wallet_switchStarknetChain": {
283
+ let params2 = call.params;
284
+ return this.switchStarknetChain(params2.chainId);
285
+ }
286
+ case "wallet_requestChainId":
287
+ if (!this.account) {
236
288
  throw {
237
289
  code: 63,
238
290
  message: "An unexpected error occurred",
239
- data: "wallet_deploymentData not implemented"
291
+ data: "Account not initialized"
240
292
  };
241
- case "wallet_addInvokeTransaction":
242
- if (!this.account) {
243
- throw {
244
- code: 63,
245
- message: "An unexpected error occurred",
246
- data: "Account not initialized"
247
- };
248
- }
249
- let params = call.params;
250
- return await this.account.execute(
251
- params.calls.map((call2) => ({
252
- contractAddress: call2.contract_address,
253
- entrypoint: call2.entry_point,
254
- calldata: call2.calldata
255
- }))
256
- );
257
- case "wallet_addDeclareTransaction":
293
+ }
294
+ return await this.account.getChainId();
295
+ case "wallet_deploymentData":
296
+ throw {
297
+ code: 63,
298
+ message: "An unexpected error occurred",
299
+ data: "wallet_deploymentData not implemented"
300
+ };
301
+ case "wallet_addInvokeTransaction":
302
+ if (!this.account) {
258
303
  throw {
259
304
  code: 63,
260
305
  message: "An unexpected error occurred",
261
- data: "wallet_addDeclareTransaction not implemented"
306
+ data: "Account not initialized"
262
307
  };
263
- case "wallet_signTypedData": {
264
- if (!this.account) {
265
- throw {
266
- code: 63,
267
- message: "An unexpected error occurred",
268
- data: "Account not initialized"
269
- };
270
- }
271
- return await this.account.signMessage(call.params);
272
308
  }
273
- case "wallet_supportedSpecs":
274
- return [];
275
- case "wallet_supportedWalletApi":
276
- return [];
277
- default:
309
+ let params = call.params;
310
+ return await this.account.execute(
311
+ params.calls.map((call2) => ({
312
+ contractAddress: call2.contract_address,
313
+ entrypoint: call2.entry_point,
314
+ calldata: call2.calldata
315
+ }))
316
+ );
317
+ case "wallet_addDeclareTransaction":
318
+ throw {
319
+ code: 63,
320
+ message: "An unexpected error occurred",
321
+ data: "wallet_addDeclareTransaction not implemented"
322
+ };
323
+ case "wallet_signTypedData": {
324
+ if (!this.account) {
278
325
  throw {
279
326
  code: 63,
280
327
  message: "An unexpected error occurred",
281
- data: `Unknown RPC call type: ${call.type}`
328
+ data: "Account not initialized"
282
329
  };
330
+ }
331
+ return await this.account.signMessage(call.params);
283
332
  }
284
- };
285
- this.on = (event, handler) => {
286
- if (event !== "accountsChanged" && event !== "networkChanged") {
287
- throw new Error(`Unknown event: ${event}`);
288
- }
289
- this.subscriptions.push({ type: event, handler });
290
- };
291
- this.off = (event, handler) => {
292
- if (event !== "accountsChanged" && event !== "networkChanged") {
293
- throw new Error(`Unknown event: ${event}`);
294
- }
295
- const idx = this.subscriptions.findIndex(
296
- (sub) => sub.type === event && sub.handler === handler
297
- );
298
- if (idx >= 0) {
299
- this.subscriptions.splice(idx, 1);
300
- }
301
- };
302
- }
333
+ case "wallet_supportedSpecs":
334
+ return [];
335
+ case "wallet_supportedWalletApi":
336
+ return [];
337
+ default:
338
+ throw {
339
+ code: 63,
340
+ message: "An unexpected error occurred",
341
+ data: `Unknown RPC call type: ${call.type}`
342
+ };
343
+ }
344
+ };
345
+ on = (event, handler) => {
346
+ if (event !== "accountsChanged" && event !== "networkChanged") {
347
+ throw new Error(`Unknown event: ${event}`);
348
+ }
349
+ this.subscriptions.push({ type: event, handler });
350
+ };
351
+ off = (event, handler) => {
352
+ if (event !== "accountsChanged" && event !== "networkChanged") {
353
+ throw new Error(`Unknown event: ${event}`);
354
+ }
355
+ const idx = this.subscriptions.findIndex(
356
+ (sub) => sub.type === event && sub.handler === handler
357
+ );
358
+ if (idx >= 0) {
359
+ this.subscriptions.splice(idx, 1);
360
+ }
361
+ };
303
362
  emitNetworkChanged(chainId) {
304
363
  this.subscriptions.filter((sub) => sub.type === "networkChanged").forEach((sub) => {
305
364
  sub.handler(chainId);
@@ -314,30 +373,92 @@ var BaseProvider = class {
314
373
 
315
374
  // src/session/provider.ts
316
375
  var SessionProvider = class extends BaseProvider {
317
- constructor({ rpc, chainId, policies, redirectUrl }) {
376
+ id = "controller_session";
377
+ name = "Controller Session";
378
+ _chainId;
379
+ _rpcUrl;
380
+ _username;
381
+ _redirectUrl;
382
+ _policies;
383
+ _keychainUrl;
384
+ constructor({
385
+ rpc,
386
+ chainId,
387
+ policies,
388
+ redirectUrl,
389
+ keychainUrl
390
+ }) {
318
391
  super();
319
- this.id = "controller_session";
320
- this.name = "Controller Session";
392
+ this._policies = {
393
+ verified: false,
394
+ contracts: policies.contracts ? Object.fromEntries(
395
+ Object.entries(policies.contracts).map(([address, contract]) => [
396
+ address,
397
+ {
398
+ ...contract,
399
+ methods: contract.methods.map((method) => ({
400
+ ...method,
401
+ authorized: true
402
+ }))
403
+ }
404
+ ])
405
+ ) : undefined,
406
+ messages: policies.messages?.map((message) => ({
407
+ ...message,
408
+ authorized: true
409
+ }))
410
+ };
321
411
  this._rpcUrl = rpc;
322
412
  this._chainId = chainId;
323
413
  this._redirectUrl = redirectUrl;
324
- this._policies = policies;
414
+ this._keychainUrl = keychainUrl || KEYCHAIN_URL;
325
415
  if (typeof window !== "undefined") {
326
416
  window.starknet_controller_session = this;
327
417
  }
328
418
  }
419
+ validatePoliciesSubset(newPolicies, existingPolicies) {
420
+ if (newPolicies.contracts) {
421
+ if (!existingPolicies.contracts) return false;
422
+ for (const [address, contract] of Object.entries(newPolicies.contracts)) {
423
+ const existingContract = existingPolicies.contracts[address];
424
+ if (!existingContract) return false;
425
+ for (const method of contract.methods) {
426
+ const existingMethod = existingContract.methods.find(
427
+ (m) => m.entrypoint === method.entrypoint
428
+ );
429
+ if (!existingMethod || !existingMethod.authorized) return false;
430
+ }
431
+ }
432
+ }
433
+ if (newPolicies.messages) {
434
+ if (!existingPolicies.messages) return false;
435
+ for (const message of newPolicies.messages) {
436
+ const existingMessage = existingPolicies.messages.find(
437
+ (m) => JSON.stringify(m.domain) === JSON.stringify(message.domain) && JSON.stringify(m.types) === JSON.stringify(message.types)
438
+ );
439
+ if (!existingMessage || !existingMessage.authorized) return false;
440
+ }
441
+ }
442
+ return true;
443
+ }
329
444
  async username() {
330
445
  await this.tryRetrieveFromQueryOrStorage();
331
446
  return this._username;
332
447
  }
333
448
  async probe() {
334
- await this.tryRetrieveFromQueryOrStorage();
335
- return;
449
+ if (this.account) {
450
+ return this.account;
451
+ }
452
+ this.account = await this.tryRetrieveFromQueryOrStorage();
453
+ return this.account;
336
454
  }
337
455
  async connect() {
338
- await this.tryRetrieveFromQueryOrStorage();
339
456
  if (this.account) {
340
- return;
457
+ return this.account;
458
+ }
459
+ this.account = await this.tryRetrieveFromQueryOrStorage();
460
+ if (this.account) {
461
+ return this.account;
341
462
  }
342
463
  const pk = stark.randomAddress();
343
464
  const publicKey = ec.starkCurve.getStarkKey(pk);
@@ -348,12 +469,13 @@ var SessionProvider = class extends BaseProvider {
348
469
  pubKey: publicKey
349
470
  })
350
471
  );
351
- const url = `${KEYCHAIN_URL}/session?public_key=${publicKey}&redirect_uri=${this._redirectUrl}&redirect_query_name=startapp&policies=${JSON.stringify(
472
+ localStorage.setItem("sessionPolicies", JSON.stringify(this._policies));
473
+ const url = `${this._keychainUrl}/session?public_key=${publicKey}&redirect_uri=${this._redirectUrl}&redirect_query_name=startapp&policies=${JSON.stringify(
352
474
  this._policies
353
475
  )}&rpc_url=${this._rpcUrl}`;
354
476
  localStorage.setItem("lastUsedConnector", this.id);
355
477
  window.open(url, "_blank");
356
- return;
478
+ return this.account;
357
479
  }
358
480
  switchStarknetChain(_chainId) {
359
481
  throw new Error("switchStarknetChain not implemented");
@@ -364,11 +486,15 @@ var SessionProvider = class extends BaseProvider {
364
486
  disconnect() {
365
487
  localStorage.removeItem("sessionSigner");
366
488
  localStorage.removeItem("session");
367
- this.account = void 0;
368
- this._username = void 0;
489
+ localStorage.removeItem("sessionPolicies");
490
+ this.account = undefined;
491
+ this._username = undefined;
369
492
  return Promise.resolve();
370
493
  }
371
494
  async tryRetrieveFromQueryOrStorage() {
495
+ if (this.account) {
496
+ return this.account;
497
+ }
372
498
  const signerString = localStorage.getItem("sessionSigner");
373
499
  const signer = signerString ? JSON.parse(signerString) : null;
374
500
  let sessionRegistration = null;
@@ -392,6 +518,25 @@ var SessionProvider = class extends BaseProvider {
392
518
  if (!sessionRegistration || !signer) {
393
519
  return;
394
520
  }
521
+ const expirationTime = parseInt(sessionRegistration.expiresAt) * 1e3;
522
+ if (Date.now() >= expirationTime) {
523
+ this.clearStoredSession();
524
+ return;
525
+ }
526
+ const storedPoliciesStr = localStorage.getItem("sessionPolicies");
527
+ if (storedPoliciesStr) {
528
+ const storedPolicies = JSON.parse(
529
+ storedPoliciesStr
530
+ );
531
+ const isValid = this.validatePoliciesSubset(
532
+ this._policies,
533
+ storedPolicies
534
+ );
535
+ if (!isValid) {
536
+ this.clearStoredSession();
537
+ return;
538
+ }
539
+ }
395
540
  this._username = sessionRegistration.username;
396
541
  this.account = new SessionAccount(this, {
397
542
  rpcUrl: this._rpcUrl,
@@ -404,10 +549,13 @@ var SessionProvider = class extends BaseProvider {
404
549
  });
405
550
  return this.account;
406
551
  }
552
+ clearStoredSession() {
553
+ localStorage.removeItem("sessionSigner");
554
+ localStorage.removeItem("session");
555
+ localStorage.removeItem("sessionPolicies");
556
+ }
407
557
  };
408
- export {
409
- NotReadyToConnect,
410
- ResponseCodes,
411
- SessionProvider as default
412
- };
558
+
559
+ export { NotReadyToConnect, ResponseCodes, SessionProvider as default };
560
+ //# sourceMappingURL=index.js.map
413
561
  //# sourceMappingURL=index.js.map