windkit 0.2.0 → 0.2.1

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/index.cjs CHANGED
@@ -149,7 +149,6 @@ var WalletSession = class _WalletSession {
149
149
  this.#connection.send(data);
150
150
  });
151
151
  }
152
- // menerima unknown, lakukan narrowing di dalam
153
152
  #onDataReceived(data) {
154
153
  if (!data || typeof data !== "object") return;
155
154
  const maybe = data;
@@ -168,53 +167,105 @@ function assertBrowser2() {
168
167
  throw new Error("WindConnector requires browser environment (window/crypto).");
169
168
  }
170
169
  }
170
+ function isTurn(server) {
171
+ const urls = Array.isArray(server.urls) ? server.urls : [server.urls];
172
+ return urls.some((u) => typeof u === "string" && (u.startsWith("turn:") || u.startsWith("turns:")));
173
+ }
174
+ function ensureTurnHasCred(server) {
175
+ if (isTurn(server) && (!server.username || !server.credential)) {
176
+ throw new Error("TURN server requires username and credential.");
177
+ }
178
+ }
171
179
  var WindConnector = class {
172
180
  #peer;
173
- #peerOptions = {};
181
+ #peerOptions;
174
182
  #peerId;
175
183
  #listeners = /* @__PURE__ */ new Map();
176
184
  #session = /* @__PURE__ */ new Map();
177
- /** Argumen identity yang sesuai typing @wharfkit */
178
185
  #identityArgs = {
179
186
  chainId: WalletSession.ChainID,
180
187
  scope: "vexanium",
181
- // beberapa versi typing menandai callback required; berikan placeholder
182
188
  callback: { url: "", background: false }
183
189
  };
184
190
  constructor() {
185
- this.#peerOptions.config = {
186
- iceServers: [
187
- { urls: "stun:stun.l.google.com:19302" },
188
- { urls: "stun:stun1.l.google.com:3478" },
189
- { urls: "stun:stun.relay.metered.ca:80" },
190
- {
191
- urls: "turn:asia.relay.metered.ca:80",
192
- username: "b66cd40a117bddb5cde924ab",
193
- credential: "4jRmuTehVCZ2a/S+"
194
- }
195
- ],
196
- sdpSemantics: "unified-plan"
191
+ this.#peerOptions = {
192
+ host: "core.windcrypto.com",
193
+ port: 443,
194
+ secure: true,
195
+ path: "/",
196
+ key: "peerjs",
197
+ config: {
198
+ iceServers: [
199
+ { urls: "stun:stun.l.google.com:19302" },
200
+ { urls: "stun:stun1.l.google.com:3478" },
201
+ { urls: "stun:stun.relay.metered.ca:80" },
202
+ {
203
+ urls: "turn:asia.relay.metered.ca:80",
204
+ username: "b66cd40a117bddb5cde924ab",
205
+ credential: "4jRmuTehVCZ2a/S+"
206
+ }
207
+ ],
208
+ sdpSemantics: "unified-plan"
209
+ }
197
210
  };
211
+ for (const s of this.#peerOptions.config.iceServers ?? []) ensureTurnHasCred(s);
198
212
  this.#loadSession();
199
213
  }
