@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
@@ -0,0 +1,726 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var starknet = require('starknet');
6
+ var session = require('@cartridge/account-wasm/session');
7
+ var typesJs = require('@starknet-io/types-js');
8
+ var fs = require('fs/promises');
9
+ var path = require('path');
10
+ var http = require('http');
11
+
12
+ function _interopNamespace(e) {
13
+ if (e && e.__esModule) return e;
14
+ var n = Object.create(null);
15
+ if (e) {
16
+ Object.keys(e).forEach(function (k) {
17
+ if (k !== 'default') {
18
+ var d = Object.getOwnPropertyDescriptor(e, k);
19
+ Object.defineProperty(n, k, d.get ? d : {
20
+ enumerable: true,
21
+ get: function () { return e[k]; }
22
+ });
23
+ }
24
+ });
25
+ }
26
+ n.default = e;
27
+ return Object.freeze(n);
28
+ }
29
+
30
+ var fs__namespace = /*#__PURE__*/_interopNamespace(fs);
31
+ var path__namespace = /*#__PURE__*/_interopNamespace(path);
32
+ var http__namespace = /*#__PURE__*/_interopNamespace(http);
33
+
34
+ // src/node/provider.ts
35
+ function normalizeCalls(calls) {
36
+ return toArray(calls).map((call) => {
37
+ return {
38
+ entrypoint: call.entrypoint,
39
+ contractAddress: starknet.addAddressPadding(call.contractAddress),
40
+ calldata: starknet.CallData.toHex(call.calldata)
41
+ };
42
+ });
43
+ }
44
+ function toWasmPolicies(policies) {
45
+ return [
46
+ ...Object.entries(policies.contracts ?? {}).flatMap(
47
+ ([target, { methods }]) => toArray(methods).map((m) => ({
48
+ target,
49
+ method: m.entrypoint,
50
+ authorized: m.authorized
51
+ }))
52
+ ),
53
+ ...(policies.messages ?? []).map((p) => {
54
+ const domainHash = starknet.typedData.getStructHash(
55
+ p.types,
56
+ "StarknetDomain",
57
+ p.domain,
58
+ starknet.TypedDataRevision.ACTIVE
59
+ );
60
+ const typeHash = starknet.typedData.getTypeHash(
61
+ p.types,
62
+ p.primaryType,
63
+ starknet.TypedDataRevision.ACTIVE
64
+ );
65
+ return {
66
+ scope_hash: starknet.hash.computePoseidonHash(domainHash, typeHash),
67
+ authorized: p.authorized
68
+ };
69
+ })
70
+ ];
71
+ }
72
+ function toArray(val) {
73
+ return Array.isArray(val) ? val : [val];
74
+ }
75
+
76
+ // src/errors.ts
77
+ var NotReadyToConnect = class _NotReadyToConnect extends Error {
78
+ constructor() {
79
+ super("Not ready to connect");
80
+ Object.setPrototypeOf(this, _NotReadyToConnect.prototype);
81
+ }
82
+ };
83
+
84
+ // src/types.ts
85
+ var ResponseCodes = /* @__PURE__ */ ((ResponseCodes2) => {
86
+ ResponseCodes2["SUCCESS"] = "SUCCESS";
87
+ ResponseCodes2["NOT_CONNECTED"] = "NOT_CONNECTED";
88
+ ResponseCodes2["ERROR"] = "ERROR";
89
+ ResponseCodes2["CANCELED"] = "CANCELED";
90
+ ResponseCodes2["USER_INTERACTION_REQUIRED"] = "USER_INTERACTION_REQUIRED";
91
+ return ResponseCodes2;
92
+ })(ResponseCodes || {});
93
+
94
+ // src/node/account.ts
95
+ var SessionAccount = class extends starknet.WalletAccount {
96
+ controller;
97
+ constructor(provider, {
98
+ rpcUrl,
99
+ privateKey,
100
+ address,
101
+ ownerGuid,
102
+ chainId,
103
+ expiresAt,
104
+ policies
105
+ }) {
106
+ super({ nodeUrl: rpcUrl }, provider);
107
+ this.address = address;
108
+ this.controller = session.CartridgeSessionAccount.newAsRegistered(
109
+ rpcUrl,
110
+ privateKey,
111
+ address,
112
+ ownerGuid,
113
+ chainId,
114
+ {
115
+ expiresAt,
116
+ policies
117
+ }
118
+ );
119
+ }
120
+ /**
121
+ * Invoke execute function in account contract
122
+ *
123
+ * @param calls the invocation object or an array of them, containing:
124
+ * - contractAddress - the address of the contract
125
+ * - entrypoint - the entrypoint of the contract
126
+ * - calldata - (defaults to []) the calldata
127
+ * - signature - (defaults to []) the signature
128
+ *
129
+ * @returns response from addTransaction
130
+ */
131
+ async execute(calls) {
132
+ try {
133
+ const res = await this.controller.executeFromOutside(
134
+ normalizeCalls(calls)
135
+ );
136
+ return res;
137
+ } catch (e) {
138
+ return this.controller.execute(normalizeCalls(calls));
139
+ }
140
+ }
141
+ };
142
+
143
+ // src/constants.ts
144
+ var KEYCHAIN_URL = "https://x.cartridge.gg";
145
+
146
+ // package.json
147
+ var package_default = {
148
+ name: "@cartridge/controller",
149
+ version: "0.7.0",
150
+ description: "Cartridge Controller",
151
+ module: "dist/index.js",
152
+ types: "dist/index.d.ts",
153
+ type: "module",
154
+ scripts: {
155
+ "build:deps": "tsup",
156
+ build: "pnpm build:deps",
157
+ format: 'prettier --write "src/**/*.ts"',
158
+ "format:check": 'prettier --check "src/**/*.ts"',
159
+ test: "jest",
160
+ version: "pnpm pkg get version"
161
+ },
162
+ exports: {
163
+ ".": {
164
+ types: "./dist/index.d.ts",
165
+ import: "./dist/index.js",
166
+ require: "./dist/index.cjs"
167
+ },
168
+ "./session": {
169
+ types: "./dist/session/index.d.ts",
170
+ import: "./dist/session/index.js",
171
+ require: "./dist/session/index.cjs"
172
+ },
173
+ "./session/node": {
174
+ types: "./dist/node/index.d.ts",
175
+ import: "./dist/node/index.js",
176
+ require: "./dist/node/index.cjs"
177
+ },
178
+ "./provider": {
179
+ types: "./dist/provider/index.d.ts",
180
+ import: "./dist/provider/index.js"
181
+ },
182
+ "./types": {
183
+ types: "./dist/types/index.d.ts",
184
+ import: "./dist/types/index.js"
185
+ }
186
+ },
187
+ tsup: {
188
+ entry: [
189
+ "src/index.ts",
190
+ "src/controller.ts",
191
+ "src/lookup.ts",
192
+ "src/session/index.ts",
193
+ "src/node/index.ts"
194
+ ],
195
+ format: [
196
+ "esm",
197
+ "cjs"
198
+ ],
199
+ splitting: false,
200
+ sourcemap: true,
201
+ clean: true,
202
+ dts: true,
203
+ treeshake: {
204
+ preset: "recommended"
205
+ },
206
+ exports: "named"
207
+ },
208
+ peerDependencies: {
209
+ starknet: "catalog:",
210
+ open: "^10.1.0"
211
+ },
212
+ dependencies: {
213
+ "@cartridge/account-wasm": "workspace:*",
214
+ "@cartridge/penpal": "catalog:",
215
+ "@starknet-io/types-js": "catalog:",
216
+ "@telegram-apps/sdk": "^2.4.0",
217
+ base64url: "catalog:",
218
+ "cbor-x": "^1.5.0",
219
+ "fast-deep-equal": "catalog:"
220
+ },
221
+ devDependencies: {
222
+ "@cartridge/tsconfig": "workspace:*",
223
+ "@types/jest": "^29.5.14",
224
+ "@types/node": "catalog:",
225
+ jest: "^29.7.0",
226
+ prettier: "catalog:",
227
+ "ts-jest": "^29.2.5",
228
+ tsup: "catalog:",
229
+ typescript: "catalog:"
230
+ }
231
+ };
232
+
233
+ // src/icon.ts
234
+ var icon = "data:image/png;base64,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";
235
+
236
+ // src/mutex.ts
237
+ function releaseStub() {
238
+ }
239
+ var Mutex = class {
240
+ m_lastPromise = Promise.resolve();
241
+ /**
242
+ * Acquire lock
243
+ * @param [bypass=false] option to skip lock acquisition
244
+ */
245
+ async obtain(bypass = false) {
246
+ let release = releaseStub;
247
+ if (bypass) return release;
248
+ const lastPromise = this.m_lastPromise;
249
+ this.m_lastPromise = new Promise((resolve) => release = resolve);
250
+ await lastPromise;
251
+ return release;
252
+ }
253
+ };
254
+
255
+ // src/provider.ts
256
+ var mutex = new Mutex();
257
+ var BaseProvider = class {
258
+ id = "controller";
259
+ name = "Controller";
260
+ version = package_default.version;
261
+ icon = icon;
262
+ account;
263
+ subscriptions = [];
264
+ _probePromise = null;
265
+ async safeProbe() {
266
+ if (this.account) {
267
+ return this.account;
268
+ }
269
+ if (this._probePromise) {
270
+ return this._probePromise;
271
+ }
272
+ const release = await mutex.obtain();
273
+ return await new Promise(async (resolve) => {
274
+ try {
275
+ this._probePromise = this.probe();
276
+ const result = await this._probePromise;
277
+ resolve(result);
278
+ } finally {
279
+ this._probePromise = null;
280
+ }
281
+ }).finally(() => {
282
+ release();
283
+ });
284
+ }
285
+ request = async (call) => {
286
+ switch (call.type) {
287
+ case "wallet_getPermissions":
288
+ await this.safeProbe();
289
+ if (this.account) {
290
+ return [typesJs.Permission.ACCOUNTS];
291
+ }
292
+ return [];
293
+ case "wallet_requestAccounts": {
294
+ if (this.account) {
295
+ return [this.account.address];
296
+ }
297
+ const silentMode = call.params && call.params.silent_mode;
298
+ this.account = await this.safeProbe();
299
+ if (!this.account && !silentMode) {
300
+ this.account = await this.connect();
301
+ }
302
+ if (this.account) {
303
+ return [this.account.address];
304
+ }
305
+ return [];
306
+ }
307
+ case "wallet_watchAsset":
308
+ throw {
309
+ code: 63,
310
+ message: "An unexpected error occurred",
311
+ data: "wallet_watchAsset not implemented"
312
+ };
313
+ case "wallet_addStarknetChain": {
314
+ let params2 = call.params;
315
+ return this.addStarknetChain(params2);
316
+ }
317
+ case "wallet_switchStarknetChain": {
318
+ let params2 = call.params;
319
+ return this.switchStarknetChain(params2.chainId);
320
+ }
321
+ case "wallet_requestChainId":
322
+ if (!this.account) {
323
+ throw {
324
+ code: 63,
325
+ message: "An unexpected error occurred",
326
+ data: "Account not initialized"
327
+ };
328
+ }
329
+ return await this.account.getChainId();
330
+ case "wallet_deploymentData":
331
+ throw {
332
+ code: 63,
333
+ message: "An unexpected error occurred",
334
+ data: "wallet_deploymentData not implemented"
335
+ };
336
+ case "wallet_addInvokeTransaction":
337
+ if (!this.account) {
338
+ throw {
339
+ code: 63,
340
+ message: "An unexpected error occurred",
341
+ data: "Account not initialized"
342
+ };
343
+ }
344
+ let params = call.params;
345
+ return await this.account.execute(
346
+ params.calls.map((call2) => ({
347
+ contractAddress: call2.contract_address,
348
+ entrypoint: call2.entry_point,
349
+ calldata: call2.calldata
350
+ }))
351
+ );
352
+ case "wallet_addDeclareTransaction":
353
+ throw {
354
+ code: 63,
355
+ message: "An unexpected error occurred",
356
+ data: "wallet_addDeclareTransaction not implemented"
357
+ };
358
+ case "wallet_signTypedData": {
359
+ if (!this.account) {
360
+ throw {
361
+ code: 63,
362
+ message: "An unexpected error occurred",
363
+ data: "Account not initialized"
364
+ };
365
+ }
366
+ return await this.account.signMessage(call.params);
367
+ }
368
+ case "wallet_supportedSpecs":
369
+ return [];
370
+ case "wallet_supportedWalletApi":
371
+ return [];
372
+ default:
373
+ throw {
374
+ code: 63,
375
+ message: "An unexpected error occurred",
376
+ data: `Unknown RPC call type: ${call.type}`
377
+ };
378
+ }
379
+ };
380
+ on = (event, handler) => {
381
+ if (event !== "accountsChanged" && event !== "networkChanged") {
382
+ throw new Error(`Unknown event: ${event}`);
383
+ }
384
+ this.subscriptions.push({ type: event, handler });
385
+ };
386
+ off = (event, handler) => {
387
+ if (event !== "accountsChanged" && event !== "networkChanged") {
388
+ throw new Error(`Unknown event: ${event}`);
389
+ }
390
+ const idx = this.subscriptions.findIndex(
391
+ (sub) => sub.type === event && sub.handler === handler
392
+ );
393
+ if (idx >= 0) {
394
+ this.subscriptions.splice(idx, 1);
395
+ }
396
+ };
397
+ emitNetworkChanged(chainId) {
398
+ this.subscriptions.filter((sub) => sub.type === "networkChanged").forEach((sub) => {
399
+ sub.handler(chainId);
400
+ });
401
+ }
402
+ emitAccountsChanged(accounts) {
403
+ this.subscriptions.filter((sub) => sub.type === "accountsChanged").forEach((sub) => {
404
+ sub.handler(accounts);
405
+ });
406
+ }
407
+ };
408
+ var CallbackServer = class {
409
+ server;
410
+ resolveCallback;
411
+ rejectCallback;
412
+ timeoutId;
413
+ constructor() {
414
+ this.server = http__namespace.createServer(this.handleRequest.bind(this));
415
+ this.server.on("error", (error) => {
416
+ console.error("Server error:", error);
417
+ if (this.rejectCallback) {
418
+ this.rejectCallback(error);
419
+ }
420
+ });
421
+ }
422
+ cleanup() {
423
+ if (this.timeoutId) {
424
+ clearTimeout(this.timeoutId);
425
+ }
426
+ this.server.close();
427
+ }
428
+ handleRequest(req, res) {
429
+ if (!req.url?.startsWith("/callback")) {
430
+ res.writeHead(404);
431
+ res.end();
432
+ return;
433
+ }
434
+ const params = new URLSearchParams(req.url.split("?")[1]);
435
+ const session = params.get("startapp");
436
+ if (!session) {
437
+ console.warn("Received callback without session data");
438
+ res.writeHead(400);
439
+ res.end("Missing session data");
440
+ return;
441
+ }
442
+ if (this.resolveCallback) {
443
+ this.resolveCallback(session);
444
+ }
445
+ res.writeHead(200, { "Content-Type": "text/html" });
446
+ res.end(
447
+ "<html><body><script>window.close();</script>Session registered successfully. You can close this window.</body></html>"
448
+ );
449
+ this.cleanup();
450
+ }
451
+ async listen() {
452
+ return new Promise((resolve, reject) => {
453
+ this.server.listen(0, "localhost", () => {
454
+ const address = this.server.address();
455
+ const url = `http://localhost:${address.port}/callback`;
456
+ resolve(url);
457
+ });
458
+ this.server.on("error", reject);
459
+ });
460
+ }
461
+ async waitForCallback() {
462
+ return new Promise((resolve, reject) => {
463
+ this.resolveCallback = resolve;
464
+ this.rejectCallback = reject;
465
+ this.timeoutId = setTimeout(
466
+ () => {
467
+ console.warn("Callback timeout reached");
468
+ reject(new Error("Callback timeout after 5 minutes"));
469
+ this.cleanup();
470
+ },
471
+ 5 * 60 * 1e3
472
+ );
473
+ });
474
+ }
475
+ };
476
+
477
+ // src/node/backend.ts
478
+ var NodeBackend = class {
479
+ basePath;
480
+ sessionFile;
481
+ data = {};
482
+ callbackServer;
483
+ constructor(basePath) {
484
+ if (!basePath) {
485
+ throw new Error("basePath is required for NodeBackend");
486
+ }
487
+ this.basePath = basePath;
488
+ this.sessionFile = path__namespace.join(this.basePath, "session.json");
489
+ }
490
+ async ensureDirectoryExists() {
491
+ try {
492
+ await fs__namespace.access(this.basePath);
493
+ } catch {
494
+ try {
495
+ await fs__namespace.mkdir(this.basePath, { recursive: true });
496
+ } catch (error) {
497
+ throw new Error(
498
+ `Failed to create directory ${this.basePath}: ${error.message}`
499
+ );
500
+ }
501
+ }
502
+ }
503
+ async loadData() {
504
+ try {
505
+ const content = await fs__namespace.readFile(this.sessionFile, "utf-8");
506
+ const parsed = JSON.parse(content);
507
+ if (typeof parsed !== "object" || parsed === null) {
508
+ throw new Error("Invalid session data format");
509
+ }
510
+ this.data = parsed;
511
+ } catch (error) {
512
+ if (error instanceof Error) {
513
+ if (error.code !== "ENOENT") {
514
+ throw new Error(`Failed to load session data: ${error.message}`);
515
+ }
516
+ }
517
+ this.data = {};
518
+ }
519
+ }
520
+ async saveData() {
521
+ try {
522
+ await this.ensureDirectoryExists();
523
+ await fs__namespace.writeFile(
524
+ this.sessionFile,
525
+ JSON.stringify(this.data, null, 2),
526
+ "utf-8"
527
+ );
528
+ } catch (error) {
529
+ if (error instanceof Error) {
530
+ throw new Error(`Failed to save session data: ${error.message}`);
531
+ }
532
+ throw error;
533
+ }
534
+ }
535
+ async get(key) {
536
+ if (!key) {
537
+ throw new Error("Key is required");
538
+ }
539
+ await this.loadData();
540
+ return this.data[key] ? JSON.stringify(this.data[key]) : null;
541
+ }
542
+ async set(key, value) {
543
+ if (!key) {
544
+ throw new Error("Key is required");
545
+ }
546
+ if (!value) {
547
+ throw new Error("Value is required");
548
+ }
549
+ await this.loadData();
550
+ try {
551
+ this.data[key] = JSON.parse(value);
552
+ await this.saveData();
553
+ } catch (error) {
554
+ if (error instanceof Error) {
555
+ throw new Error(`Failed to set ${key}: ${error.message}`);
556
+ }
557
+ throw error;
558
+ }
559
+ }
560
+ async delete(key) {
561
+ if (!key) {
562
+ throw new Error("Key is required");
563
+ }
564
+ await this.loadData();
565
+ delete this.data[key];
566
+ await this.saveData();
567
+ }
568
+ async getRedirectUri() {
569
+ try {
570
+ this.callbackServer = new CallbackServer();
571
+ return await this.callbackServer.listen();
572
+ } catch (error) {
573
+ if (error instanceof Error) {
574
+ throw new Error(`Failed to start callback server: ${error.message}`);
575
+ }
576
+ throw error;
577
+ }
578
+ }
579
+ async waitForCallback() {
580
+ if (!this.callbackServer) {
581
+ throw new Error("Callback server not initialized");
582
+ }
583
+ return await this.callbackServer.waitForCallback();
584
+ }
585
+ openLink(url) {
586
+ if (!url) {
587
+ throw new Error("URL is required");
588
+ }
589
+ console.log(`
590
+ Open url to authorize session: ${url}`);
591
+ }
592
+ };
593
+
594
+ // src/node/provider.ts
595
+ var SessionProvider = class extends BaseProvider {
596
+ id = "controller_session";
597
+ name = "Controller Session";
598
+ _chainId;
599
+ _rpcUrl;
600
+ _username;
601
+ _policies;
602
+ _keychainUrl;
603
+ _backend;
604
+ constructor({
605
+ rpc,
606
+ chainId,
607
+ policies,
608
+ basePath,
609
+ keychainUrl
610
+ }) {
611
+ super();
612
+ this._policies = {
613
+ verified: false,
614
+ contracts: policies.contracts ? Object.fromEntries(
615
+ Object.entries(policies.contracts).map(([address, contract]) => [
616
+ address,
617
+ {
618
+ ...contract,
619
+ methods: contract.methods.map((method) => ({
620
+ ...method,
621
+ authorized: true
622
+ }))
623
+ }
624
+ ])
625
+ ) : undefined,
626
+ messages: policies.messages?.map((message) => ({
627
+ ...message,
628
+ authorized: true
629
+ }))
630
+ };
631
+ this._rpcUrl = rpc;
632
+ this._chainId = chainId;
633
+ this._keychainUrl = keychainUrl || KEYCHAIN_URL;
634
+ this._backend = new NodeBackend(basePath);
635
+ }
636
+ async username() {
637
+ const sessionStr = await this._backend.get("session");
638
+ if (sessionStr) {
639
+ const session = JSON.parse(sessionStr);
640
+ return session.username;
641
+ }
642
+ return undefined;
643
+ }
644
+ async probe() {
645
+ if (this.account) {
646
+ return this.account;
647
+ }
648
+ const [sessionStr, signerStr] = await Promise.all([
649
+ this._backend.get("session"),
650
+ this._backend.get("signer")
651
+ ]);
652
+ if (!sessionStr || !signerStr) {
653
+ return undefined;
654
+ }
655
+ const session = JSON.parse(sessionStr);
656
+ const signer = JSON.parse(signerStr);
657
+ const expirationTime = parseInt(session.expiresAt) * 1e3;
658
+ if (Date.now() >= expirationTime) {
659
+ await this.disconnect();
660
+ return undefined;
661
+ }
662
+ this._username = session.username;
663
+ this.account = new SessionAccount(this, {
664
+ rpcUrl: this._rpcUrl,
665
+ privateKey: signer.privKey,
666
+ address: session.address,
667
+ ownerGuid: session.ownerGuid,
668
+ chainId: this._chainId,
669
+ expiresAt: parseInt(session.expiresAt),
670
+ policies: toWasmPolicies(this._policies)
671
+ });
672
+ return this.account;
673
+ }
674
+ async connect() {
675
+ if (this.account) {
676
+ return this.account;
677
+ }
678
+ const account = await this.probe();
679
+ if (account) {
680
+ return account;
681
+ }
682
+ const pk = starknet.stark.randomAddress();
683
+ const publicKey = starknet.ec.starkCurve.getStarkKey(pk);
684
+ await this._backend.set(
685
+ "signer",
686
+ JSON.stringify({
687
+ privKey: pk,
688
+ pubKey: publicKey
689
+ })
690
+ );
691
+ const redirectUri = await this._backend.getRedirectUri();
692
+ const url = `${this._keychainUrl}/session?public_key=${encodeURIComponent(publicKey)}&redirect_uri=${encodeURIComponent(
693
+ redirectUri
694
+ )}&redirect_query_name=startapp&policies=${encodeURIComponent(
695
+ JSON.stringify(this._policies)
696
+ )}&rpc_url=${encodeURIComponent(this._rpcUrl)}`;
697
+ this._backend.openLink(url);
698
+ const sessionData = await this._backend.waitForCallback();
699
+ if (sessionData) {
700
+ const sessionRegistration = JSON.parse(atob(sessionData));
701
+ sessionRegistration.address = sessionRegistration.address.toLowerCase();
702
+ sessionRegistration.ownerGuid = sessionRegistration.ownerGuid.toLowerCase();
703
+ await this._backend.set("session", JSON.stringify(sessionRegistration));
704
+ return this.probe();
705
+ }
706
+ return undefined;
707
+ }
708
+ async disconnect() {
709
+ await this._backend.delete("signer");
710
+ await this._backend.delete("session");
711
+ this.account = undefined;
712
+ this._username = undefined;
713
+ }
714
+ switchStarknetChain(_chainId) {
715
+ throw new Error("switchStarknetChain not implemented");
716
+ }
717
+ addStarknetChain(_chain) {
718
+ throw new Error("addStarknetChain not implemented");
719
+ }
720
+ };
721
+
722
+ exports.NotReadyToConnect = NotReadyToConnect;
723
+ exports.ResponseCodes = ResponseCodes;
724
+ exports.default = SessionProvider;
725
+ //# sourceMappingURL=index.cjs.map
726
+ //# sourceMappingURL=index.cjs.map