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 +84 -35
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +18 -10
- package/dist/index.d.ts +18 -10
- package/dist/index.js +84 -35
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
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
|
-
|
|
202
|
-
this.#peerOptions.config.iceServers
|
|
238
|
+
ensureTurnHasCred(server);
|
|
239
|
+
const cfg = this.#peerOptions.config ?? (this.#peerOptions.config = { iceServers: [] });
|
|
240
|
+
(cfg.iceServers ?? (cfg.iceServers = [])).push(server);
|
|
203
241
|
}
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
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
|
-
|
|
236
|
-
|
|
237
|
-
|
|
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",
|
|
255
|
-
req.setInfoKey("ic",
|
|
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.#
|
|
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.#
|
|
356
|
+
this.#emit("session", session);
|
|
308
357
|
}
|
|
309
358
|
});
|
|
310
359
|
}
|
package/dist/index.cjs.map
CHANGED
|
@@ -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
|
-
|
|
12
|
-
|
|
13
|
-
on(event: WindConnectorEvent | string, func:
|
|
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
|
-
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
on(event: WindConnectorEvent | string, func:
|
|
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
|
-
|
|
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
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
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
|
-
|
|
180
|
-
this.#peerOptions.config.iceServers
|
|
216
|
+
ensureTurnHasCred(server);
|
|
217
|
+
const cfg = this.#peerOptions.config ?? (this.#peerOptions.config = { iceServers: [] });
|
|
218
|
+
(cfg.iceServers ?? (cfg.iceServers = [])).push(server);
|
|
181
219
|
}
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
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
|
-
|
|
214
|
-
|
|
215
|
-
|
|
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",
|
|
233
|
-
req.setInfoKey("ic",
|
|
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.#
|
|
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.#
|
|
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"]}
|