214
+ setServer(host, opts) {
215
+ if (!host) throw new Error("host is required");
216
+ this.#peerOptions.host = host;
217
+ if (typeof opts?.port === "number") this.#peerOptions.port = opts.port;
218
+ if (typeof opts?.secure === "boolean") this.#peerOptions.secure = opts.secure;
219
+ if (typeof opts?.path === "string") this.#peerOptions.path = opts.path;
220
+ if (typeof opts?.key === "string") this.#peerOptions.key = opts.key;
221
+ }
222
+ setPath(path) {
223
+ this.#peerOptions.path = path || "/";
224
+ }
225
+ setKey(key) {
226
+ this.#peerOptions.key = key || "peerjs";
227
+ }
228
+ setSecure(v) {
229
+ this.#peerOptions.secure = !!v;
230
+ }
231
+ setPort(port) {
232
+ this.#peerOptions.port = port;
233
+ }
234
+ configureForCore() {
235
+ this.setServer("core.windcrypto.com", { port: 443, secure: true, path: "/", key: "peerjs" });
236
+ }
200
237
  addIceServer(server) {
201
- if (!this.#peerOptions.config) this.#peerOptions.config = { iceServers: [] };
202
- this.#peerOptions.config.iceServers.push(server);
238
+ ensureTurnHasCred(server);
239
+ const cfg = this.#peerOptions.config ?? (this.#peerOptions.config = { iceServers: [] });
240
+ (cfg.iceServers ?? (cfg.iceServers = [])).push(server);
203
241
  }
204
- setServer(host, port) {
205
- this.#peerOptions.host = host;
206
- if (typeof port === "number") this.#peerOptions.port = port;
242
+ setIceServers(servers) {
243
+ for (const s of servers) ensureTurnHasCred(s);
244
+ const cfg = this.#peerOptions.config ?? (this.#peerOptions.config = { iceServers: [] });
245
+ cfg.iceServers = servers.slice();
246
+ }
247
+ clearIceServers() {
248
+ const cfg = this.#peerOptions.config ?? (this.#peerOptions.config = { iceServers: [] });
249
+ cfg.iceServers = [];
207
250
  }
208
- /** Events: `open`, `close`, `disconnected`, `error`, `session` */
209
251
  on(event, func) {
210
252
  this.#listeners.set(event, func);
211
253
  }
254
+ off(event) {
255
+ this.#listeners.delete(event);
256
+ }
257
+ #emit(event, ...args) {
258
+ this.#listeners.get(event)?.(...args);
259
+ }
212
260
  async connect() {
213
261
  assertBrowser2();
214
- if (!this.#peerId) throw new Error("Peer ID is not set");
262
+ if (!this.#peerId) throw new Error("Peer ID is not set. Call createLoginRequest() first.");
215
263
  this.#peer = new peerjs.Peer(this.#peerId, this.#peerOptions);
264
+ this.#peer.on("open", (id) => this.#emit("open", id));
265
+ this.#peer.on("close", () => this.#emit("close"));
266
+ this.#peer.on("disconnected", () => this.#emit("disconnected"));
267
+ this.#peer.on("error", (err) => this.#emit("error", err));
216
268
  this.#peer.on("connection", this.#onConnection.bind(this));
217
- this.#listeners.forEach((func, key) => this.#peer.on(key, func));
218
269
  }
219
270
  disconnect() {
220
271
  this.#peer?.disconnect();
@@ -231,12 +282,10 @@ var WindConnector = class {
231
282
  isDestroyed() {
232
283
  return Boolean(this.#peer?.destroyed);
233
284
  }
234
- /**
235
- * Membuat VSR login untuk QR/URL.
236
- * @param name - App name
237
- * @param icon - Icon URL
238
- */
239
- createLoginRequest(name, icon) {
285
+ get peerId() {
286
+ return this.#peerId;
287
+ }
288
+ createLoginRequest(appName, iconUrl) {
240
289
  assertBrowser2();
241
290
  const session = this.#getLastSession();
242
291
  if (session) {
@@ -251,8 +300,8 @@ var WindConnector = class {
251
300
  }
252
301
  const req = signingRequest.SigningRequest.identity(this.#identityArgs, { zlib });
253
302
  req.setInfoKey("pi", this.#peerId);
254
- req.setInfoKey("na", name);
255
- req.setInfoKey("ic", icon);
303
+ req.setInfoKey("na", appName);
304
+ req.setInfoKey("ic", iconUrl);
256
305
  req.setInfoKey("do", window.location.origin);
257
306
  if (session) {
258
307
  req.setInfoKey("exp", antelope.Int64.from(session.exp));
@@ -260,7 +309,6 @@ var WindConnector = class {
260
309
  }
261
310
  return req.encode(true, false, "vsr:");
262
311
  }
263
- /** ===== internal helpers ===== */
264
312
  #getLastSession() {
265
313
  const domain = typeof window !== "undefined" ? window.location.origin : "";
266
314
  if (!domain) return null;
@@ -293,6 +341,7 @@ var WindConnector = class {
293
341
  #onConnection(conn) {
294
342
  conn.once("data", (payload) => {
295
343
  const p = payload;
344
+ if (!p || typeof p.code !== "string") return;
296
345
  if (p.code === "LOGIN_OK") {
297
346
  const auth = signingRequest.Base64u.decode(p.result.auth);
298
347
  const proof = antelope.Serializer.decode({ data: auth, type: signingRequest.IdentityProof });
@@ -300,11 +349,11 @@ var WindConnector = class {
300
349
  session.permissionLevel = proof.signer;
301
350
  this.#addSession(proof.signer.toString(), p.result.exp, p.result.signature);
302
351
  this.#saveSession();
303
- this.#listeners.get("session")?.(session, proof);
352
+ this.#emit("session", session, proof);
304
353
  } else if (p.code === "RE_LOGIN_OK") {
305
354
  const session = new WalletSession(conn);
306
355
  session.permissionLevel = antelope.PermissionLevel.from(p.result.permission);
307
- this.#listeners.get("session")?.(session);
356
+ this.#emit("session", session);
308
357
  }
309
358
  });
310
359
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/zlib.ts","../src/WalletSession.ts","../src/WindConnector.ts"],"names":["pako","SigningRequest","SignedTransaction","Signature","Checksum512","assertBrowser","Peer","Int64","Base64u","Serializer","IdentityProof","PermissionLevel"],"mappings":"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","file":"index.cjs","sourcesContent":["import * as pako from 'pako'\n\nexport interface ZlibProvider {\n deflateRaw: (data: Uint8Array) => Uint8Array\n inflateRaw: (data: Uint8Array) => Uint8Array\n}\n\nexport const zlib: ZlibProvider = {\n deflateRaw: (data) => pako.deflateRaw(data),\n inflateRaw: (data) => pako.inflateRaw(data)\n}\n","import { SigningRequest } from '@wharfkit/signing-request'\nimport {\n Action,\n Checksum512,\n Name,\n PermissionLevel,\n PublicKey,\n Signature,\n SignedTransaction,\n Transaction,\n type SignedTransactionType\n} from '@wharfkit/antelope'\nimport { ABICache } from '@wharfkit/abicache'\nimport type { DataConnection } from 'peerjs'\nimport { zlib, type ZlibProvider } from './zlib'\n\ntype SendTxResponse = unknown\n\nexport interface TransactArguments {\n action?: Action\n actions?: Action[]\n transaction?: Transaction\n chainId?: string\n}\n\nexport interface TransactOptions {\n broadcast?: boolean\n}\n\ntype PendingCallback = (reply: unknown) => void\n\nfunction assertBrowser(): void {\n if (typeof window === 'undefined' || typeof crypto === 'undefined') {\n throw new Error('WalletSession requires browser environment (window/crypto).')\n }\n}\n\nexport class WalletSession {\n static readonly ChainID =\n 'f9f432b1851b5c179d2091a96f593aaed50ec7466b74f89301f957a83e56ce1f'\n\n #connection: DataConnection\n #callbacks: Map<string, PendingCallback>\n #encodingOptions?: { zlib: ZlibProvider; abiProvider?: ABICache }\n #permissionLevel?: PermissionLevel\n #closeListener?: () => void\n #errorListener?: (err: unknown) => void\n\n constructor(connection: DataConnection) {\n this.#connection = connection\n this.#callbacks = new Map()\n\n // peerjs types: (data: unknown) => void\n connection.on('data', (data: unknown) => this.#onDataReceived(data))\n connection.on('close', () => this.#closeListener?.())\n connection.on('error', (error) => this.#errorListener?.(error))\n }\n\n setABICache(cache: ABICache) {\n this.#encodingOptions = { zlib, abiProvider: cache }\n }\n\n onClose(listener: () => void) {\n this.#closeListener = listener\n }\n\n onError(listener: (err: unknown) => void) {\n this.#errorListener = listener\n }\n\n isOpen(): boolean {\n return Boolean(this.#connection.open)\n }\n\n close(): void {\n this.#connection.close()\n }\n\n get permissionLevel(): PermissionLevel | undefined {\n return this.#permissionLevel\n }\n set permissionLevel(value: PermissionLevel | undefined) {\n this.#permissionLevel = value\n }\n\n get actor(): Name | undefined {\n return this.#permissionLevel?.actor\n }\n\n get permission(): Name | undefined {\n return this.#permissionLevel?.permission\n }\n\n async transact(\n args: TransactArguments,\n options?: TransactOptions\n ): Promise<SignedTransaction | SendTxResponse> {\n assertBrowser()\n args.chainId = WalletSession.ChainID\n const willBroadcast = options?.broadcast ?? true\n\n const request = await SigningRequest.create(\n args,\n this.#encodingOptions ?? { zlib }\n )\n request.setBroadcast(willBroadcast)\n\n const vsr = request.encode(true, false, 'vsr:')\n return this.signingRequest(vsr)\n }\n\n signingRequest(vsr: string): Promise<SignedTransaction | SendTxResponse> {\n assertBrowser()\n const callback = crypto.randomUUID()\n const data = { method: 'signingRequest', id: callback, params: { vsr } }\n\n return new Promise((resolve, reject) => {\n const func: PendingCallback = (reply: unknown) => {\n const r = reply as { code: string; result?: unknown; error?: unknown }\n if (r.code === 'SENT') {\n resolve(r.result as SendTxResponse)\n } else if (r.code === 'SIGNED') {\n resolve(SignedTransaction.from(r.result as SignedTransactionType))\n } else {\n const err =\n typeof r.error === 'string'\n ? new Error(r.error)\n : (r.error as Error) ?? new Error('Unknown error')\n reject(err)\n }\n }\n this.#callbacks.set(callback, func)\n this.#connection.send(data)\n })\n }\n\n signMessage(message: string): Promise<Signature> {\n assertBrowser()\n const callback = crypto.randomUUID()\n const data = { method: 'signMessage', id: callback, params: { message } }\n\n return new Promise((resolve, reject) => {\n const func: PendingCallback = (reply: unknown) => {\n const r = reply as { code: string; result?: { signature: string }; error?: { message?: string } }\n if (r.code === 'SIGNED' && r.result?.signature) {\n resolve(Signature.from(r.result.signature))\n } else {\n reject(new Error(r.error?.message ?? 'Sign message failed'))\n }\n }\n this.#callbacks.set(callback, func)\n this.#connection.send(data)\n })\n }\n\n sharedSecret(publicKey: PublicKey): Promise<Checksum512> {\n assertBrowser()\n const callback = crypto.randomUUID()\n const data = {\n method: 'sharedSecret',\n id: callback,\n params: { key: publicKey.toString() }\n }\n\n return new Promise((resolve, reject) => {\n const func: PendingCallback = (reply: unknown) => {\n const r = reply as { code: string; result?: { secret: string }; error?: unknown }\n if (r.code === 'CREATED' && r.result?.secret) {\n resolve(Checksum512.from(r.result.secret))\n } else {\n reject(new Error(String(r.error ?? 'ECDH failed')))\n }\n }\n this.#callbacks.set(callback, func)\n this.#connection.send(data)\n })\n }\n\n // menerima unknown, lakukan narrowing di dalam\n #onDataReceived(data: unknown) {\n if (!data || typeof data !== 'object') return\n const maybe = data as { id?: string }\n if (!maybe.id || typeof maybe.id !== 'string') return\n const callback = this.#callbacks.get(maybe.id)\n if (callback) {\n callback(data)\n this.#callbacks.delete(maybe.id)\n }\n }\n}\n","import {\n Base64u,\n IdentityProof,\n SigningRequest,\n type SigningRequestCreateIdentityArguments\n} from '@wharfkit/signing-request'\nimport { Int64, PermissionLevel, Serializer } from '@wharfkit/antelope'\nimport { Peer, type DataConnection, type PeerOptions } from 'peerjs'\nimport { WalletSession } from './WalletSession'\nimport { zlib } from './zlib'\n\n/** Event yang didukung */\ntype WindConnectorEvent = 'open' | 'close' | 'disconnected' | 'error' | 'session'\n\ntype ListenerMap = Map<WindConnectorEvent | string, (...args: unknown[]) => void>\n\ninterface StoredSession {\n permission: string\n exp: number\n signature?: string\n domain: string\n peerId: string\n}\n\n/** Payload dari wallet saat koneksi pertama */\ninterface LoginOkPayload {\n code: 'LOGIN_OK'\n result: { auth: string; exp: number; signature?: string }\n}\n/** Payload dari wallet saat re-login (tanpa proof) */\ninterface ReLoginOkPayload {\n code: 'RE_LOGIN_OK'\n result: { permission: string }\n}\n\ntype IncomingPayload = LoginOkPayload | ReLoginOkPayload\n\nfunction assertBrowser(): void {\n if (typeof window === 'undefined' || typeof crypto === 'undefined') {\n throw new Error('WindConnector requires browser environment (window/crypto).')\n }\n}\n\nexport class WindConnector {\n #peer?: Peer\n #peerOptions: PeerOptions = {}\n #peerId?: string\n #listeners: ListenerMap = new Map()\n #session: Map<string, StoredSession> = new Map()\n\n /** Argumen identity yang sesuai typing @wharfkit */\n #identityArgs: SigningRequestCreateIdentityArguments = {\n chainId: WalletSession.ChainID,\n scope: 'vexanium',\n // beberapa versi typing menandai callback required; berikan placeholder\n callback: { url: '', background: false }\n }\n\n constructor() {\n this.#peerOptions.config = {\n iceServers: [\n { urls: 'stun:stun.l.google.com:19302' },\n { urls: 'stun:stun1.l.google.com:3478' },\n { urls: 'stun:stun.relay.metered.ca:80' },\n {\n urls: 'turn:asia.relay.metered.ca:80',\n username: 'b66cd40a117bddb5cde924ab',\n credential: '4jRmuTehVCZ2a/S+'\n }\n ],\n sdpSemantics: 'unified-plan'\n }\n this.#loadSession()\n }\n\n addIceServer(server: RTCIceServer) {\n if (!this.#peerOptions.config) this.#peerOptions.config = { iceServers: [] }\n ;(this.#peerOptions.config.iceServers as RTCIceServer[]).push(server)\n }\n\n setServer(host: string, port?: number) {\n this.#peerOptions.host = host\n if (typeof port === 'number') this.#peerOptions.port = port\n }\n\n /** Events: `open`, `close`, `disconnected`, `error`, `session` */\n on(event: WindConnectorEvent | string, func: (...args: unknown[]) => void) {\n this.#listeners.set(event, func)\n }\n\n async connect() {\n assertBrowser()\n if (!this.#peerId) throw new Error('Peer ID is not set')\n this.#peer = new Peer(this.#peerId, this.#peerOptions)\n this.#peer.on('connection', this.#onConnection.bind(this))\n this.#listeners.forEach((func, key) => this.#peer!.on(key as any, func))\n }\n\n disconnect() { this.#peer?.disconnect() }\n destroy() { this.#peer?.destroy() }\n reconnect() { this.#peer?.reconnect() }\n\n isDisconnected(): boolean { return Boolean(this.#peer?.disconnected) }\n isDestroyed(): boolean { return Boolean(this.#peer?.destroyed) }\n\n /**\n * Membuat VSR login untuk QR/URL.\n * @param name - App name\n * @param icon - Icon URL\n */\n createLoginRequest(name: string, icon: string): string {\n assertBrowser()\n const session = this.#getLastSession()\n if (session) {\n const [actor, perm] = session.permission.split('@')\n this.#identityArgs.account = actor\n this.#identityArgs.permission = perm\n this.#peerId = session.peerId\n } else {\n this.#peerId = `VEX-${crypto.randomUUID()}`\n // bersihkan akun/permission lama kalau ada\n delete this.#identityArgs.account\n delete this.#identityArgs.permission\n }\n\n const req = SigningRequest.identity(this.#identityArgs, { zlib })\n req.setInfoKey('pi', this.#peerId) // peer id\n req.setInfoKey('na', name) // app name\n req.setInfoKey('ic', icon) // icon url\n req.setInfoKey('do', window.location.origin) // domain origin\n\n if (session) {\n req.setInfoKey('exp', Int64.from(session.exp))\n if (session.signature) req.setInfoKey('sig', session.signature)\n }\n return req.encode(true, false, 'vsr:')\n }\n\n /** ===== internal helpers ===== */\n #getLastSession(): StoredSession | null {\n const domain = typeof window !== 'undefined' ? window.location.origin : ''\n if (!domain) return null\n const current = this.#session.get(domain)\n if (current && current.exp >= Date.now()) return current\n if (current) this.#session.delete(domain)\n return null\n }\n\n #addSession(permission: string, exp: number, signature?: string) {\n const domain = window.location.origin\n const peerId = this.#peerId ?? `VEX-${crypto.randomUUID()}`\n const current: StoredSession = { permission, exp, signature, domain, peerId }\n this.#session.set(domain, current)\n }\n\n #saveSession() {\n const data = Array.from(this.#session.values())\n sessionStorage.setItem('session', JSON.stringify(data))\n }\n\n #loadSession() {\n if (typeof window === 'undefined') return\n const raw = sessionStorage.getItem('session')\n if (!raw) return\n try {\n const data = JSON.parse(raw) as StoredSession[]\n for (const it of data) this.#session.set(it.domain, it)\n } catch {\n // corrupted storage → reset\n sessionStorage.removeItem('session')\n }\n }\n\n #onConnection(conn: DataConnection) {\n conn.once('data', (payload: unknown) => {\n const p = payload as IncomingPayload\n if (p.code === 'LOGIN_OK') {\n const auth = Base64u.decode(p.result.auth)\n const proof = Serializer.decode({ data: auth, type: IdentityProof })\n const session = new WalletSession(conn)\n session.permissionLevel = proof.signer\n\n this.#addSession(proof.signer.toString(), p.result.exp, p.result.signature)\n this.#saveSession()\n\n this.#listeners.get('session')?.(session, proof)\n } else if (p.code === 'RE_LOGIN_OK') {\n const session = new WalletSession(conn)\n session.permissionLevel = PermissionLevel.from(p.result.permission)\n this.#listeners.get('session')?.(session)\n }\n })\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/zlib.ts","../src/WalletSession.ts","../src/WindConnector.ts"],"names":["pako","SigningRequest","SignedTransaction","Signature","Checksum512","assertBrowser","Peer","Int64","Base64u","Serializer","IdentityProof","PermissionLevel"],"mappings":"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","file":"index.cjs","sourcesContent":["import * as pako from 'pako'\n\nexport interface ZlibProvider {\n deflateRaw: (data: Uint8Array) => Uint8Array\n inflateRaw: (data: Uint8Array) => Uint8Array\n}\n\nexport const zlib: ZlibProvider = {\n deflateRaw: (data) => pako.deflateRaw(data),\n inflateRaw: (data) => pako.inflateRaw(data)\n}\n","import { SigningRequest } from '@wharfkit/signing-request'\nimport {\n Action,\n Checksum512,\n Name,\n PermissionLevel,\n PublicKey,\n Signature,\n SignedTransaction,\n Transaction,\n type SignedTransactionType\n} from '@wharfkit/antelope'\nimport { ABICache } from '@wharfkit/abicache'\nimport type { DataConnection } from 'peerjs'\nimport { zlib, type ZlibProvider } from './zlib'\n\ntype SendTxResponse = unknown\n\nexport interface TransactArguments {\n action?: Action\n actions?: Action[]\n transaction?: Transaction\n chainId?: string\n}\n\nexport interface TransactOptions {\n broadcast?: boolean\n}\n\ntype PendingCallback = (reply: unknown) => void\n\nfunction assertBrowser(): void {\n if (typeof window === 'undefined' || typeof crypto === 'undefined') {\n throw new Error('WalletSession requires browser environment (window/crypto).')\n }\n}\n\nexport class WalletSession {\n static readonly ChainID =\n 'f9f432b1851b5c179d2091a96f593aaed50ec7466b74f89301f957a83e56ce1f'\n\n #connection: DataConnection\n #callbacks: Map<string, PendingCallback>\n #encodingOptions?: { zlib: ZlibProvider; abiProvider?: ABICache }\n #permissionLevel?: PermissionLevel\n #closeListener?: () => void\n #errorListener?: (err: unknown) => void\n\n constructor(connection: DataConnection) {\n this.#connection = connection\n this.#callbacks = new Map()\n\n connection.on('data', (data: unknown) => this.#onDataReceived(data))\n connection.on('close', () => this.#closeListener?.())\n connection.on('error', (error) => this.#errorListener?.(error))\n }\n\n setABICache(cache: ABICache) {\n this.#encodingOptions = { zlib, abiProvider: cache }\n }\n\n onClose(listener: () => void) {\n this.#closeListener = listener\n }\n\n onError(listener: (err: unknown) => void) {\n this.#errorListener = listener\n }\n\n isOpen(): boolean {\n return Boolean(this.#connection.open)\n }\n\n close(): void {\n this.#connection.close()\n }\n\n get permissionLevel(): PermissionLevel | undefined {\n return this.#permissionLevel\n }\n set permissionLevel(value: PermissionLevel | undefined) {\n this.#permissionLevel = value\n }\n\n get actor(): Name | undefined {\n return this.#permissionLevel?.actor\n }\n\n get permission(): Name | undefined {\n return this.#permissionLevel?.permission\n }\n\n async transact(\n args: TransactArguments,\n options?: TransactOptions\n ): Promise<SignedTransaction | SendTxResponse> {\n assertBrowser()\n args.chainId = WalletSession.ChainID\n const willBroadcast = options?.broadcast ?? true\n\n const request = await SigningRequest.create(\n args,\n this.#encodingOptions ?? { zlib }\n )\n request.setBroadcast(willBroadcast)\n\n const vsr = request.encode(true, false, 'vsr:')\n return this.signingRequest(vsr)\n }\n\n signingRequest(vsr: string): Promise<SignedTransaction | SendTxResponse> {\n assertBrowser()\n const callback = crypto.randomUUID()\n const data = { method: 'signingRequest', id: callback, params: { vsr } }\n\n return new Promise((resolve, reject) => {\n const func: PendingCallback = (reply: unknown) => {\n const r = reply as { code: string; result?: unknown; error?: unknown }\n if (r.code === 'SENT') {\n resolve(r.result as SendTxResponse)\n } else if (r.code === 'SIGNED') {\n resolve(SignedTransaction.from(r.result as SignedTransactionType))\n } else {\n const err =\n typeof r.error === 'string'\n ? new Error(r.error)\n : (r.error as Error) ?? new Error('Unknown error')\n reject(err)\n }\n }\n this.#callbacks.set(callback, func)\n this.#connection.send(data)\n })\n }\n\n signMessage(message: string): Promise<Signature> {\n assertBrowser()\n const callback = crypto.randomUUID()\n const data = { method: 'signMessage', id: callback, params: { message } }\n\n return new Promise((resolve, reject) => {\n const func: PendingCallback = (reply: unknown) => {\n const r = reply as { code: string; result?: { signature: string }; error?: { message?: string } }\n if (r.code === 'SIGNED' && r.result?.signature) {\n resolve(Signature.from(r.result.signature))\n } else {\n reject(new Error(r.error?.message ?? 'Sign message failed'))\n }\n }\n this.#callbacks.set(callback, func)\n this.#connection.send(data)\n })\n }\n\n sharedSecret(publicKey: PublicKey): Promise<Checksum512> {\n assertBrowser()\n const callback = crypto.randomUUID()\n const data = {\n method: 'sharedSecret',\n id: callback,\n params: { key: publicKey.toString() }\n }\n\n return new Promise((resolve, reject) => {\n const func: PendingCallback = (reply: unknown) => {\n const r = reply as { code: string; result?: { secret: string }; error?: unknown }\n if (r.code === 'CREATED' && r.result?.secret) {\n resolve(Checksum512.from(r.result.secret))\n } else {\n reject(new Error(String(r.error ?? 'ECDH failed')))\n }\n }\n this.#callbacks.set(callback, func)\n this.#connection.send(data)\n })\n }\n\n #onDataReceived(data: unknown) {\n if (!data || typeof data !== 'object') return\n const maybe = data as { id?: string }\n if (!maybe.id || typeof maybe.id !== 'string') return\n const callback = this.#callbacks.get(maybe.id)\n if (callback) {\n callback(data)\n this.#callbacks.delete(maybe.id)\n }\n }\n}\n","import {\n Base64u,\n IdentityProof,\n SigningRequest,\n type SigningRequestCreateIdentityArguments\n} from '@wharfkit/signing-request'\nimport { Int64, PermissionLevel, Serializer } from '@wharfkit/antelope'\nimport { Peer, type DataConnection, type PeerOptions } from 'peerjs'\nimport { WalletSession } from './WalletSession'\nimport { zlib } from './zlib'\n\ntype WindConnectorEvent = 'open' | 'close' | 'disconnected' | 'error' | 'session'\ntype Listener = (...args: unknown[]) => void\ntype ListenerMap = Map<WindConnectorEvent | string, Listener>\n\ninterface StoredSession {\n permission: string\n exp: number\n signature?: string\n domain: string\n peerId: string\n}\n\ninterface LoginOkPayload {\n code: 'LOGIN_OK'\n result: { auth: string; exp: number; signature?: string }\n}\ninterface ReLoginOkPayload {\n code: 'RE_LOGIN_OK'\n result: { permission: string }\n}\ntype IncomingPayload = LoginOkPayload | ReLoginOkPayload\n\nfunction assertBrowser(): void {\n if (typeof window === 'undefined' || typeof crypto === 'undefined') {\n throw new Error('WindConnector requires browser environment (window/crypto).')\n }\n}\n\nfunction isTurn(server: RTCIceServer): boolean {\n const urls = Array.isArray(server.urls) ? server.urls : [server.urls]\n return urls.some(u => typeof u === 'string' && (u.startsWith('turn:') || u.startsWith('turns:')))\n}\n\nfunction ensureTurnHasCred(server: RTCIceServer): void {\n if (isTurn(server) && (!server.username || !server.credential)) {\n throw new Error('TURN server requires username and credential.')\n }\n}\n\nexport class WindConnector {\n #peer?: Peer\n #peerOptions: PeerOptions\n #peerId?: string\n #listeners: ListenerMap = new Map()\n #session: Map<string, StoredSession> = new Map()\n\n #identityArgs: SigningRequestCreateIdentityArguments = {\n chainId: WalletSession.ChainID,\n scope: 'vexanium',\n callback: { url: '', background: false }\n }\n\n constructor() {\n this.#peerOptions = {\n host: 'core.windcrypto.com',\n port: 443,\n secure: true,\n path: '/',\n key: 'peerjs',\n config: {\n iceServers: [\n { urls: 'stun:stun.l.google.com:19302' },\n { urls: 'stun:stun1.l.google.com:3478' },\n { urls: 'stun:stun.relay.metered.ca:80' },\n {\n urls: 'turn:asia.relay.metered.ca:80',\n username: 'b66cd40a117bddb5cde924ab',\n credential: '4jRmuTehVCZ2a/S+'\n }\n ],\n sdpSemantics: 'unified-plan'\n }\n }\n for (const s of this.#peerOptions.config!.iceServers ?? []) ensureTurnHasCred(s)\n this.#loadSession()\n }\n\n \n setServer(host: string, opts?: { port?: number; secure?: boolean; path?: string; key?: string }) {\n if (!host) throw new Error('host is required')\n this.#peerOptions.host = host\n if (typeof opts?.port === 'number') this.#peerOptions.port = opts.port\n if (typeof opts?.secure === 'boolean') this.#peerOptions.secure = opts.secure\n if (typeof opts?.path === 'string') this.#peerOptions.path = opts.path\n if (typeof opts?.key === 'string') this.#peerOptions.key = opts.key\n }\n setPath(path: string) { this.#peerOptions.path = path || '/' }\n setKey(key: string) { this.#peerOptions.key = key || 'peerjs' }\n setSecure(v: boolean) { this.#peerOptions.secure = !!v }\n setPort(port: number) { this.#peerOptions.port = port }\n\n configureForCore() {\n this.setServer('core.windcrypto.com', { port: 443, secure: true, path: '/', key: 'peerjs' })\n }\n\n addIceServer(server: RTCIceServer) {\n ensureTurnHasCred(server)\n const cfg = this.#peerOptions.config ?? (this.#peerOptions.config = { iceServers: [] })\n ;(cfg.iceServers ?? (cfg.iceServers = [])).push(server)\n }\n\n setIceServers(servers: RTCIceServer[]) {\n for (const s of servers) ensureTurnHasCred(s)\n const cfg = this.#peerOptions.config ?? (this.#peerOptions.config = { iceServers: [] })\n cfg.iceServers = servers.slice()\n }\n\n clearIceServers() {\n const cfg = this.#peerOptions.config ?? (this.#peerOptions.config = { iceServers: [] })\n cfg.iceServers = []\n }\n\n \n on(event: WindConnectorEvent | string, func: Listener) {\n this.#listeners.set(event, func)\n }\n off(event: WindConnectorEvent | string) {\n this.#listeners.delete(event)\n }\n #emit(event: WindConnectorEvent | string, ...args: unknown[]) {\n this.#listeners.get(event)?.(...args)\n }\n\n \n async connect(): Promise<void> {\n assertBrowser()\n if (!this.#peerId) throw new Error('Peer ID is not set. Call createLoginRequest() first.')\n this.#peer = new Peer(this.#peerId, this.#peerOptions)\n\n this.#peer.on('open', (id: string) => this.#emit('open', id))\n this.#peer.on('close', () => this.#emit('close'))\n this.#peer.on('disconnected', () => this.#emit('disconnected'))\n this.#peer.on('error', (err: unknown) => this.#emit('error', err))\n\n this.#peer.on('connection', this.#onConnection.bind(this))\n }\n\n disconnect(): void { this.#peer?.disconnect() }\n destroy(): void { this.#peer?.destroy() }\n reconnect(): void { this.#peer?.reconnect() }\n\n isDisconnected(): boolean { return Boolean(this.#peer?.disconnected) }\n isDestroyed(): boolean { return Boolean(this.#peer?.destroyed) }\n\n get peerId(): string | undefined { return this.#peerId }\n\n createLoginRequest(appName: string, iconUrl: string): string {\n assertBrowser()\n const session = this.#getLastSession()\n\n if (session) {\n const [actor, perm] = session.permission.split('@')\n this.#identityArgs.account = actor\n this.#identityArgs.permission = perm\n this.#peerId = session.peerId\n } else {\n this.#peerId = `VEX-${crypto.randomUUID()}`\n delete this.#identityArgs.account\n delete this.#identityArgs.permission\n }\n\n const req = SigningRequest.identity(this.#identityArgs, { zlib })\n req.setInfoKey('pi', this.#peerId) // peer id\n req.setInfoKey('na', appName) // app name\n req.setInfoKey('ic', iconUrl) // icon url\n req.setInfoKey('do', window.location.origin) // domain origin\n\n if (session) {\n req.setInfoKey('exp', Int64.from(session.exp))\n if (session.signature) req.setInfoKey('sig', session.signature)\n }\n return req.encode(true, false, 'vsr:')\n }\n\n #getLastSession(): StoredSession | null {\n const domain = typeof window !== 'undefined' ? window.location.origin : ''\n if (!domain) return null\n const current = this.#session.get(domain)\n if (current && current.exp >= Date.now()) return current\n if (current) this.#session.delete(domain)\n return null\n }\n\n #addSession(permission: string, exp: number, signature?: string) {\n const domain = window.location.origin\n const peerId = this.#peerId ?? `VEX-${crypto.randomUUID()}`\n const current: StoredSession = { permission, exp, signature, domain, peerId }\n this.#session.set(domain, current)\n }\n\n #saveSession() {\n const data = Array.from(this.#session.values())\n sessionStorage.setItem('session', JSON.stringify(data))\n }\n\n #loadSession() {\n if (typeof window === 'undefined') return\n const raw = sessionStorage.getItem('session')\n if (!raw) return\n try {\n const data = JSON.parse(raw) as StoredSession[]\n for (const it of data) this.#session.set(it.domain, it)\n } catch {\n sessionStorage.removeItem('session')\n }\n }\n\n #onConnection(conn: DataConnection) {\n conn.once('data', (payload: unknown) => {\n const p = payload as IncomingPayload\n if (!p || typeof (p as any).code !== 'string') return\n\n if (p.code === 'LOGIN_OK') {\n const auth = Base64u.decode(p.result.auth)\n const proof = Serializer.decode({ data: auth, type: IdentityProof })\n const session = new WalletSession(conn)\n session.permissionLevel = proof.signer\n\n this.#addSession(proof.signer.toString(), p.result.exp, p.result.signature)\n this.#saveSession()\n\n this.#emit('session', session, proof)\n } else if (p.code === 'RE_LOGIN_OK') {\n const session = new WalletSession(conn)\n session.permissionLevel = PermissionLevel.from(p.result.permission)\n this.#emit('session', session)\n }\n })\n }\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -2,27 +2,35 @@ import { PermissionLevel, Name, Action, Transaction, SignedTransaction, Signatur
2
2
  import { ABICache } from '@wharfkit/abicache';
3
3
  import { DataConnection } from 'peerjs';
4
4
 
5
- /** Event yang didukung */
6
5
  type WindConnectorEvent = 'open' | 'close' | 'disconnected' | 'error' | 'session';
6
+ type Listener = (...args: unknown[]) => void;
7
7
  declare class WindConnector {
8
8
  #private;
9
9
  constructor();
10
+ setServer(host: string, opts?: {
11
+ port?: number;
12
+ secure?: boolean;
13
+ path?: string;
14
+ key?: string;
15
+ }): void;
16
+ setPath(path: string): void;
17
+ setKey(key: string): void;
18
+ setSecure(v: boolean): void;
19
+ setPort(port: number): void;
20
+ configureForCore(): void;
10
21
  addIceServer(server: RTCIceServer): void;
11
- setServer(host: string, port?: number): void;
12
- /** Events: `open`, `close`, `disconnected`, `error`, `session` */
13
- on(event: WindConnectorEvent | string, func: (...args: unknown[]) => void): void;
22
+ setIceServers(servers: RTCIceServer[]): void;
23
+ clearIceServers(): void;
24
+ on(event: WindConnectorEvent | string, func: Listener): void;
25
+ off(event: WindConnectorEvent | string): void;
14
26
  connect(): Promise<void>;
15
27
  disconnect(): void;
16
28
  destroy(): void;
17
29
  reconnect(): void;
18
30
  isDisconnected(): boolean;
19
31
  isDestroyed(): boolean;
20
- /**
21
- * Membuat VSR login untuk QR/URL.
22
- * @param name - App name
23
- * @param icon - Icon URL
24
- */
25
- createLoginRequest(name: string, icon: string): string;
32
+ get peerId(): string | undefined;
33
+ createLoginRequest(appName: string, iconUrl: string): string;
26
34
  }
27
35
 
28
36
  type SendTxResponse = unknown;
package/dist/index.d.ts CHANGED
@@ -2,27 +2,35 @@ import { PermissionLevel, Name, Action, Transaction, SignedTransaction, Signatur
2
2
  import { ABICache } from '@wharfkit/abicache';
3
3
  import { DataConnection } from 'peerjs';
4
4
 
5
- /** Event yang didukung */
6
5
  type WindConnectorEvent = 'open' | 'close' | 'disconnected' | 'error' | 'session';
6
+ type Listener = (...args: unknown[]) => void;
7
7
  declare class WindConnector {
8
8
  #private;
9
9
  constructor();
10
+ setServer(host: string, opts?: {
11
+ port?: number;
12
+ secure?: boolean;
13
+ path?: string;
14
+ key?: string;
15
+ }): void;
16
+ setPath(path: string): void;
17
+ setKey(key: string): void;
18
+ setSecure(v: boolean): void;
19
+ setPort(port: number): void;
20
+ configureForCore(): void;
10
21
  addIceServer(server: RTCIceServer): void;
11
- setServer(host: string, port?: number): void;
12
- /** Events: `open`, `close`, `disconnected`, `error`, `session` */
13
- on(event: WindConnectorEvent | string, func: (...args: unknown[]) => void): void;
22
+ setIceServers(servers: RTCIceServer[]): void;
23
+ clearIceServers(): void;
24
+ on(event: WindConnectorEvent | string, func: Listener): void;
25
+ off(event: WindConnectorEvent | string): void;
14
26
  connect(): Promise<void>;
15
27
  disconnect(): void;
16
28
  destroy(): void;
17
29
  reconnect(): void;
18
30
  isDisconnected(): boolean;
19
31
  isDestroyed(): boolean;
20
- /**
21
- * Membuat VSR login untuk QR/URL.
22
- * @param name - App name
23
- * @param icon - Icon URL
24
- */
25
- createLoginRequest(name: string, icon: string): string;
32
+ get peerId(): string | undefined;
33
+ createLoginRequest(appName: string, iconUrl: string): string;
26
34
  }
27
35
 
28
36
  type SendTxResponse = unknown;
package/dist/index.js CHANGED
@@ -127,7 +127,6 @@ var WalletSession = class _WalletSession {
127
127
  this.#connection.send(data);
128
128
  });
129
129
  }
130
- // menerima unknown, lakukan narrowing di dalam
131
130
  #onDataReceived(data) {
132
131
  if (!data || typeof data !== "object") return;
133
132
  const maybe = data;
@@ -146,53 +145,105 @@ function assertBrowser2() {
146
145
  throw new Error("WindConnector requires browser environment (window/crypto).");
147
146
  }
148
147
  }
148
+ function isTurn(server) {
149
+ const urls = Array.isArray(server.urls) ? server.urls : [server.urls];
150
+ return urls.some((u) => typeof u === "string" && (u.startsWith("turn:") || u.startsWith("turns:")));
151
+ }
152
+ function ensureTurnHasCred(server) {
153
+ if (isTurn(server) && (!server.username || !server.credential)) {
154
+ throw new Error("TURN server requires username and credential.");
155
+ }
156
+ }
149
157
  var WindConnector = class {
150
158
  #peer;
151
- #peerOptions = {};
159
+ #peerOptions;
152
160
  #peerId;
153
161
  #listeners = /* @__PURE__ */ new Map();
154
162
  #session = /* @__PURE__ */ new Map();
155
- /** Argumen identity yang sesuai typing @wharfkit */
156
163
  #identityArgs = {
157
164
  chainId: WalletSession.ChainID,
158
165
  scope: "vexanium",
159
- // beberapa versi typing menandai callback required; berikan placeholder
160
166
  callback: { url: "", background: false }
161
167
  };
162
168
  constructor() {
163
- this.#peerOptions.config = {
164
- iceServers: [
165
- { urls: "stun:stun.l.google.com:19302" },
166
- { urls: "stun:stun1.l.google.com:3478" },
167
- { urls: "stun:stun.relay.metered.ca:80" },
168
- {
169
- urls: "turn:asia.relay.metered.ca:80",
170
- username: "b66cd40a117bddb5cde924ab",
171
- credential: "4jRmuTehVCZ2a/S+"
172
- }
173
- ],
174
- sdpSemantics: "unified-plan"
169
+ this.#peerOptions = {
170
+ host: "core.windcrypto.com",
171
+ port: 443,
172
+ secure: true,
173
+ path: "/",
174
+ key: "peerjs",
175
+ config: {
176
+ iceServers: [
177
+ { urls: "stun:stun.l.google.com:19302" },
178
+ { urls: "stun:stun1.l.google.com:3478" },
179
+ { urls: "stun:stun.relay.metered.ca:80" },
180
+ {
181
+ urls: "turn:asia.relay.metered.ca:80",
182
+ username: "b66cd40a117bddb5cde924ab",
183
+ credential: "4jRmuTehVCZ2a/S+"
184
+ }
185
+ ],
186
+ sdpSemantics: "unified-plan"
187
+ }
175
188
  };
189
+ for (const s of this.#peerOptions.config.iceServers ?? []) ensureTurnHasCred(s);
176
190
  this.#loadSession();
177
191
  }
192
+ setServer(host, opts) {
193
+ if (!host) throw new Error("host is required");
194
+ this.#peerOptions.host = host;
195
+ if (typeof opts?.port === "number") this.#peerOptions.port = opts.port;
196
+ if (typeof opts?.secure === "boolean") this.#peerOptions.secure = opts.secure;
197
+ if (typeof opts?.path === "string") this.#peerOptions.path = opts.path;
198
+ if (typeof opts?.key === "string") this.#peerOptions.key = opts.key;
199
+ }
200
+ setPath(path) {
201
+ this.#peerOptions.path = path || "/";
202
+ }
203
+ setKey(key) {
204
+ this.#peerOptions.key = key || "peerjs";
205
+ }
206
+ setSecure(v) {
207
+ this.#peerOptions.secure = !!v;
208
+ }
209
+ setPort(port) {
210
+ this.#peerOptions.port = port;
211
+ }
212
+ configureForCore() {
213
+ this.setServer("core.windcrypto.com", { port: 443, secure: true, path: "/", key: "peerjs" });
214
+ }
178
215
  addIceServer(server) {
179
- if (!this.#peerOptions.config) this.#peerOptions.config = { iceServers: [] };
180
- this.#peerOptions.config.iceServers.push(server);
216
+ ensureTurnHasCred(server);
217
+ const cfg = this.#peerOptions.config ?? (this.#peerOptions.config = { iceServers: [] });
218
+ (cfg.iceServers ?? (cfg.iceServers = [])).push(server);
181
219
  }
182
- setServer(host, port) {
183
- this.#peerOptions.host = host;
184
- if (typeof port === "number") this.#peerOptions.port = port;
220
+ setIceServers(servers) {
221
+ for (const s of servers) ensureTurnHasCred(s);
222
+ const cfg = this.#peerOptions.config ?? (this.#peerOptions.config = { iceServers: [] });
223
+ cfg.iceServers = servers.slice();
224
+ }
225
+ clearIceServers() {
226
+ const cfg = this.#peerOptions.config ?? (this.#peerOptions.config = { iceServers: [] });
227
+ cfg.iceServers = [];
185
228
  }
186
- /** Events: `open`, `close`, `disconnected`, `error`, `session` */
187
229
  on(event, func) {
188
230
  this.#listeners.set(event, func);
189
231
  }
232
+ off(event) {
233
+ this.#listeners.delete(event);
234
+ }
235
+ #emit(event, ...args) {
236
+ this.#listeners.get(event)?.(...args);
237
+ }
190
238
  async connect() {
191
239
  assertBrowser2();
192
- if (!this.#peerId) throw new Error("Peer ID is not set");
240
+ if (!this.#peerId) throw new Error("Peer ID is not set. Call createLoginRequest() first.");
193
241
  this.#peer = new Peer(this.#peerId, this.#peerOptions);
242
+ this.#peer.on("open", (id) => this.#emit("open", id));
243
+ this.#peer.on("close", () => this.#emit("close"));
244
+ this.#peer.on("disconnected", () => this.#emit("disconnected"));
245
+ this.#peer.on("error", (err) => this.#emit("error", err));
194
246
  this.#peer.on("connection", this.#onConnection.bind(this));
195
- this.#listeners.forEach((func, key) => this.#peer.on(key, func));
196
247
  }
197
248
  disconnect() {
198
249
  this.#peer?.disconnect();
@@ -209,12 +260,10 @@ var WindConnector = class {
209
260
  isDestroyed() {
210
261
  return Boolean(this.#peer?.destroyed);
211
262
  }
212
- /**
213
- * Membuat VSR login untuk QR/URL.
214
- * @param name - App name
215
- * @param icon - Icon URL
216
- */
217
- createLoginRequest(name, icon) {
263
+ get peerId() {
264
+ return this.#peerId;
265
+ }
266
+ createLoginRequest(appName, iconUrl) {
218
267
  assertBrowser2();
219
268
  const session = this.#getLastSession();
220
269
  if (session) {
@@ -229,8 +278,8 @@ var WindConnector = class {
229
278
  }
230
279
  const req = SigningRequest.identity(this.#identityArgs, { zlib });
231
280
  req.setInfoKey("pi", this.#peerId);
232
- req.setInfoKey("na", name);
233
- req.setInfoKey("ic", icon);
281
+ req.setInfoKey("na", appName);
282
+ req.setInfoKey("ic", iconUrl);
234
283
  req.setInfoKey("do", window.location.origin);
235
284
  if (session) {
236
285
  req.setInfoKey("exp", Int64.from(session.exp));
@@ -238,7 +287,6 @@ var WindConnector = class {
238
287
  }
239
288
  return req.encode(true, false, "vsr:");
240
289
  }
241
- /** ===== internal helpers ===== */
242
290
  #getLastSession() {
243
291
  const domain = typeof window !== "undefined" ? window.location.origin : "";
244
292
  if (!domain) return null;
@@ -271,6 +319,7 @@ var WindConnector = class {
271
319
  #onConnection(conn) {
272
320
  conn.once("data", (payload) => {
273
321
  const p = payload;
322
+ if (!p || typeof p.code !== "string") return;
274
323
  if (p.code === "LOGIN_OK") {
275
324
  const auth = Base64u.decode(p.result.auth);
276
325
  const proof = Serializer.decode({ data: auth, type: IdentityProof });
@@ -278,11 +327,11 @@ var WindConnector = class {
278
327
  session.permissionLevel = proof.signer;
279
328
  this.#addSession(proof.signer.toString(), p.result.exp, p.result.signature);
280
329
  this.#saveSession();
281
- this.#listeners.get("session")?.(session, proof);
330
+ this.#emit("session", session, proof);
282
331
  } else if (p.code === "RE_LOGIN_OK") {
283
332
  const session = new WalletSession(conn);
284
333
  session.permissionLevel = PermissionLevel.from(p.result.permission);
285
- this.#listeners.get("session")?.(session);
334
+ this.#emit("session", session);
286
335
  }
287
336
  });
288
337
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/zlib.ts","../src/WalletSession.ts","../src/WindConnector.ts"],"names":["assertBrowser","SigningRequest","PermissionLevel"],"mappings":"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","file":"index.js","sourcesContent":["import * as pako from 'pako'\n\nexport interface ZlibProvider {\n deflateRaw: (data: Uint8Array) => Uint8Array\n inflateRaw: (data: Uint8Array) => Uint8Array\n}\n\nexport const zlib: ZlibProvider = {\n deflateRaw: (data) => pako.deflateRaw(data),\n inflateRaw: (data) => pako.inflateRaw(data)\n}\n","import { SigningRequest } from '@wharfkit/signing-request'\nimport {\n Action,\n Checksum512,\n Name,\n PermissionLevel,\n PublicKey,\n Signature,\n SignedTransaction,\n Transaction,\n type SignedTransactionType\n} from '@wharfkit/antelope'\nimport { ABICache } from '@wharfkit/abicache'\nimport type { DataConnection } from 'peerjs'\nimport { zlib, type ZlibProvider } from './zlib'\n\ntype SendTxResponse = unknown\n\nexport interface TransactArguments {\n action?: Action\n actions?: Action[]\n transaction?: Transaction\n chainId?: string\n}\n\nexport interface TransactOptions {\n broadcast?: boolean\n}\n\ntype PendingCallback = (reply: unknown) => void\n\nfunction assertBrowser(): void {\n if (typeof window === 'undefined' || typeof crypto === 'undefined') {\n throw new Error('WalletSession requires browser environment (window/crypto).')\n }\n}\n\nexport class WalletSession {\n static readonly ChainID =\n 'f9f432b1851b5c179d2091a96f593aaed50ec7466b74f89301f957a83e56ce1f'\n\n #connection: DataConnection\n #callbacks: Map<string, PendingCallback>\n #encodingOptions?: { zlib: ZlibProvider; abiProvider?: ABICache }\n #permissionLevel?: PermissionLevel\n #closeListener?: () => void\n #errorListener?: (err: unknown) => void\n\n constructor(connection: DataConnection) {\n this.#connection = connection\n this.#callbacks = new Map()\n\n // peerjs types: (data: unknown) => void\n connection.on('data', (data: unknown) => this.#onDataReceived(data))\n connection.on('close', () => this.#closeListener?.())\n connection.on('error', (error) => this.#errorListener?.(error))\n }\n\n setABICache(cache: ABICache) {\n this.#encodingOptions = { zlib, abiProvider: cache }\n }\n\n onClose(listener: () => void) {\n this.#closeListener = listener\n }\n\n onError(listener: (err: unknown) => void) {\n this.#errorListener = listener\n }\n\n isOpen(): boolean {\n return Boolean(this.#connection.open)\n }\n\n close(): void {\n this.#connection.close()\n }\n\n get permissionLevel(): PermissionLevel | undefined {\n return this.#permissionLevel\n }\n set permissionLevel(value: PermissionLevel | undefined) {\n this.#permissionLevel = value\n }\n\n get actor(): Name | undefined {\n return this.#permissionLevel?.actor\n }\n\n get permission(): Name | undefined {\n return this.#permissionLevel?.permission\n }\n\n async transact(\n args: TransactArguments,\n options?: TransactOptions\n ): Promise<SignedTransaction | SendTxResponse> {\n assertBrowser()\n args.chainId = WalletSession.ChainID\n const willBroadcast = options?.broadcast ?? true\n\n const request = await SigningRequest.create(\n args,\n this.#encodingOptions ?? { zlib }\n )\n request.setBroadcast(willBroadcast)\n\n const vsr = request.encode(true, false, 'vsr:')\n return this.signingRequest(vsr)\n }\n\n signingRequest(vsr: string): Promise<SignedTransaction | SendTxResponse> {\n assertBrowser()\n const callback = crypto.randomUUID()\n const data = { method: 'signingRequest', id: callback, params: { vsr } }\n\n return new Promise((resolve, reject) => {\n const func: PendingCallback = (reply: unknown) => {\n const r = reply as { code: string; result?: unknown; error?: unknown }\n if (r.code === 'SENT') {\n resolve(r.result as SendTxResponse)\n } else if (r.code === 'SIGNED') {\n resolve(SignedTransaction.from(r.result as SignedTransactionType))\n } else {\n const err =\n typeof r.error === 'string'\n ? new Error(r.error)\n : (r.error as Error) ?? new Error('Unknown error')\n reject(err)\n }\n }\n this.#callbacks.set(callback, func)\n this.#connection.send(data)\n })\n }\n\n signMessage(message: string): Promise<Signature> {\n assertBrowser()\n const callback = crypto.randomUUID()\n const data = { method: 'signMessage', id: callback, params: { message } }\n\n return new Promise((resolve, reject) => {\n const func: PendingCallback = (reply: unknown) => {\n const r = reply as { code: string; result?: { signature: string }; error?: { message?: string } }\n if (r.code === 'SIGNED' && r.result?.signature) {\n resolve(Signature.from(r.result.signature))\n } else {\n reject(new Error(r.error?.message ?? 'Sign message failed'))\n }\n }\n this.#callbacks.set(callback, func)\n this.#connection.send(data)\n })\n }\n\n sharedSecret(publicKey: PublicKey): Promise<Checksum512> {\n assertBrowser()\n const callback = crypto.randomUUID()\n const data = {\n method: 'sharedSecret',\n id: callback,\n params: { key: publicKey.toString() }\n }\n\n return new Promise((resolve, reject) => {\n const func: PendingCallback = (reply: unknown) => {\n const r = reply as { code: string; result?: { secret: string }; error?: unknown }\n if (r.code === 'CREATED' && r.result?.secret) {\n resolve(Checksum512.from(r.result.secret))\n } else {\n reject(new Error(String(r.error ?? 'ECDH failed')))\n }\n }\n this.#callbacks.set(callback, func)\n this.#connection.send(data)\n })\n }\n\n // menerima unknown, lakukan narrowing di dalam\n #onDataReceived(data: unknown) {\n if (!data || typeof data !== 'object') return\n const maybe = data as { id?: string }\n if (!maybe.id || typeof maybe.id !== 'string') return\n const callback = this.#callbacks.get(maybe.id)\n if (callback) {\n callback(data)\n this.#callbacks.delete(maybe.id)\n }\n }\n}\n","import {\n Base64u,\n IdentityProof,\n SigningRequest,\n type SigningRequestCreateIdentityArguments\n} from '@wharfkit/signing-request'\nimport { Int64, PermissionLevel, Serializer } from '@wharfkit/antelope'\nimport { Peer, type DataConnection, type PeerOptions } from 'peerjs'\nimport { WalletSession } from './WalletSession'\nimport { zlib } from './zlib'\n\n/** Event yang didukung */\ntype WindConnectorEvent = 'open' | 'close' | 'disconnected' | 'error' | 'session'\n\ntype ListenerMap = Map<WindConnectorEvent | string, (...args: unknown[]) => void>\n\ninterface StoredSession {\n permission: string\n exp: number\n signature?: string\n domain: string\n peerId: string\n}\n\n/** Payload dari wallet saat koneksi pertama */\ninterface LoginOkPayload {\n code: 'LOGIN_OK'\n result: { auth: string; exp: number; signature?: string }\n}\n/** Payload dari wallet saat re-login (tanpa proof) */\ninterface ReLoginOkPayload {\n code: 'RE_LOGIN_OK'\n result: { permission: string }\n}\n\ntype IncomingPayload = LoginOkPayload | ReLoginOkPayload\n\nfunction assertBrowser(): void {\n if (typeof window === 'undefined' || typeof crypto === 'undefined') {\n throw new Error('WindConnector requires browser environment (window/crypto).')\n }\n}\n\nexport class WindConnector {\n #peer?: Peer\n #peerOptions: PeerOptions = {}\n #peerId?: string\n #listeners: ListenerMap = new Map()\n #session: Map<string, StoredSession> = new Map()\n\n /** Argumen identity yang sesuai typing @wharfkit */\n #identityArgs: SigningRequestCreateIdentityArguments = {\n chainId: WalletSession.ChainID,\n scope: 'vexanium',\n // beberapa versi typing menandai callback required; berikan placeholder\n callback: { url: '', background: false }\n }\n\n constructor() {\n this.#peerOptions.config = {\n iceServers: [\n { urls: 'stun:stun.l.google.com:19302' },\n { urls: 'stun:stun1.l.google.com:3478' },\n { urls: 'stun:stun.relay.metered.ca:80' },\n {\n urls: 'turn:asia.relay.metered.ca:80',\n username: 'b66cd40a117bddb5cde924ab',\n credential: '4jRmuTehVCZ2a/S+'\n }\n ],\n sdpSemantics: 'unified-plan'\n }\n this.#loadSession()\n }\n\n addIceServer(server: RTCIceServer) {\n if (!this.#peerOptions.config) this.#peerOptions.config = { iceServers: [] }\n ;(this.#peerOptions.config.iceServers as RTCIceServer[]).push(server)\n }\n\n setServer(host: string, port?: number) {\n this.#peerOptions.host = host\n if (typeof port === 'number') this.#peerOptions.port = port\n }\n\n /** Events: `open`, `close`, `disconnected`, `error`, `session` */\n on(event: WindConnectorEvent | string, func: (...args: unknown[]) => void) {\n this.#listeners.set(event, func)\n }\n\n async connect() {\n assertBrowser()\n if (!this.#peerId) throw new Error('Peer ID is not set')\n this.#peer = new Peer(this.#peerId, this.#peerOptions)\n this.#peer.on('connection', this.#onConnection.bind(this))\n this.#listeners.forEach((func, key) => this.#peer!.on(key as any, func))\n }\n\n disconnect() { this.#peer?.disconnect() }\n destroy() { this.#peer?.destroy() }\n reconnect() { this.#peer?.reconnect() }\n\n isDisconnected(): boolean { return Boolean(this.#peer?.disconnected) }\n isDestroyed(): boolean { return Boolean(this.#peer?.destroyed) }\n\n /**\n * Membuat VSR login untuk QR/URL.\n * @param name - App name\n * @param icon - Icon URL\n */\n createLoginRequest(name: string, icon: string): string {\n assertBrowser()\n const session = this.#getLastSession()\n if (session) {\n const [actor, perm] = session.permission.split('@')\n this.#identityArgs.account = actor\n this.#identityArgs.permission = perm\n this.#peerId = session.peerId\n } else {\n this.#peerId = `VEX-${crypto.randomUUID()}`\n // bersihkan akun/permission lama kalau ada\n delete this.#identityArgs.account\n delete this.#identityArgs.permission\n }\n\n const req = SigningRequest.identity(this.#identityArgs, { zlib })\n req.setInfoKey('pi', this.#peerId) // peer id\n req.setInfoKey('na', name) // app name\n req.setInfoKey('ic', icon) // icon url\n req.setInfoKey('do', window.location.origin) // domain origin\n\n if (session) {\n req.setInfoKey('exp', Int64.from(session.exp))\n if (session.signature) req.setInfoKey('sig', session.signature)\n }\n return req.encode(true, false, 'vsr:')\n }\n\n /** ===== internal helpers ===== */\n #getLastSession(): StoredSession | null {\n const domain = typeof window !== 'undefined' ? window.location.origin : ''\n if (!domain) return null\n const current = this.#session.get(domain)\n if (current && current.exp >= Date.now()) return current\n if (current) this.#session.delete(domain)\n return null\n }\n\n #addSession(permission: string, exp: number, signature?: string) {\n const domain = window.location.origin\n const peerId = this.#peerId ?? `VEX-${crypto.randomUUID()}`\n const current: StoredSession = { permission, exp, signature, domain, peerId }\n this.#session.set(domain, current)\n }\n\n #saveSession() {\n const data = Array.from(this.#session.values())\n sessionStorage.setItem('session', JSON.stringify(data))\n }\n\n #loadSession() {\n if (typeof window === 'undefined') return\n const raw = sessionStorage.getItem('session')\n if (!raw) return\n try {\n const data = JSON.parse(raw) as StoredSession[]\n for (const it of data) this.#session.set(it.domain, it)\n } catch {\n // corrupted storage → reset\n sessionStorage.removeItem('session')\n }\n }\n\n #onConnection(conn: DataConnection) {\n conn.once('data', (payload: unknown) => {\n const p = payload as IncomingPayload\n if (p.code === 'LOGIN_OK') {\n const auth = Base64u.decode(p.result.auth)\n const proof = Serializer.decode({ data: auth, type: IdentityProof })\n const session = new WalletSession(conn)\n session.permissionLevel = proof.signer\n\n this.#addSession(proof.signer.toString(), p.result.exp, p.result.signature)\n this.#saveSession()\n\n this.#listeners.get('session')?.(session, proof)\n } else if (p.code === 'RE_LOGIN_OK') {\n const session = new WalletSession(conn)\n session.permissionLevel = PermissionLevel.from(p.result.permission)\n this.#listeners.get('session')?.(session)\n }\n })\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/zlib.ts","../src/WalletSession.ts","../src/WindConnector.ts"],"names":["assertBrowser","SigningRequest","PermissionLevel"],"mappings":"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","file":"index.js","sourcesContent":["import * as pako from 'pako'\n\nexport interface ZlibProvider {\n deflateRaw: (data: Uint8Array) => Uint8Array\n inflateRaw: (data: Uint8Array) => Uint8Array\n}\n\nexport const zlib: ZlibProvider = {\n deflateRaw: (data) => pako.deflateRaw(data),\n inflateRaw: (data) => pako.inflateRaw(data)\n}\n","import { SigningRequest } from '@wharfkit/signing-request'\nimport {\n Action,\n Checksum512,\n Name,\n PermissionLevel,\n PublicKey,\n Signature,\n SignedTransaction,\n Transaction,\n type SignedTransactionType\n} from '@wharfkit/antelope'\nimport { ABICache } from '@wharfkit/abicache'\nimport type { DataConnection } from 'peerjs'\nimport { zlib, type ZlibProvider } from './zlib'\n\ntype SendTxResponse = unknown\n\nexport interface TransactArguments {\n action?: Action\n actions?: Action[]\n transaction?: Transaction\n chainId?: string\n}\n\nexport interface TransactOptions {\n broadcast?: boolean\n}\n\ntype PendingCallback = (reply: unknown) => void\n\nfunction assertBrowser(): void {\n if (typeof window === 'undefined' || typeof crypto === 'undefined') {\n throw new Error('WalletSession requires browser environment (window/crypto).')\n }\n}\n\nexport class WalletSession {\n static readonly ChainID =\n 'f9f432b1851b5c179d2091a96f593aaed50ec7466b74f89301f957a83e56ce1f'\n\n #connection: DataConnection\n #callbacks: Map<string, PendingCallback>\n #encodingOptions?: { zlib: ZlibProvider; abiProvider?: ABICache }\n #permissionLevel?: PermissionLevel\n #closeListener?: () => void\n #errorListener?: (err: unknown) => void\n\n constructor(connection: DataConnection) {\n this.#connection = connection\n this.#callbacks = new Map()\n\n connection.on('data', (data: unknown) => this.#onDataReceived(data))\n connection.on('close', () => this.#closeListener?.())\n connection.on('error', (error) => this.#errorListener?.(error))\n }\n\n setABICache(cache: ABICache) {\n this.#encodingOptions = { zlib, abiProvider: cache }\n }\n\n onClose(listener: () => void) {\n this.#closeListener = listener\n }\n\n onError(listener: (err: unknown) => void) {\n this.#errorListener = listener\n }\n\n isOpen(): boolean {\n return Boolean(this.#connection.open)\n }\n\n close(): void {\n this.#connection.close()\n }\n\n get permissionLevel(): PermissionLevel | undefined {\n return this.#permissionLevel\n }\n set permissionLevel(value: PermissionLevel | undefined) {\n this.#permissionLevel = value\n }\n\n get actor(): Name | undefined {\n return this.#permissionLevel?.actor\n }\n\n get permission(): Name | undefined {\n return this.#permissionLevel?.permission\n }\n\n async transact(\n args: TransactArguments,\n options?: TransactOptions\n ): Promise<SignedTransaction | SendTxResponse> {\n assertBrowser()\n args.chainId = WalletSession.ChainID\n const willBroadcast = options?.broadcast ?? true\n\n const request = await SigningRequest.create(\n args,\n this.#encodingOptions ?? { zlib }\n )\n request.setBroadcast(willBroadcast)\n\n const vsr = request.encode(true, false, 'vsr:')\n return this.signingRequest(vsr)\n }\n\n signingRequest(vsr: string): Promise<SignedTransaction | SendTxResponse> {\n assertBrowser()\n const callback = crypto.randomUUID()\n const data = { method: 'signingRequest', id: callback, params: { vsr } }\n\n return new Promise((resolve, reject) => {\n const func: PendingCallback = (reply: unknown) => {\n const r = reply as { code: string; result?: unknown; error?: unknown }\n if (r.code === 'SENT') {\n resolve(r.result as SendTxResponse)\n } else if (r.code === 'SIGNED') {\n resolve(SignedTransaction.from(r.result as SignedTransactionType))\n } else {\n const err =\n typeof r.error === 'string'\n ? new Error(r.error)\n : (r.error as Error) ?? new Error('Unknown error')\n reject(err)\n }\n }\n this.#callbacks.set(callback, func)\n this.#connection.send(data)\n })\n }\n\n signMessage(message: string): Promise<Signature> {\n assertBrowser()\n const callback = crypto.randomUUID()\n const data = { method: 'signMessage', id: callback, params: { message } }\n\n return new Promise((resolve, reject) => {\n const func: PendingCallback = (reply: unknown) => {\n const r = reply as { code: string; result?: { signature: string }; error?: { message?: string } }\n if (r.code === 'SIGNED' && r.result?.signature) {\n resolve(Signature.from(r.result.signature))\n } else {\n reject(new Error(r.error?.message ?? 'Sign message failed'))\n }\n }\n this.#callbacks.set(callback, func)\n this.#connection.send(data)\n })\n }\n\n sharedSecret(publicKey: PublicKey): Promise<Checksum512> {\n assertBrowser()\n const callback = crypto.randomUUID()\n const data = {\n method: 'sharedSecret',\n id: callback,\n params: { key: publicKey.toString() }\n }\n\n return new Promise((resolve, reject) => {\n const func: PendingCallback = (reply: unknown) => {\n const r = reply as { code: string; result?: { secret: string }; error?: unknown }\n if (r.code === 'CREATED' && r.result?.secret) {\n resolve(Checksum512.from(r.result.secret))\n } else {\n reject(new Error(String(r.error ?? 'ECDH failed')))\n }\n }\n this.#callbacks.set(callback, func)\n this.#connection.send(data)\n })\n }\n\n #onDataReceived(data: unknown) {\n if (!data || typeof data !== 'object') return\n const maybe = data as { id?: string }\n if (!maybe.id || typeof maybe.id !== 'string') return\n const callback = this.#callbacks.get(maybe.id)\n if (callback) {\n callback(data)\n this.#callbacks.delete(maybe.id)\n }\n }\n}\n","import {\n Base64u,\n IdentityProof,\n SigningRequest,\n type SigningRequestCreateIdentityArguments\n} from '@wharfkit/signing-request'\nimport { Int64, PermissionLevel, Serializer } from '@wharfkit/antelope'\nimport { Peer, type DataConnection, type PeerOptions } from 'peerjs'\nimport { WalletSession } from './WalletSession'\nimport { zlib } from './zlib'\n\ntype WindConnectorEvent = 'open' | 'close' | 'disconnected' | 'error' | 'session'\ntype Listener = (...args: unknown[]) => void\ntype ListenerMap = Map<WindConnectorEvent | string, Listener>\n\ninterface StoredSession {\n permission: string\n exp: number\n signature?: string\n domain: string\n peerId: string\n}\n\ninterface LoginOkPayload {\n code: 'LOGIN_OK'\n result: { auth: string; exp: number; signature?: string }\n}\ninterface ReLoginOkPayload {\n code: 'RE_LOGIN_OK'\n result: { permission: string }\n}\ntype IncomingPayload = LoginOkPayload | ReLoginOkPayload\n\nfunction assertBrowser(): void {\n if (typeof window === 'undefined' || typeof crypto === 'undefined') {\n throw new Error('WindConnector requires browser environment (window/crypto).')\n }\n}\n\nfunction isTurn(server: RTCIceServer): boolean {\n const urls = Array.isArray(server.urls) ? server.urls : [server.urls]\n return urls.some(u => typeof u === 'string' && (u.startsWith('turn:') || u.startsWith('turns:')))\n}\n\nfunction ensureTurnHasCred(server: RTCIceServer): void {\n if (isTurn(server) && (!server.username || !server.credential)) {\n throw new Error('TURN server requires username and credential.')\n }\n}\n\nexport class WindConnector {\n #peer?: Peer\n #peerOptions: PeerOptions\n #peerId?: string\n #listeners: ListenerMap = new Map()\n #session: Map<string, StoredSession> = new Map()\n\n #identityArgs: SigningRequestCreateIdentityArguments = {\n chainId: WalletSession.ChainID,\n scope: 'vexanium',\n callback: { url: '', background: false }\n }\n\n constructor() {\n this.#peerOptions = {\n host: 'core.windcrypto.com',\n port: 443,\n secure: true,\n path: '/',\n key: 'peerjs',\n config: {\n iceServers: [\n { urls: 'stun:stun.l.google.com:19302' },\n { urls: 'stun:stun1.l.google.com:3478' },\n { urls: 'stun:stun.relay.metered.ca:80' },\n {\n urls: 'turn:asia.relay.metered.ca:80',\n username: 'b66cd40a117bddb5cde924ab',\n credential: '4jRmuTehVCZ2a/S+'\n }\n ],\n sdpSemantics: 'unified-plan'\n }\n }\n for (const s of this.#peerOptions.config!.iceServers ?? []) ensureTurnHasCred(s)\n this.#loadSession()\n }\n\n \n setServer(host: string, opts?: { port?: number; secure?: boolean; path?: string; key?: string }) {\n if (!host) throw new Error('host is required')\n this.#peerOptions.host = host\n if (typeof opts?.port === 'number') this.#peerOptions.port = opts.port\n if (typeof opts?.secure === 'boolean') this.#peerOptions.secure = opts.secure\n if (typeof opts?.path === 'string') this.#peerOptions.path = opts.path\n if (typeof opts?.key === 'string') this.#peerOptions.key = opts.key\n }\n setPath(path: string) { this.#peerOptions.path = path || '/' }\n setKey(key: string) { this.#peerOptions.key = key || 'peerjs' }\n setSecure(v: boolean) { this.#peerOptions.secure = !!v }\n setPort(port: number) { this.#peerOptions.port = port }\n\n configureForCore() {\n this.setServer('core.windcrypto.com', { port: 443, secure: true, path: '/', key: 'peerjs' })\n }\n\n addIceServer(server: RTCIceServer) {\n ensureTurnHasCred(server)\n const cfg = this.#peerOptions.config ?? (this.#peerOptions.config = { iceServers: [] })\n ;(cfg.iceServers ?? (cfg.iceServers = [])).push(server)\n }\n\n setIceServers(servers: RTCIceServer[]) {\n for (const s of servers) ensureTurnHasCred(s)\n const cfg = this.#peerOptions.config ?? (this.#peerOptions.config = { iceServers: [] })\n cfg.iceServers = servers.slice()\n }\n\n clearIceServers() {\n const cfg = this.#peerOptions.config ?? (this.#peerOptions.config = { iceServers: [] })\n cfg.iceServers = []\n }\n\n \n on(event: WindConnectorEvent | string, func: Listener) {\n this.#listeners.set(event, func)\n }\n off(event: WindConnectorEvent | string) {\n this.#listeners.delete(event)\n }\n #emit(event: WindConnectorEvent | string, ...args: unknown[]) {\n this.#listeners.get(event)?.(...args)\n }\n\n \n async connect(): Promise<void> {\n assertBrowser()\n if (!this.#peerId) throw new Error('Peer ID is not set. Call createLoginRequest() first.')\n this.#peer = new Peer(this.#peerId, this.#peerOptions)\n\n this.#peer.on('open', (id: string) => this.#emit('open', id))\n this.#peer.on('close', () => this.#emit('close'))\n this.#peer.on('disconnected', () => this.#emit('disconnected'))\n this.#peer.on('error', (err: unknown) => this.#emit('error', err))\n\n this.#peer.on('connection', this.#onConnection.bind(this))\n }\n\n disconnect(): void { this.#peer?.disconnect() }\n destroy(): void { this.#peer?.destroy() }\n reconnect(): void { this.#peer?.reconnect() }\n\n isDisconnected(): boolean { return Boolean(this.#peer?.disconnected) }\n isDestroyed(): boolean { return Boolean(this.#peer?.destroyed) }\n\n get peerId(): string | undefined { return this.#peerId }\n\n createLoginRequest(appName: string, iconUrl: string): string {\n assertBrowser()\n const session = this.#getLastSession()\n\n if (session) {\n const [actor, perm] = session.permission.split('@')\n this.#identityArgs.account = actor\n this.#identityArgs.permission = perm\n this.#peerId = session.peerId\n } else {\n this.#peerId = `VEX-${crypto.randomUUID()}`\n delete this.#identityArgs.account\n delete this.#identityArgs.permission\n }\n\n const req = SigningRequest.identity(this.#identityArgs, { zlib })\n req.setInfoKey('pi', this.#peerId) // peer id\n req.setInfoKey('na', appName) // app name\n req.setInfoKey('ic', iconUrl) // icon url\n req.setInfoKey('do', window.location.origin) // domain origin\n\n if (session) {\n req.setInfoKey('exp', Int64.from(session.exp))\n if (session.signature) req.setInfoKey('sig', session.signature)\n }\n return req.encode(true, false, 'vsr:')\n }\n\n #getLastSession(): StoredSession | null {\n const domain = typeof window !== 'undefined' ? window.location.origin : ''\n if (!domain) return null\n const current = this.#session.get(domain)\n if (current && current.exp >= Date.now()) return current\n if (current) this.#session.delete(domain)\n return null\n }\n\n #addSession(permission: string, exp: number, signature?: string) {\n const domain = window.location.origin\n const peerId = this.#peerId ?? `VEX-${crypto.randomUUID()}`\n const current: StoredSession = { permission, exp, signature, domain, peerId }\n this.#session.set(domain, current)\n }\n\n #saveSession() {\n const data = Array.from(this.#session.values())\n sessionStorage.setItem('session', JSON.stringify(data))\n }\n\n #loadSession() {\n if (typeof window === 'undefined') return\n const raw = sessionStorage.getItem('session')\n if (!raw) return\n try {\n const data = JSON.parse(raw) as StoredSession[]\n for (const it of data) this.#session.set(it.domain, it)\n } catch {\n sessionStorage.removeItem('session')\n }\n }\n\n #onConnection(conn: DataConnection) {\n conn.once('data', (payload: unknown) => {\n const p = payload as IncomingPayload\n if (!p || typeof (p as any).code !== 'string') return\n\n if (p.code === 'LOGIN_OK') {\n const auth = Base64u.decode(p.result.auth)\n const proof = Serializer.decode({ data: auth, type: IdentityProof })\n const session = new WalletSession(conn)\n session.permissionLevel = proof.signer\n\n this.#addSession(proof.signer.toString(), p.result.exp, p.result.signature)\n this.#saveSession()\n\n this.#emit('session', session, proof)\n } else if (p.code === 'RE_LOGIN_OK') {\n const session = new WalletSession(conn)\n session.permissionLevel = PermissionLevel.from(p.result.permission)\n this.#emit('session', session)\n }\n })\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "windkit",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "A protocol for connecting Vexanium DApps to the Wind wallet, enabling secure communication and transaction signing.",
5
5
  "repository": {
6
6
  "type": "git",