windkit 0.1.1 → 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.js ADDED
@@ -0,0 +1,342 @@
1
+ import { SigningRequest, Base64u, IdentityProof } from '@wharfkit/signing-request';
2
+ import { Int64, Serializer, PermissionLevel, SignedTransaction, Signature, Checksum512 } from '@wharfkit/antelope';
3
+ import { Peer } from 'peerjs';
4
+ import * as pako from 'pako';
5
+
6
+ // src/WindConnector.ts
7
+ var zlib = {
8
+ deflateRaw: (data) => pako.deflateRaw(data),
9
+ inflateRaw: (data) => pako.inflateRaw(data)
10
+ };
11
+
12
+ // src/WalletSession.ts
13
+ function assertBrowser() {
14
+ if (typeof window === "undefined" || typeof crypto === "undefined") {
15
+ throw new Error("WalletSession requires browser environment (window/crypto).");
16
+ }
17
+ }
18
+ var WalletSession = class _WalletSession {
19
+ static ChainID = "f9f432b1851b5c179d2091a96f593aaed50ec7466b74f89301f957a83e56ce1f";
20
+ #connection;
21
+ #callbacks;
22
+ #encodingOptions;
23
+ #permissionLevel;
24
+ #closeListener;
25
+ #errorListener;
26
+ constructor(connection) {
27
+ this.#connection = connection;
28
+ this.#callbacks = /* @__PURE__ */ new Map();
29
+ connection.on("data", (data) => this.#onDataReceived(data));
30
+ connection.on("close", () => this.#closeListener?.());
31
+ connection.on("error", (error) => this.#errorListener?.(error));
32
+ }
33
+ setABICache(cache) {
34
+ this.#encodingOptions = { zlib, abiProvider: cache };
35
+ }
36
+ onClose(listener) {
37
+ this.#closeListener = listener;
38
+ }
39
+ onError(listener) {
40
+ this.#errorListener = listener;
41
+ }
42
+ isOpen() {
43
+ return Boolean(this.#connection.open);
44
+ }
45
+ close() {
46
+ this.#connection.close();
47
+ }
48
+ get permissionLevel() {
49
+ return this.#permissionLevel;
50
+ }
51
+ set permissionLevel(value) {
52
+ this.#permissionLevel = value;
53
+ }
54
+ get actor() {
55
+ return this.#permissionLevel?.actor;
56
+ }
57
+ get permission() {
58
+ return this.#permissionLevel?.permission;
59
+ }
60
+ async transact(args, options) {
61
+ assertBrowser();
62
+ args.chainId = _WalletSession.ChainID;
63
+ const willBroadcast = options?.broadcast ?? true;
64
+ const request = await SigningRequest.create(
65
+ args,
66
+ this.#encodingOptions ?? { zlib }
67
+ );
68
+ request.setBroadcast(willBroadcast);
69
+ const vsr = request.encode(true, false, "vsr:");
70
+ return this.signingRequest(vsr);
71
+ }
72
+ signingRequest(vsr) {
73
+ assertBrowser();
74
+ const callback = crypto.randomUUID();
75
+ const data = { method: "signingRequest", id: callback, params: { vsr } };
76
+ return new Promise((resolve, reject) => {
77
+ const func = (reply) => {
78
+ const r = reply;
79
+ if (r.code === "SENT") {
80
+ resolve(r.result);
81
+ } else if (r.code === "SIGNED") {
82
+ resolve(SignedTransaction.from(r.result));
83
+ } else {
84
+ const err = typeof r.error === "string" ? new Error(r.error) : r.error ?? new Error("Unknown error");
85
+ reject(err);
86
+ }
87
+ };
88
+ this.#callbacks.set(callback, func);
89
+ this.#connection.send(data);
90
+ });
91
+ }
92
+ signMessage(message) {
93
+ assertBrowser();
94
+ const callback = crypto.randomUUID();
95
+ const data = { method: "signMessage", id: callback, params: { message } };
96
+ return new Promise((resolve, reject) => {
97
+ const func = (reply) => {
98
+ const r = reply;
99
+ if (r.code === "SIGNED" && r.result?.signature) {
100
+ resolve(Signature.from(r.result.signature));
101
+ } else {
102
+ reject(new Error(r.error?.message ?? "Sign message failed"));
103
+ }
104
+ };
105
+ this.#callbacks.set(callback, func);
106
+ this.#connection.send(data);
107
+ });
108
+ }
109
+ sharedSecret(publicKey) {
110
+ assertBrowser();
111
+ const callback = crypto.randomUUID();
112
+ const data = {
113
+ method: "sharedSecret",
114
+ id: callback,
115
+ params: { key: publicKey.toString() }
116
+ };
117
+ return new Promise((resolve, reject) => {
118
+ const func = (reply) => {
119
+ const r = reply;
120
+ if (r.code === "CREATED" && r.result?.secret) {
121
+ resolve(Checksum512.from(r.result.secret));
122
+ } else {
123
+ reject(new Error(String(r.error ?? "ECDH failed")));
124
+ }
125
+ };
126
+ this.#callbacks.set(callback, func);
127
+ this.#connection.send(data);
128
+ });
129
+ }
130
+ #onDataReceived(data) {
131
+ if (!data || typeof data !== "object") return;
132
+ const maybe = data;
133
+ if (!maybe.id || typeof maybe.id !== "string") return;
134
+ const callback = this.#callbacks.get(maybe.id);
135
+ if (callback) {
136
+ callback(data);
137
+ this.#callbacks.delete(maybe.id);
138
+ }
139
+ }
140
+ };
141
+
142
+ // src/WindConnector.ts
143
+ function assertBrowser2() {
144
+ if (typeof window === "undefined" || typeof crypto === "undefined") {
145
+ throw new Error("WindConnector requires browser environment (window/crypto).");
146
+ }
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
+ }
157
+ var WindConnector = class {
158
+ #peer;
159
+ #peerOptions;
160
+ #peerId;
161
+ #listeners = /* @__PURE__ */ new Map();
162
+ #session = /* @__PURE__ */ new Map();
163
+ #identityArgs = {
164
+ chainId: WalletSession.ChainID,
165
+ scope: "vexanium",
166
+ callback: { url: "", background: false }
167
+ };
168
+ constructor() {
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
+ }
188
+ };
189
+ for (const s of this.#peerOptions.config.iceServers ?? []) ensureTurnHasCred(s);
190
+ this.#loadSession();
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
+ }
215
+ addIceServer(server) {
216
+ ensureTurnHasCred(server);
217
+ const cfg = this.#peerOptions.config ?? (this.#peerOptions.config = { iceServers: [] });
218
+ (cfg.iceServers ?? (cfg.iceServers = [])).push(server);
219
+ }
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 = [];
228
+ }
229
+ on(event, func) {
230
+ this.#listeners.set(event, func);
231
+ }
232
+ off(event) {
233
+ this.#listeners.delete(event);
234
+ }
235
+ #emit(event, ...args) {
236
+ this.#listeners.get(event)?.(...args);
237
+ }
238
+ async connect() {
239
+ assertBrowser2();
240
+ if (!this.#peerId) throw new Error("Peer ID is not set. Call createLoginRequest() first.");
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));
246
+ this.#peer.on("connection", this.#onConnection.bind(this));
247
+ }
248
+ disconnect() {
249
+ this.#peer?.disconnect();
250
+ }
251
+ destroy() {
252
+ this.#peer?.destroy();
253
+ }
254
+ reconnect() {
255
+ this.#peer?.reconnect();
256
+ }
257
+ isDisconnected() {
258
+ return Boolean(this.#peer?.disconnected);
259
+ }
260
+ isDestroyed() {
261
+ return Boolean(this.#peer?.destroyed);
262
+ }
263
+ get peerId() {
264
+ return this.#peerId;
265
+ }
266
+ createLoginRequest(appName, iconUrl) {
267
+ assertBrowser2();
268
+ const session = this.#getLastSession();
269
+ if (session) {
270
+ const [actor, perm] = session.permission.split("@");
271
+ this.#identityArgs.account = actor;
272
+ this.#identityArgs.permission = perm;
273
+ this.#peerId = session.peerId;
274
+ } else {
275
+ this.#peerId = `VEX-${crypto.randomUUID()}`;
276
+ delete this.#identityArgs.account;
277
+ delete this.#identityArgs.permission;
278
+ }
279
+ const req = SigningRequest.identity(this.#identityArgs, { zlib });
280
+ req.setInfoKey("pi", this.#peerId);
281
+ req.setInfoKey("na", appName);
282
+ req.setInfoKey("ic", iconUrl);
283
+ req.setInfoKey("do", window.location.origin);
284
+ if (session) {
285
+ req.setInfoKey("exp", Int64.from(session.exp));
286
+ if (session.signature) req.setInfoKey("sig", session.signature);
287
+ }
288
+ return req.encode(true, false, "vsr:");
289
+ }
290
+ #getLastSession() {
291
+ const domain = typeof window !== "undefined" ? window.location.origin : "";
292
+ if (!domain) return null;
293
+ const current = this.#session.get(domain);
294
+ if (current && current.exp >= Date.now()) return current;
295
+ if (current) this.#session.delete(domain);
296
+ return null;
297
+ }
298
+ #addSession(permission, exp, signature) {
299
+ const domain = window.location.origin;
300
+ const peerId = this.#peerId ?? `VEX-${crypto.randomUUID()}`;
301
+ const current = { permission, exp, signature, domain, peerId };
302
+ this.#session.set(domain, current);
303
+ }
304
+ #saveSession() {
305
+ const data = Array.from(this.#session.values());
306
+ sessionStorage.setItem("session", JSON.stringify(data));
307
+ }
308
+ #loadSession() {
309
+ if (typeof window === "undefined") return;
310
+ const raw = sessionStorage.getItem("session");
311
+ if (!raw) return;
312
+ try {
313
+ const data = JSON.parse(raw);
314
+ for (const it of data) this.#session.set(it.domain, it);
315
+ } catch {
316
+ sessionStorage.removeItem("session");
317
+ }
318
+ }
319
+ #onConnection(conn) {
320
+ conn.once("data", (payload) => {
321
+ const p = payload;
322
+ if (!p || typeof p.code !== "string") return;
323
+ if (p.code === "LOGIN_OK") {
324
+ const auth = Base64u.decode(p.result.auth);
325
+ const proof = Serializer.decode({ data: auth, type: IdentityProof });
326
+ const session = new WalletSession(conn);
327
+ session.permissionLevel = proof.signer;
328
+ this.#addSession(proof.signer.toString(), p.result.exp, p.result.signature);
329
+ this.#saveSession();
330
+ this.#emit("session", session, proof);
331
+ } else if (p.code === "RE_LOGIN_OK") {
332
+ const session = new WalletSession(conn);
333
+ session.permissionLevel = PermissionLevel.from(p.result.permission);
334
+ this.#emit("session", session);
335
+ }
336
+ });
337
+ }
338
+ };
339
+
340
+ export { WalletSession, WindConnector };
341
+ //# sourceMappingURL=index.js.map
342
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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 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,15 +1,11 @@
1
1
  {
2
2
  "name": "windkit",
3
- "version": "0.1.1",
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",
7
7
  "url": "git+https://github.com/windvex/windkit.git"
8
8
  },
9
- "main": "index.js",
10
- "scripts": {
11
- "test": "echo \"Error: no test specified\" && exit 1"
12
- },
13
9
  "keywords": [
14
10
  "cryptocurrency",
15
11
  "web3",
@@ -24,11 +20,42 @@
24
20
  ],
25
21
  "license": "MIT",
26
22
  "type": "module",
23
+ "main": "dist/index.cjs",
24
+ "module": "dist/index.js",
25
+ "types": "dist/index.d.ts",
26
+ "exports": {
27
+ ".": {
28
+ "import": {
29
+ "types": "./dist/index.d.ts",
30
+ "default": "./dist/index.js"
31
+ },
32
+ "require": {
33
+ "types": "./dist/index.d.ts",
34
+ "default": "./dist/index.cjs"
35
+ }
36
+ }
37
+ },
38
+ "files": [
39
+ "dist",
40
+ "README.md",
41
+ "LICENSE"
42
+ ],
43
+ "scripts": {
44
+ "build": "tsup",
45
+ "clean": "rm -rf dist",
46
+ "prepublishOnly": "npm run clean && npm run build",
47
+ "test": "echo \"(no tests yet)\""
48
+ },
27
49
  "dependencies": {
28
50
  "@wharfkit/abicache": "^1.2.2",
29
51
  "@wharfkit/antelope": "^1.0.13",
30
52
  "@wharfkit/signing-request": "^3.2.0",
31
53
  "pako": "^2.1.0",
32
54
  "peerjs": "^1.5.4"
55
+ },
56
+ "devDependencies": {
57
+ "@types/pako": "^2.0.4",
58
+ "tsup": "^8.5.0",
59
+ "typescript": "^5.9.3"
33
60
  }
34
- }
61
+ }
package/index.js DELETED
@@ -1,4 +0,0 @@
1
- import { WindConnector } from "./src/WindConnector.js";
2
- import { WalletSession } from "./src/WalletSession.js";
3
-
4
- export { WindConnector, WalletSession };