@pollar/core 0.3.9

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.mjs ADDED
@@ -0,0 +1,1485 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __commonJS = (cb, mod) => function __require() {
8
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
19
+ // If the importer is in node compatibility mode or this is not an ESM
20
+ // file that has been converted to a CommonJS file using a Babel-
21
+ // compatible transform (i.e. "__esModule" has not been set), then set
22
+ // "default" to the CommonJS "module.exports" for node compatibility.
23
+ !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
24
+ mod
25
+ ));
26
+
27
+ // ../../node_modules/@stellar/freighter-api/build/index.min.js
28
+ var require_index_min = __commonJS({
29
+ "../../node_modules/@stellar/freighter-api/build/index.min.js"(exports$1, module) {
30
+ !(function(e, r) {
31
+ "object" == typeof exports$1 && "object" == typeof module ? module.exports = r() : "function" == typeof define && define.amd ? define([], r) : "object" == typeof exports$1 ? exports$1.freighterApi = r() : e.freighterApi = r();
32
+ })(exports$1, (() => (() => {
33
+ var e, r, E = { d: (e2, r2) => {
34
+ for (var o2 in r2) E.o(r2, o2) && !E.o(e2, o2) && Object.defineProperty(e2, o2, { enumerable: true, get: r2[o2] });
35
+ }, o: (e2, r2) => Object.prototype.hasOwnProperty.call(e2, r2), r: (e2) => {
36
+ "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e2, Symbol.toStringTag, { value: "Module" }), Object.defineProperty(e2, "__esModule", { value: true });
37
+ } }, o = {};
38
+ E.r(o), E.d(o, { default: () => I, getNetwork: () => N, getNetworkDetails: () => s, getPublicKey: () => _, getUserInfo: () => R, isAllowed: () => C, isBrowser: () => c, isConnected: () => n, requestAccess: () => i, setAllowed: () => O, signAuthEntry: () => S, signBlob: () => A, signTransaction: () => t }), (function(e2) {
39
+ e2.CREATE_ACCOUNT = "CREATE_ACCOUNT", e2.FUND_ACCOUNT = "FUND_ACCOUNT", e2.ADD_ACCOUNT = "ADD_ACCOUNT", e2.IMPORT_ACCOUNT = "IMPORT_ACCOUNT", e2.IMPORT_HARDWARE_WALLET = "IMPORT_HARDWARE_WALLET", e2.LOAD_ACCOUNT = "LOAD_ACCOUNT", e2.MAKE_ACCOUNT_ACTIVE = "MAKE_ACCOUNT_ACTIVE", e2.UPDATE_ACCOUNT_NAME = "UPDATE_ACCOUNT_NAME", e2.GET_MNEMONIC_PHRASE = "GET_MNEMONIC_PHRASE", e2.CONFIRM_MNEMONIC_PHRASE = "CONFIRM_MNEMONIC_PHRASE", e2.CONFIRM_MIGRATED_MNEMONIC_PHRASE = "CONFIRM_MIGRATED_MNEMONIC_PHRASE", e2.RECOVER_ACCOUNT = "RECOVER_ACCOUNT", e2.CONFIRM_PASSWORD = "CONFIRM_PASSWORD", e2.REJECT_ACCESS = "REJECT_ACCESS", e2.GRANT_ACCESS = "GRANT_ACCESS", e2.SIGN_TRANSACTION = "SIGN_TRANSACTION", e2.SIGN_BLOB = "SIGN_BLOB", e2.SIGN_AUTH_ENTRY = "SIGN_AUTH_ENTRY", e2.HANDLE_SIGNED_HW_TRANSACTION = "HANDLE_SIGNED_HW_TRANSACTION", e2.REJECT_TRANSACTION = "REJECT_TRANSACTION", e2.SIGN_FREIGHTER_TRANSACTION = "SIGN_FREIGHTER_TRANSACTION", e2.SIGN_FREIGHTER_SOROBAN_TRANSACTION = "SIGN_FREIGHTER_SOROBAN_TRANSACTION", e2.ADD_RECENT_ADDRESS = "ADD_RECENT_ADDRESS", e2.LOAD_RECENT_ADDRESSES = "LOAD_RECENT_ADDRESSES", e2.SIGN_OUT = "SIGN_OUT", e2.SHOW_BACKUP_PHRASE = "SHOW_BACKUP_PHRASE", e2.SAVE_ALLOWLIST = "SAVE_ALLOWLIST", e2.SAVE_SETTINGS = "SAVE_SETTINGS", e2.LOAD_SETTINGS = "LOAD_SETTINGS", e2.GET_CACHED_ASSET_ICON = "GET_CACHED_ASSET_ICON", e2.CACHE_ASSET_ICON = "CACHE_ASSET_ICON", e2.GET_CACHED_ASSET_DOMAIN = "GET_CACHED_ASSET_DOMAIN", e2.CACHE_ASSET_DOMAIN = "CACHE_ASSET_DOMAIN", e2.GET_BLOCKED_ACCOUNTS = "GET_BLOCKED_ACCOUNTS", e2.GET_BLOCKED_DOMAINS = "GET_BLOCKED_DOMAINS", e2.ADD_CUSTOM_NETWORK = "ADD_CUSTOM_NETWORK", e2.CHANGE_NETWORK = "CHANGE_NETWORK", e2.REMOVE_CUSTOM_NETWORK = "REMOVE_CUSTOM_NETWORK", e2.EDIT_CUSTOM_NETWORK = "EDIT_CUSTOM_NETWORK", e2.RESET_EXP_DATA = "RESET_EXP_DATA", e2.ADD_TOKEN_ID = "ADD_TOKEN_ID", e2.GET_TOKEN_IDS = "GET_TOKEN_IDS", e2.REMOVE_TOKEN_ID = "REMOVE_TOKEN_ID", e2.GET_MIGRATABLE_ACCOUNTS = "GET_MIGRATABLE_ACCOUNTS", e2.GET_MIGRATED_MNEMONIC_PHRASE = "GET_MIGRATED_MNEMONIC_PHRASE", e2.MIGRATE_ACCOUNTS = "MIGRATE_ACCOUNTS";
40
+ })(e || (e = {})), (function(e2) {
41
+ e2.REQUEST_ACCESS = "REQUEST_ACCESS", e2.REQUEST_PUBLIC_KEY = "REQUEST_PUBLIC_KEY", e2.SUBMIT_TRANSACTION = "SUBMIT_TRANSACTION", e2.SUBMIT_BLOB = "SUBMIT_BLOB", e2.SUBMIT_AUTH_ENTRY = "SUBMIT_AUTH_ENTRY", e2.REQUEST_NETWORK = "REQUEST_NETWORK", e2.REQUEST_NETWORK_DETAILS = "REQUEST_NETWORK_DETAILS", e2.REQUEST_CONNECTION_STATUS = "REQUEST_CONNECTION_STATUS", e2.REQUEST_ALLOWED_STATUS = "REQUEST_ALLOWED_STATUS", e2.SET_ALLOWED_STATUS = "SET_ALLOWED_STATUS", e2.REQUEST_USER_INFO = "REQUEST_USER_INFO";
42
+ })(r || (r = {}));
43
+ const T = (e2) => {
44
+ const E2 = Date.now() + Math.random();
45
+ return window.postMessage({ source: "FREIGHTER_EXTERNAL_MSG_REQUEST", messageId: E2, ...e2 }, window.location.origin), new Promise(((o2) => {
46
+ let T2 = 0;
47
+ e2.type !== r.REQUEST_CONNECTION_STATUS && e2.type !== r.REQUEST_PUBLIC_KEY || (T2 = setTimeout((() => {
48
+ o2({ isConnected: false, publicKey: "" }), window.removeEventListener("message", _2);
49
+ }), 2e3));
50
+ const _2 = (e3) => {
51
+ var r2, t2;
52
+ e3.source === window && "FREIGHTER_EXTERNAL_MSG_RESPONSE" === (null === (r2 = null == e3 ? void 0 : e3.data) || void 0 === r2 ? void 0 : r2.source) && (null === (t2 = null == e3 ? void 0 : e3.data) || void 0 === t2 ? void 0 : t2.messagedId) === E2 && (o2(e3.data), window.removeEventListener("message", _2), clearTimeout(T2));
53
+ };
54
+ window.addEventListener("message", _2, false);
55
+ }));
56
+ }, _ = () => c ? (async () => {
57
+ let e2 = { publicKey: "", error: "" };
58
+ try {
59
+ e2 = await T({ type: r.REQUEST_PUBLIC_KEY });
60
+ } catch (e3) {
61
+ console.error(e3);
62
+ }
63
+ const { publicKey: E2, error: o2 } = e2;
64
+ if (o2) throw o2;
65
+ return E2;
66
+ })() : Promise.resolve(""), t = (e2, E2) => c ? (async (e3, E3, o2) => {
67
+ let _2 = "", t2 = "", A2 = "";
68
+ "object" == typeof E3 ? (_2 = E3.network || "", t2 = E3.accountToSign || "", A2 = E3.networkPassphrase || "") : (_2 = E3 || "", t2 = "");
69
+ let S2 = { signedTransaction: "", error: "" };
70
+ try {
71
+ S2 = await T({ transactionXdr: e3, network: _2, networkPassphrase: A2, accountToSign: t2, type: r.SUBMIT_TRANSACTION });
72
+ } catch (e4) {
73
+ throw console.error(e4), e4;
74
+ }
75
+ const { signedTransaction: n2, error: N2 } = S2;
76
+ if (N2) throw N2;
77
+ return n2;
78
+ })(e2, E2) : Promise.resolve(""), A = (e2, E2) => c ? (async (e3, E3) => {
79
+ let o2 = { signedBlob: "", error: "" };
80
+ const _2 = (E3 || {}).accountToSign || "";
81
+ try {
82
+ o2 = await T({ blob: e3, accountToSign: _2, type: r.SUBMIT_BLOB });
83
+ } catch (e4) {
84
+ throw console.error(e4), e4;
85
+ }
86
+ const { signedBlob: t2, error: A2 } = o2;
87
+ if (A2) throw A2;
88
+ return t2;
89
+ })(e2, E2) : Promise.resolve(""), S = (e2, E2) => c ? (async (e3, E3) => {
90
+ let o2 = { signedAuthEntry: "", error: "" };
91
+ const _2 = (E3 || {}).accountToSign || "";
92
+ try {
93
+ o2 = await T({ entryXdr: e3, accountToSign: _2, type: r.SUBMIT_AUTH_ENTRY });
94
+ } catch (e4) {
95
+ console.error(e4);
96
+ }
97
+ const { signedAuthEntry: t2, error: A2 } = o2;
98
+ if (A2) throw A2;
99
+ return t2;
100
+ })(e2, E2) : Promise.resolve(""), n = () => c ? window.freighter ? Promise.resolve(window.freighter) : (async () => {
101
+ let e2 = { isConnected: false };
102
+ try {
103
+ e2 = await T({ type: r.REQUEST_CONNECTION_STATUS });
104
+ } catch (e3) {
105
+ console.error(e3);
106
+ }
107
+ return e2.isConnected;
108
+ })() : Promise.resolve(false), N = () => c ? (async () => {
109
+ let e2 = { network: "", error: "" };
110
+ try {
111
+ e2 = await T({ type: r.REQUEST_NETWORK });
112
+ } catch (e3) {
113
+ console.error(e3);
114
+ }
115
+ const { network: E2, error: o2 } = e2;
116
+ if (o2) throw o2;
117
+ return E2;
118
+ })() : Promise.resolve(""), s = () => c ? (async () => {
119
+ let e2 = { networkDetails: { network: "", networkName: "", networkUrl: "", networkPassphrase: "", sorobanRpcUrl: void 0 }, error: "" };
120
+ try {
121
+ e2 = await T({ type: r.REQUEST_NETWORK_DETAILS });
122
+ } catch (e3) {
123
+ console.error(e3);
124
+ }
125
+ const { networkDetails: E2, error: o2 } = e2, { network: _2, networkUrl: t2, networkPassphrase: A2, sorobanRpcUrl: S2 } = E2;
126
+ if (o2) throw o2;
127
+ return { network: _2, networkUrl: t2, networkPassphrase: A2, sorobanRpcUrl: S2 };
128
+ })() : Promise.resolve({ network: "", networkUrl: "", networkPassphrase: "", sorobanRpcUrl: "" }), C = () => c ? (async () => {
129
+ let e2 = { isAllowed: false };
130
+ try {
131
+ e2 = await T({ type: r.REQUEST_ALLOWED_STATUS });
132
+ } catch (e3) {
133
+ console.error(e3);
134
+ }
135
+ return e2.isAllowed;
136
+ })() : Promise.resolve(false), O = () => c ? (async () => {
137
+ let e2 = { isAllowed: false, error: "" };
138
+ try {
139
+ e2 = await T({ type: r.SET_ALLOWED_STATUS });
140
+ } catch (e3) {
141
+ console.error(e3);
142
+ }
143
+ const { isAllowed: E2, error: o2 } = e2;
144
+ if (o2) throw o2;
145
+ return E2;
146
+ })() : Promise.resolve(false), R = () => c ? (async () => {
147
+ let e2 = { userInfo: { publicKey: "" }, error: "" };
148
+ try {
149
+ e2 = await T({ type: r.REQUEST_USER_INFO });
150
+ } catch (e3) {
151
+ console.error(e3);
152
+ }
153
+ const { userInfo: E2, error: o2 } = e2;
154
+ if (o2) throw o2;
155
+ return E2;
156
+ })() : Promise.resolve({ publicKey: "" }), i = () => c ? (async () => {
157
+ let e2 = { publicKey: "", error: "" };
158
+ try {
159
+ e2 = await T({ type: r.REQUEST_ACCESS });
160
+ } catch (e3) {
161
+ console.error(e3);
162
+ }
163
+ const { publicKey: E2, error: o2 } = e2;
164
+ if (o2) throw o2;
165
+ return E2;
166
+ })() : Promise.resolve(""), c = "undefined" != typeof window, I = { getPublicKey: _, signTransaction: t, signBlob: A, signAuthEntry: S, isConnected: n, getNetwork: N, getNetworkDetails: s, isAllowed: C, setAllowed: O, getUserInfo: R, requestAccess: i };
167
+ return o;
168
+ })()));
169
+ }
170
+ });
171
+
172
+ // ../../node_modules/openapi-fetch/dist/index.mjs
173
+ var PATH_PARAM_RE = /\{[^{}]+\}/g;
174
+ var supportsRequestInitExt = () => {
175
+ return typeof process === "object" && Number.parseInt(process?.versions?.node?.substring(0, 2)) >= 18 && process.versions.undici;
176
+ };
177
+ function randomID() {
178
+ return Math.random().toString(36).slice(2, 11);
179
+ }
180
+ function createClient(clientOptions) {
181
+ let {
182
+ baseUrl = "",
183
+ Request: CustomRequest = globalThis.Request,
184
+ fetch: baseFetch = globalThis.fetch,
185
+ querySerializer: globalQuerySerializer,
186
+ bodySerializer: globalBodySerializer,
187
+ pathSerializer: globalPathSerializer,
188
+ headers: baseHeaders,
189
+ requestInitExt = void 0,
190
+ ...baseOptions
191
+ } = { ...clientOptions };
192
+ requestInitExt = supportsRequestInitExt() ? requestInitExt : void 0;
193
+ baseUrl = removeTrailingSlash(baseUrl);
194
+ const globalMiddlewares = [];
195
+ async function coreFetch(schemaPath, fetchOptions) {
196
+ const {
197
+ baseUrl: localBaseUrl,
198
+ fetch: fetch2 = baseFetch,
199
+ Request = CustomRequest,
200
+ headers,
201
+ params = {},
202
+ parseAs = "json",
203
+ querySerializer: requestQuerySerializer,
204
+ bodySerializer = globalBodySerializer ?? defaultBodySerializer,
205
+ pathSerializer: requestPathSerializer,
206
+ body,
207
+ middleware: requestMiddlewares = [],
208
+ ...init
209
+ } = fetchOptions || {};
210
+ let finalBaseUrl = baseUrl;
211
+ if (localBaseUrl) {
212
+ finalBaseUrl = removeTrailingSlash(localBaseUrl) ?? baseUrl;
213
+ }
214
+ let querySerializer = typeof globalQuerySerializer === "function" ? globalQuerySerializer : createQuerySerializer(globalQuerySerializer);
215
+ if (requestQuerySerializer) {
216
+ querySerializer = typeof requestQuerySerializer === "function" ? requestQuerySerializer : createQuerySerializer({
217
+ ...typeof globalQuerySerializer === "object" ? globalQuerySerializer : {},
218
+ ...requestQuerySerializer
219
+ });
220
+ }
221
+ const pathSerializer = requestPathSerializer || globalPathSerializer || defaultPathSerializer;
222
+ const serializedBody = body === void 0 ? void 0 : bodySerializer(
223
+ body,
224
+ // Note: we declare mergeHeaders() both here and below because it’s a bit of a chicken-or-egg situation:
225
+ // bodySerializer() needs all headers so we aren’t dropping ones set by the user, however,
226
+ // the result of this ALSO sets the lowest-priority content-type header. So we re-merge below,
227
+ // setting the content-type at the very beginning to be overwritten.
228
+ // Lastly, based on the way headers work, it’s not a simple “present-or-not” check becauase null intentionally un-sets headers.
229
+ mergeHeaders(baseHeaders, headers, params.header)
230
+ );
231
+ const finalHeaders = mergeHeaders(
232
+ // with no body, we should not to set Content-Type
233
+ serializedBody === void 0 || // if serialized body is FormData; browser will correctly set Content-Type & boundary expression
234
+ serializedBody instanceof FormData ? {} : {
235
+ "Content-Type": "application/json"
236
+ },
237
+ baseHeaders,
238
+ headers,
239
+ params.header
240
+ );
241
+ const finalMiddlewares = [...globalMiddlewares, ...requestMiddlewares];
242
+ const requestInit = {
243
+ redirect: "follow",
244
+ ...baseOptions,
245
+ ...init,
246
+ body: serializedBody,
247
+ headers: finalHeaders
248
+ };
249
+ let id;
250
+ let options;
251
+ let request = new Request(
252
+ createFinalURL(schemaPath, { baseUrl: finalBaseUrl, params, querySerializer, pathSerializer }),
253
+ requestInit
254
+ );
255
+ let response;
256
+ for (const key in init) {
257
+ if (!(key in request)) {
258
+ request[key] = init[key];
259
+ }
260
+ }
261
+ if (finalMiddlewares.length) {
262
+ id = randomID();
263
+ options = Object.freeze({
264
+ baseUrl: finalBaseUrl,
265
+ fetch: fetch2,
266
+ parseAs,
267
+ querySerializer,
268
+ bodySerializer,
269
+ pathSerializer
270
+ });
271
+ for (const m of finalMiddlewares) {
272
+ if (m && typeof m === "object" && typeof m.onRequest === "function") {
273
+ const result = await m.onRequest({
274
+ request,
275
+ schemaPath,
276
+ params,
277
+ options,
278
+ id
279
+ });
280
+ if (result) {
281
+ if (result instanceof Request) {
282
+ request = result;
283
+ } else if (result instanceof Response) {
284
+ response = result;
285
+ break;
286
+ } else {
287
+ throw new Error("onRequest: must return new Request() or Response() when modifying the request");
288
+ }
289
+ }
290
+ }
291
+ }
292
+ }
293
+ if (!response) {
294
+ try {
295
+ response = await fetch2(request, requestInitExt);
296
+ } catch (error2) {
297
+ let errorAfterMiddleware = error2;
298
+ if (finalMiddlewares.length) {
299
+ for (let i = finalMiddlewares.length - 1; i >= 0; i--) {
300
+ const m = finalMiddlewares[i];
301
+ if (m && typeof m === "object" && typeof m.onError === "function") {
302
+ const result = await m.onError({
303
+ request,
304
+ error: errorAfterMiddleware,
305
+ schemaPath,
306
+ params,
307
+ options,
308
+ id
309
+ });
310
+ if (result) {
311
+ if (result instanceof Response) {
312
+ errorAfterMiddleware = void 0;
313
+ response = result;
314
+ break;
315
+ }
316
+ if (result instanceof Error) {
317
+ errorAfterMiddleware = result;
318
+ continue;
319
+ }
320
+ throw new Error("onError: must return new Response() or instance of Error");
321
+ }
322
+ }
323
+ }
324
+ }
325
+ if (errorAfterMiddleware) {
326
+ throw errorAfterMiddleware;
327
+ }
328
+ }
329
+ if (finalMiddlewares.length) {
330
+ for (let i = finalMiddlewares.length - 1; i >= 0; i--) {
331
+ const m = finalMiddlewares[i];
332
+ if (m && typeof m === "object" && typeof m.onResponse === "function") {
333
+ const result = await m.onResponse({
334
+ request,
335
+ response,
336
+ schemaPath,
337
+ params,
338
+ options,
339
+ id
340
+ });
341
+ if (result) {
342
+ if (!(result instanceof Response)) {
343
+ throw new Error("onResponse: must return new Response() when modifying the response");
344
+ }
345
+ response = result;
346
+ }
347
+ }
348
+ }
349
+ }
350
+ }
351
+ const contentLength = response.headers.get("Content-Length");
352
+ if (response.status === 204 || request.method === "HEAD" || contentLength === "0" && !response.headers.get("Transfer-Encoding")?.includes("chunked")) {
353
+ return response.ok ? { data: void 0, response } : { error: void 0, response };
354
+ }
355
+ if (response.ok) {
356
+ const getResponseData = async () => {
357
+ if (parseAs === "stream") {
358
+ return response.body;
359
+ }
360
+ if (parseAs === "json" && !contentLength) {
361
+ const raw = await response.text();
362
+ return raw ? JSON.parse(raw) : void 0;
363
+ }
364
+ return await response[parseAs]();
365
+ };
366
+ return { data: await getResponseData(), response };
367
+ }
368
+ let error = await response.text();
369
+ try {
370
+ error = JSON.parse(error);
371
+ } catch {
372
+ }
373
+ return { error, response };
374
+ }
375
+ return {
376
+ request(method, url, init) {
377
+ return coreFetch(url, { ...init, method: method.toUpperCase() });
378
+ },
379
+ /** Call a GET endpoint */
380
+ GET(url, init) {
381
+ return coreFetch(url, { ...init, method: "GET" });
382
+ },
383
+ /** Call a PUT endpoint */
384
+ PUT(url, init) {
385
+ return coreFetch(url, { ...init, method: "PUT" });
386
+ },
387
+ /** Call a POST endpoint */
388
+ POST(url, init) {
389
+ return coreFetch(url, { ...init, method: "POST" });
390
+ },
391
+ /** Call a DELETE endpoint */
392
+ DELETE(url, init) {
393
+ return coreFetch(url, { ...init, method: "DELETE" });
394
+ },
395
+ /** Call a OPTIONS endpoint */
396
+ OPTIONS(url, init) {
397
+ return coreFetch(url, { ...init, method: "OPTIONS" });
398
+ },
399
+ /** Call a HEAD endpoint */
400
+ HEAD(url, init) {
401
+ return coreFetch(url, { ...init, method: "HEAD" });
402
+ },
403
+ /** Call a PATCH endpoint */
404
+ PATCH(url, init) {
405
+ return coreFetch(url, { ...init, method: "PATCH" });
406
+ },
407
+ /** Call a TRACE endpoint */
408
+ TRACE(url, init) {
409
+ return coreFetch(url, { ...init, method: "TRACE" });
410
+ },
411
+ /** Register middleware */
412
+ use(...middleware) {
413
+ for (const m of middleware) {
414
+ if (!m) {
415
+ continue;
416
+ }
417
+ if (typeof m !== "object" || !("onRequest" in m || "onResponse" in m || "onError" in m)) {
418
+ throw new Error("Middleware must be an object with one of `onRequest()`, `onResponse() or `onError()`");
419
+ }
420
+ globalMiddlewares.push(m);
421
+ }
422
+ },
423
+ /** Unregister middleware */
424
+ eject(...middleware) {
425
+ for (const m of middleware) {
426
+ const i = globalMiddlewares.indexOf(m);
427
+ if (i !== -1) {
428
+ globalMiddlewares.splice(i, 1);
429
+ }
430
+ }
431
+ }
432
+ };
433
+ }
434
+ function serializePrimitiveParam(name, value, options) {
435
+ if (value === void 0 || value === null) {
436
+ return "";
437
+ }
438
+ if (typeof value === "object") {
439
+ throw new Error(
440
+ "Deeply-nested arrays/objects aren\u2019t supported. Provide your own `querySerializer()` to handle these."
441
+ );
442
+ }
443
+ return `${name}=${options?.allowReserved === true ? value : encodeURIComponent(value)}`;
444
+ }
445
+ function serializeObjectParam(name, value, options) {
446
+ if (!value || typeof value !== "object") {
447
+ return "";
448
+ }
449
+ const values = [];
450
+ const joiner = {
451
+ simple: ",",
452
+ label: ".",
453
+ matrix: ";"
454
+ }[options.style] || "&";
455
+ if (options.style !== "deepObject" && options.explode === false) {
456
+ for (const k in value) {
457
+ values.push(k, options.allowReserved === true ? value[k] : encodeURIComponent(value[k]));
458
+ }
459
+ const final2 = values.join(",");
460
+ switch (options.style) {
461
+ case "form": {
462
+ return `${name}=${final2}`;
463
+ }
464
+ case "label": {
465
+ return `.${final2}`;
466
+ }
467
+ case "matrix": {
468
+ return `;${name}=${final2}`;
469
+ }
470
+ default: {
471
+ return final2;
472
+ }
473
+ }
474
+ }
475
+ for (const k in value) {
476
+ const finalName = options.style === "deepObject" ? `${name}[${k}]` : k;
477
+ values.push(serializePrimitiveParam(finalName, value[k], options));
478
+ }
479
+ const final = values.join(joiner);
480
+ return options.style === "label" || options.style === "matrix" ? `${joiner}${final}` : final;
481
+ }
482
+ function serializeArrayParam(name, value, options) {
483
+ if (!Array.isArray(value)) {
484
+ return "";
485
+ }
486
+ if (options.explode === false) {
487
+ const joiner2 = { form: ",", spaceDelimited: "%20", pipeDelimited: "|" }[options.style] || ",";
488
+ const final = (options.allowReserved === true ? value : value.map((v) => encodeURIComponent(v))).join(joiner2);
489
+ switch (options.style) {
490
+ case "simple": {
491
+ return final;
492
+ }
493
+ case "label": {
494
+ return `.${final}`;
495
+ }
496
+ case "matrix": {
497
+ return `;${name}=${final}`;
498
+ }
499
+ // case "spaceDelimited":
500
+ // case "pipeDelimited":
501
+ default: {
502
+ return `${name}=${final}`;
503
+ }
504
+ }
505
+ }
506
+ const joiner = { simple: ",", label: ".", matrix: ";" }[options.style] || "&";
507
+ const values = [];
508
+ for (const v of value) {
509
+ if (options.style === "simple" || options.style === "label") {
510
+ values.push(options.allowReserved === true ? v : encodeURIComponent(v));
511
+ } else {
512
+ values.push(serializePrimitiveParam(name, v, options));
513
+ }
514
+ }
515
+ return options.style === "label" || options.style === "matrix" ? `${joiner}${values.join(joiner)}` : values.join(joiner);
516
+ }
517
+ function createQuerySerializer(options) {
518
+ return function querySerializer(queryParams) {
519
+ const search = [];
520
+ if (queryParams && typeof queryParams === "object") {
521
+ for (const name in queryParams) {
522
+ const value = queryParams[name];
523
+ if (value === void 0 || value === null) {
524
+ continue;
525
+ }
526
+ if (Array.isArray(value)) {
527
+ if (value.length === 0) {
528
+ continue;
529
+ }
530
+ search.push(
531
+ serializeArrayParam(name, value, {
532
+ style: "form",
533
+ explode: true,
534
+ ...options?.array,
535
+ allowReserved: options?.allowReserved || false
536
+ })
537
+ );
538
+ continue;
539
+ }
540
+ if (typeof value === "object") {
541
+ search.push(
542
+ serializeObjectParam(name, value, {
543
+ style: "deepObject",
544
+ explode: true,
545
+ ...options?.object,
546
+ allowReserved: options?.allowReserved || false
547
+ })
548
+ );
549
+ continue;
550
+ }
551
+ search.push(serializePrimitiveParam(name, value, options));
552
+ }
553
+ }
554
+ return search.join("&");
555
+ };
556
+ }
557
+ function defaultPathSerializer(pathname, pathParams) {
558
+ let nextURL = pathname;
559
+ for (const match of pathname.match(PATH_PARAM_RE) ?? []) {
560
+ let name = match.substring(1, match.length - 1);
561
+ let explode = false;
562
+ let style = "simple";
563
+ if (name.endsWith("*")) {
564
+ explode = true;
565
+ name = name.substring(0, name.length - 1);
566
+ }
567
+ if (name.startsWith(".")) {
568
+ style = "label";
569
+ name = name.substring(1);
570
+ } else if (name.startsWith(";")) {
571
+ style = "matrix";
572
+ name = name.substring(1);
573
+ }
574
+ if (!pathParams || pathParams[name] === void 0 || pathParams[name] === null) {
575
+ continue;
576
+ }
577
+ const value = pathParams[name];
578
+ if (Array.isArray(value)) {
579
+ nextURL = nextURL.replace(match, serializeArrayParam(name, value, { style, explode }));
580
+ continue;
581
+ }
582
+ if (typeof value === "object") {
583
+ nextURL = nextURL.replace(match, serializeObjectParam(name, value, { style, explode }));
584
+ continue;
585
+ }
586
+ if (style === "matrix") {
587
+ nextURL = nextURL.replace(match, `;${serializePrimitiveParam(name, value)}`);
588
+ continue;
589
+ }
590
+ nextURL = nextURL.replace(match, style === "label" ? `.${encodeURIComponent(value)}` : encodeURIComponent(value));
591
+ }
592
+ return nextURL;
593
+ }
594
+ function defaultBodySerializer(body, headers) {
595
+ if (body instanceof FormData) {
596
+ return body;
597
+ }
598
+ if (headers) {
599
+ const contentType = headers.get instanceof Function ? headers.get("Content-Type") ?? headers.get("content-type") : headers["Content-Type"] ?? headers["content-type"];
600
+ if (contentType === "application/x-www-form-urlencoded") {
601
+ return new URLSearchParams(body).toString();
602
+ }
603
+ }
604
+ return JSON.stringify(body);
605
+ }
606
+ function createFinalURL(pathname, options) {
607
+ let finalURL = `${options.baseUrl}${pathname}`;
608
+ if (options.params?.path) {
609
+ finalURL = options.pathSerializer(finalURL, options.params.path);
610
+ }
611
+ let search = options.querySerializer(options.params.query ?? {});
612
+ if (search.startsWith("?")) {
613
+ search = search.substring(1);
614
+ }
615
+ if (search) {
616
+ finalURL += `?${search}`;
617
+ }
618
+ return finalURL;
619
+ }
620
+ function mergeHeaders(...allHeaders) {
621
+ const finalHeaders = new Headers();
622
+ for (const h of allHeaders) {
623
+ if (!h || typeof h !== "object") {
624
+ continue;
625
+ }
626
+ const iterator = h instanceof Headers ? h.entries() : Object.entries(h);
627
+ for (const [k, v] of iterator) {
628
+ if (v === null) {
629
+ finalHeaders.delete(k);
630
+ } else if (Array.isArray(v)) {
631
+ for (const v2 of v) {
632
+ finalHeaders.append(k, v2);
633
+ }
634
+ } else if (v !== void 0) {
635
+ finalHeaders.set(k, v);
636
+ }
637
+ }
638
+ }
639
+ return finalHeaders;
640
+ }
641
+ function removeTrailingSlash(url) {
642
+ if (url.endsWith("/")) {
643
+ return url.substring(0, url.length - 1);
644
+ }
645
+ return url;
646
+ }
647
+
648
+ // src/api/client.ts
649
+ function createApiClient(baseUrl) {
650
+ return createClient({ baseUrl });
651
+ }
652
+
653
+ // src/types.ts
654
+ var PollarError = class extends Error {
655
+ constructor(code, message) {
656
+ super(message ?? code);
657
+ this.name = "PollarError";
658
+ this.code = code;
659
+ }
660
+ };
661
+ var PollarStateVar = {
662
+ WALLET_ADDRESS: "WALLET_ADDRESS",
663
+ LOGIN: "LOGIN"
664
+ };
665
+ var STATE_VAR_CODES = {
666
+ [PollarStateVar.LOGIN]: {
667
+ NONE: "NONE",
668
+ LOGOUT: "LOGOUT",
669
+ CREATE_SESSION_START: "CREATE_SESSION_START",
670
+ CREATE_SESSION_ERROR: "CREATE_SESSION_ERROR",
671
+ CREATE_SESSION_SUCCESS: "CREATE_SESSION_SUCCESS",
672
+ EMAIL_AUTH_START: "EMAIL_AUTH_START",
673
+ EMAIL_AUTH_START_ERROR: "EMAIL_AUTH_START_ERROR",
674
+ EMAIL_AUTH_START_SUCCESS: "EMAIL_AUTH_START_SUCCESS",
675
+ EMAIL_AUTH_CODE_ERROR: "EMAIL_AUTH_CODE_ERROR",
676
+ EMAIL_AUTH_CODE_SUCCESS: "EMAIL_AUTH_CODE_SUCCESS",
677
+ WALLET_AUTH_START: "WALLET_AUTH_START",
678
+ WALLET_AUTH_FREIGHTER_NOT_INSTALLED: "WALLET_AUTH_FREIGHTER_NOT_INSTALLED",
679
+ WALLET_AUTH_ALBEDO_NOT_INSTALLED: "WALLET_AUTH_ALBEDO_NOT_INSTALLED",
680
+ WALLET_AUTH_CONNECTED: "WALLET_AUTH_CONNECTED",
681
+ WALLET_AUTH_LOGIN_START: "WALLET_AUTH_LOGIN_START",
682
+ WALLET_AUTH_LOGIN_START_SUCCESS: "WALLET_AUTH_LOGIN_START_SUCCESS",
683
+ WALLET_AUTH_LOGIN_START_ERROR: "WALLET_AUTH_LOGIN_START_ERROR",
684
+ WALLET_AUTH_ERROR: "WALLET_AUTH_ERROR",
685
+ STREAM_POLL_START: "STREAM_POLL_START",
686
+ STREAM_POLL_EVENT: "STREAM_POLL_EVENT",
687
+ STREAM_POLL_READY: "STREAM_POLL_READY",
688
+ FETCH_SESSION_START: "FETCH_SESSION_START",
689
+ FETCH_SESSION_SUCCESS: "FETCH_SESSION_SUCCESS",
690
+ FETCH_SESSION_ERROR: "FETCH_SESSION_ERROR",
691
+ ERROR_ABORTED: "ABORTED",
692
+ ERROR_UNKNOWN: "ERROR_UNKNOWN"
693
+ },
694
+ [PollarStateVar.WALLET_ADDRESS]: {
695
+ NONE: "NONE",
696
+ REMOVED_ADDRESS: "REMOVED_ADDRESS",
697
+ UPDATED_ADDRESS: "UPDATED_ADDRESS"
698
+ }
699
+ };
700
+ var StateStatus = {
701
+ NONE: "NONE",
702
+ LOADING: "LOADING",
703
+ SUCCESS: "SUCCESS",
704
+ ERROR: "ERROR"
705
+ };
706
+
707
+ // src/wallets/FreighterAdapter.ts
708
+ var import_freighter_api = __toESM(require_index_min());
709
+
710
+ // src/wallets/types.ts
711
+ var WalletType = /* @__PURE__ */ ((WalletType2) => {
712
+ WalletType2["FREIGHTER"] = "freighter";
713
+ WalletType2["ALBEDO"] = "albedo";
714
+ return WalletType2;
715
+ })(WalletType || {});
716
+
717
+ // src/wallets/FreighterAdapter.ts
718
+ var FreighterAdapter = class {
719
+ constructor() {
720
+ this.type = "freighter" /* FREIGHTER */;
721
+ }
722
+ async isAvailable() {
723
+ try {
724
+ return await (0, import_freighter_api.isConnected)();
725
+ } catch {
726
+ return false;
727
+ }
728
+ }
729
+ async connect() {
730
+ const connected = await (0, import_freighter_api.isConnected)();
731
+ if (!connected) {
732
+ throw new Error("Freighter wallet is not installed");
733
+ }
734
+ const allowed = await (0, import_freighter_api.isAllowed)();
735
+ if (!allowed) {
736
+ await (0, import_freighter_api.setAllowed)();
737
+ }
738
+ const userInfo = await (0, import_freighter_api.getUserInfo)();
739
+ if (!userInfo?.publicKey) {
740
+ throw new Error("Failed to get user information from Freighter");
741
+ }
742
+ return { address: userInfo.publicKey, publicKey: userInfo.publicKey };
743
+ }
744
+ async disconnect() {
745
+ }
746
+ async getPublicKey() {
747
+ try {
748
+ const allowed = await (0, import_freighter_api.isAllowed)();
749
+ if (!allowed) return null;
750
+ const userInfo = await (0, import_freighter_api.getUserInfo)();
751
+ return userInfo?.publicKey ?? null;
752
+ } catch {
753
+ return null;
754
+ }
755
+ }
756
+ async getNetwork() {
757
+ return (0, import_freighter_api.getNetwork)();
758
+ }
759
+ async signTransaction(xdr, options) {
760
+ const result = await (0, import_freighter_api.signTransaction)(xdr, {
761
+ network: options?.network,
762
+ networkPassphrase: options?.networkPassphrase,
763
+ accountToSign: options?.accountToSign
764
+ });
765
+ if (!result || typeof result !== "string") {
766
+ throw new Error("Invalid response from Freighter");
767
+ }
768
+ return { signedTxXdr: result };
769
+ }
770
+ async signAuthEntry(entryXdr, options) {
771
+ const result = await (0, import_freighter_api.signAuthEntry)(entryXdr, { accountToSign: options?.accountToSign });
772
+ if (!result || typeof result !== "string") {
773
+ throw new Error("Invalid response from Freighter");
774
+ }
775
+ return { signedAuthEntry: result };
776
+ }
777
+ };
778
+
779
+ // src/wallets/AlbedoAdapter.ts
780
+ function openAlbedoPopup(url) {
781
+ const popup = window.open(url, "albedo", "width=420,height=720,resizable=yes,scrollbars=yes");
782
+ if (!popup) {
783
+ throw new Error("Failed to open Albedo popup (blocked by browser)");
784
+ }
785
+ return popup;
786
+ }
787
+ function waitForAlbedoPopup() {
788
+ return new Promise((resolve, reject) => {
789
+ const timeout = setTimeout(() => reject(new Error("Albedo response timeout")), 2 * 60 * 1e3);
790
+ function handler(event) {
791
+ if (event.origin !== window.location.origin || event.data?.type !== "ALBEDO_RESULT") return;
792
+ clearTimeout(timeout);
793
+ window.removeEventListener("message", handler);
794
+ resolve(event.data.payload);
795
+ }
796
+ window.addEventListener("message", handler);
797
+ });
798
+ }
799
+ function waitForAlbedoResult() {
800
+ return new Promise((resolve, reject) => {
801
+ const timeout = setTimeout(() => reject(new Error("Albedo response timeout")), 2 * 60 * 1e3);
802
+ const parseResult = () => {
803
+ const params = new URLSearchParams(window.location.search);
804
+ if (!params.has("pubkey") && !params.has("signed_envelope_xdr") && !params.has("signed_xdr")) return;
805
+ clearTimeout(timeout);
806
+ const result = {};
807
+ params.forEach((value, key) => {
808
+ result[key] = value;
809
+ });
810
+ window.history.replaceState({}, document.title, window.location.pathname);
811
+ resolve(result);
812
+ };
813
+ parseResult();
814
+ window.addEventListener("popstate", parseResult);
815
+ });
816
+ }
817
+ var AlbedoAdapter = class {
818
+ constructor() {
819
+ this.type = "albedo" /* ALBEDO */;
820
+ }
821
+ async isAvailable() {
822
+ return typeof window !== "undefined";
823
+ }
824
+ async connect() {
825
+ const url = new URL("https://albedo.link");
826
+ url.searchParams.set("intent", "public-key");
827
+ url.searchParams.set("app_name", "Pollar");
828
+ url.searchParams.set("network", "testnet");
829
+ url.searchParams.set("callback", `${window.location.origin}/albedo-callback`);
830
+ url.searchParams.set("origin", window.location.origin);
831
+ openAlbedoPopup(url.toString());
832
+ const result = await waitForAlbedoPopup();
833
+ if (!result.pubkey) {
834
+ throw new Error("Albedo connection rejected");
835
+ }
836
+ return { address: result.pubkey, publicKey: result.pubkey };
837
+ }
838
+ async disconnect() {
839
+ }
840
+ async getPublicKey() {
841
+ return null;
842
+ }
843
+ async getNetwork() {
844
+ throw new Error("Albedo does not expose network");
845
+ }
846
+ async signTransaction(xdr, _options) {
847
+ const url = new URL("https://albedo.link");
848
+ url.searchParams.set("intent", "tx");
849
+ url.searchParams.set("xdr", xdr);
850
+ url.searchParams.set("app_name", "Pollar");
851
+ url.searchParams.set("network", "testnet");
852
+ url.searchParams.set("callback", window.location.href);
853
+ url.searchParams.set("origin", window.location.origin);
854
+ window.location.href = url.toString();
855
+ const result = await waitForAlbedoResult();
856
+ if (!result.signed_envelope_xdr) throw new Error("Albedo signing rejected");
857
+ return { signedTxXdr: result.signed_envelope_xdr };
858
+ }
859
+ async signAuthEntry(entryXdr, _options) {
860
+ const url = new URL("https://albedo.link");
861
+ url.searchParams.set("intent", "sign-auth-entry");
862
+ url.searchParams.set("xdr", entryXdr);
863
+ url.searchParams.set("app_name", "Pollar");
864
+ url.searchParams.set("network", "testnet");
865
+ url.searchParams.set("callback", window.location.href);
866
+ url.searchParams.set("origin", window.location.origin);
867
+ window.location.href = url.toString();
868
+ const result = await waitForAlbedoResult();
869
+ if (!result.signed_xdr) throw new Error("Albedo auth entry signing rejected");
870
+ return { signedAuthEntry: result.signed_xdr };
871
+ }
872
+ };
873
+
874
+ // src/client/session.ts
875
+ var STORAGE_KEY = "pollar:session";
876
+ function isValidSession(value) {
877
+ if (typeof value !== "object" || value === null) {
878
+ console.warn("[PollarClient:session] Invalid session \u2014 value is not an object");
879
+ return false;
880
+ }
881
+ const s = value;
882
+ if (typeof s["clientSessionId"] !== "string" || s["clientSessionId"] === "") {
883
+ console.warn("[PollarClient:session] Invalid session \u2014 clientSessionId missing or empty");
884
+ return false;
885
+ }
886
+ if (s["userId"] !== null && typeof s["userId"] !== "string") {
887
+ console.warn("[PollarClient:session] Invalid session \u2014 userId must be string or null, got:", typeof s["userId"]);
888
+ return false;
889
+ }
890
+ if (typeof s["status"] !== "string") {
891
+ console.warn("[PollarClient:session] Invalid session \u2014 status must be string, got:", typeof s["status"]);
892
+ return false;
893
+ }
894
+ const token = s["token"];
895
+ if (typeof token !== "object" || token === null) {
896
+ console.warn("[PollarClient:session] Invalid session \u2014 token missing or not an object");
897
+ return false;
898
+ }
899
+ const t = token;
900
+ if (typeof t["accessToken"] !== "string" || t["accessToken"] === "") {
901
+ console.warn("[PollarClient:session] Invalid session \u2014 token.accessToken missing or empty");
902
+ return false;
903
+ }
904
+ if (typeof t["refreshToken"] !== "string" || t["refreshToken"] === "") {
905
+ console.warn("[PollarClient:session] Invalid session \u2014 token.refreshToken missing or empty");
906
+ return false;
907
+ }
908
+ if (typeof t["expiresAt"] !== "number" || !Number.isFinite(t["expiresAt"])) {
909
+ console.warn("[PollarClient:session] Invalid session \u2014 token.expiresAt must be a finite number");
910
+ return false;
911
+ }
912
+ const user = s["user"];
913
+ if (typeof user !== "object" || user === null) {
914
+ console.warn("[PollarClient:session] Invalid session \u2014 user missing or not an object");
915
+ return false;
916
+ }
917
+ const u = user;
918
+ if (u["id"] !== void 0 && typeof u["id"] !== "string") {
919
+ console.warn("[PollarClient:session] Invalid session \u2014 user.id must be string if present, got:", typeof u["id"]);
920
+ return false;
921
+ }
922
+ if (typeof u["ready"] !== "boolean") {
923
+ console.warn("[PollarClient:session] Invalid session \u2014 user.ready must be boolean, got:", typeof u["ready"]);
924
+ return false;
925
+ }
926
+ const wallet = s["wallet"];
927
+ if (typeof wallet !== "object" || wallet === null) {
928
+ console.warn("[PollarClient:session] Invalid session \u2014 wallet missing or not an object");
929
+ return false;
930
+ }
931
+ const w = wallet;
932
+ if (w["publicKey"] !== null && typeof w["publicKey"] !== "string") {
933
+ console.warn(
934
+ "[PollarClient:session] Invalid session \u2014 wallet.publicKey must be string or null, got:",
935
+ typeof w["publicKey"]
936
+ );
937
+ return false;
938
+ }
939
+ if (w["existsOnStellar"] !== void 0 && typeof w["existsOnStellar"] !== "boolean") {
940
+ console.warn("[PollarClient:session] Invalid session \u2014 wallet.existsOnStellar must be boolean if present");
941
+ return false;
942
+ }
943
+ if (w["createdAt"] !== void 0 && (typeof w["createdAt"] !== "number" || !Number.isFinite(w["createdAt"]))) {
944
+ console.warn("[PollarClient:session] Invalid session \u2014 wallet.createdAt must be a finite number if present");
945
+ return false;
946
+ }
947
+ const data = s["data"];
948
+ if (typeof data !== "object" || data === null) {
949
+ console.warn("[PollarClient:session] Invalid session \u2014 data missing or not an object");
950
+ return false;
951
+ }
952
+ const d = data;
953
+ for (const field of ["mail", "first_name", "last_name", "avatar"]) {
954
+ if (typeof d[field] !== "string") {
955
+ console.warn(`[PollarClient:session] Invalid session \u2014 data.${field} must be string, got:`, typeof d[field]);
956
+ return false;
957
+ }
958
+ }
959
+ const providers = d["providers"];
960
+ if (typeof providers !== "object" || providers === null) {
961
+ console.warn("[PollarClient:session] Invalid session \u2014 data.providers missing or not an object");
962
+ return false;
963
+ }
964
+ const p = providers;
965
+ const providerInnerField = { email: "address", google: "id", github: "id", wallet: "address" };
966
+ for (const [field, innerField] of Object.entries(providerInnerField)) {
967
+ const v = p[field];
968
+ if (v === null) continue;
969
+ if (typeof v !== "object") {
970
+ console.warn(`[PollarClient:session] Invalid session \u2014 data.providers.${field} must be object or null, got:`, typeof v);
971
+ return false;
972
+ }
973
+ const vObj = v;
974
+ if (typeof vObj[innerField] !== "string" || vObj[innerField] === "") {
975
+ console.warn(`[PollarClient:session] Invalid session \u2014 data.providers.${field}.${innerField} must be a non-empty string`);
976
+ return false;
977
+ }
978
+ }
979
+ return true;
980
+ }
981
+ function readStorage() {
982
+ const raw = localStorage.getItem(STORAGE_KEY);
983
+ if (!raw) {
984
+ return null;
985
+ }
986
+ try {
987
+ const session = JSON.parse(raw);
988
+ if (!isValidSession(session)) {
989
+ localStorage.removeItem(STORAGE_KEY);
990
+ console.warn("[PollarClient:session] Stored session is invalid \u2014 clearing storage");
991
+ return null;
992
+ }
993
+ if (session.token.expiresAt * 1e3 < Date.now()) {
994
+ localStorage.removeItem(STORAGE_KEY);
995
+ console.warn("[PollarClient:session] Session token has expired \u2014 clearing storage");
996
+ return null;
997
+ }
998
+ return session;
999
+ } catch (error) {
1000
+ console.error("[PollarClient:session] Failed to parse session from storage", error);
1001
+ localStorage.removeItem(STORAGE_KEY);
1002
+ return null;
1003
+ }
1004
+ }
1005
+ function writeStorage(session) {
1006
+ localStorage.setItem(STORAGE_KEY, JSON.stringify(session));
1007
+ console.info("[PollarClient:session] Session written to storage");
1008
+ }
1009
+ function removeStorage() {
1010
+ localStorage.removeItem(STORAGE_KEY);
1011
+ console.info("[PollarClient:session] Session removed from storage");
1012
+ }
1013
+
1014
+ // src/client/stream.ts
1015
+ function abortableDelay(ms, signal) {
1016
+ return new Promise((resolve, reject) => {
1017
+ const t = setTimeout(resolve, ms);
1018
+ signal.addEventListener(
1019
+ "abort",
1020
+ () => {
1021
+ clearTimeout(t);
1022
+ reject(new DOMException("Aborted", "AbortError"));
1023
+ },
1024
+ { once: true }
1025
+ );
1026
+ });
1027
+ }
1028
+ async function streamUntilFound(api, clientSessionId, check, retryDelayMs = 200, signal) {
1029
+ while (true) {
1030
+ signal?.throwIfAborted();
1031
+ let data, error;
1032
+ try {
1033
+ ({ data, error } = await api.GET("/auth/session/status/{clientSessionId}", {
1034
+ params: { path: { clientSessionId } },
1035
+ parseAs: "stream",
1036
+ signal: signal ?? null
1037
+ }));
1038
+ } catch (e) {
1039
+ if (e instanceof Error && e.name === "AbortError") throw e;
1040
+ console.warn(e);
1041
+ }
1042
+ if (error || !data) {
1043
+ if (signal) await abortableDelay(retryDelayMs, signal);
1044
+ else await new Promise((r) => setTimeout(r, retryDelayMs));
1045
+ continue;
1046
+ }
1047
+ const reader = data.getReader();
1048
+ const decoder = new TextDecoder();
1049
+ let streamDone = false;
1050
+ try {
1051
+ while (true) {
1052
+ signal?.throwIfAborted();
1053
+ const { done, value } = await reader.read();
1054
+ if (done) {
1055
+ streamDone = true;
1056
+ break;
1057
+ }
1058
+ const chunk = decoder.decode(value);
1059
+ for (const message of chunk.split("\n\n").filter(Boolean)) {
1060
+ const dataLine = message.split("\n").find((l) => l.startsWith("data:"));
1061
+ if (!dataLine) continue;
1062
+ try {
1063
+ const parsed = JSON.parse(dataLine.slice("data:".length).trim());
1064
+ if (check(parsed)) {
1065
+ return parsed;
1066
+ }
1067
+ } catch {
1068
+ }
1069
+ }
1070
+ }
1071
+ } catch (e) {
1072
+ if (e instanceof Error && e.name === "AbortError") throw e;
1073
+ console.warn(e);
1074
+ } finally {
1075
+ reader.releaseLock();
1076
+ }
1077
+ const delay = streamDone ? retryDelayMs : 0;
1078
+ if (delay) {
1079
+ if (signal) await abortableDelay(delay, signal);
1080
+ else await new Promise((r) => setTimeout(r, delay));
1081
+ }
1082
+ }
1083
+ }
1084
+
1085
+ // src/client/login.ts
1086
+ function withSignal(promise, signal) {
1087
+ return Promise.race([
1088
+ promise,
1089
+ new Promise((_, reject) => {
1090
+ if (signal.aborted) {
1091
+ reject(new DOMException("Aborted", "AbortError"));
1092
+ return;
1093
+ }
1094
+ signal.addEventListener("abort", () => reject(new DOMException("Aborted", "AbortError")), { once: true });
1095
+ })
1096
+ ]);
1097
+ }
1098
+ var emitResponse = (response, successCode, errorCode, emitLog) => {
1099
+ const isSuccess = !!response.data && !response.error;
1100
+ emitLog(
1101
+ PollarStateVar.LOGIN,
1102
+ isSuccess ? successCode : errorCode,
1103
+ isSuccess ? "info" : "error",
1104
+ isSuccess ? StateStatus.LOADING : StateStatus.ERROR,
1105
+ isSuccess ? response.data : response.error
1106
+ );
1107
+ return isSuccess;
1108
+ };
1109
+ async function login(options, deps) {
1110
+ const { api, basePath, apiKey, signal, emitState, storeSession, clearSession } = deps;
1111
+ emitState(PollarStateVar.LOGIN, STATE_VAR_CODES[PollarStateVar.LOGIN].CREATE_SESSION_START, "info", StateStatus.LOADING);
1112
+ const createSessionResponse = await api.POST("/auth/session", { signal });
1113
+ if (!emitResponse(
1114
+ createSessionResponse,
1115
+ STATE_VAR_CODES[PollarStateVar.LOGIN].CREATE_SESSION_SUCCESS,
1116
+ STATE_VAR_CODES[PollarStateVar.LOGIN].CREATE_SESSION_ERROR,
1117
+ emitState
1118
+ )) {
1119
+ return;
1120
+ }
1121
+ const clientSessionId = createSessionResponse.data.content.clientSessionId;
1122
+ switch (options.provider) {
1123
+ case "email": {
1124
+ emitState(PollarStateVar.LOGIN, STATE_VAR_CODES[PollarStateVar.LOGIN].EMAIL_AUTH_START, "info", StateStatus.LOADING, {
1125
+ email: options.email
1126
+ });
1127
+ const emailRes = await api.POST(`/auth/email`, {
1128
+ body: { clientSessionId, email: options.email },
1129
+ signal
1130
+ });
1131
+ if (!emitResponse(
1132
+ emailRes,
1133
+ STATE_VAR_CODES[PollarStateVar.LOGIN].EMAIL_AUTH_START_SUCCESS,
1134
+ STATE_VAR_CODES[PollarStateVar.LOGIN].EMAIL_AUTH_START_ERROR,
1135
+ emitState
1136
+ )) {
1137
+ return;
1138
+ }
1139
+ break;
1140
+ }
1141
+ case "google":
1142
+ case "github": {
1143
+ const url = new URL(`${basePath}/auth/${options.provider}`);
1144
+ url.searchParams.set("api_key", apiKey);
1145
+ url.searchParams.set("client_session_id", clientSessionId);
1146
+ url.searchParams.set("redirect_uri", window.location.origin);
1147
+ window.open(url.toString(), "_blank");
1148
+ break;
1149
+ }
1150
+ case "wallet": {
1151
+ try {
1152
+ emitState(PollarStateVar.LOGIN, STATE_VAR_CODES[PollarStateVar.LOGIN].WALLET_AUTH_START, "info", StateStatus.LOADING, {
1153
+ adapter: options.type
1154
+ });
1155
+ const adapter = options.type === "freighter" /* FREIGHTER */ ? new FreighterAdapter() : new AlbedoAdapter();
1156
+ const available = await withSignal(adapter.isAvailable(), signal);
1157
+ if (!available) {
1158
+ emitState(
1159
+ PollarStateVar.LOGIN,
1160
+ options.type === "freighter" /* FREIGHTER */ ? STATE_VAR_CODES[PollarStateVar.LOGIN].WALLET_AUTH_FREIGHTER_NOT_INSTALLED : STATE_VAR_CODES[PollarStateVar.LOGIN].WALLET_AUTH_ALBEDO_NOT_INSTALLED,
1161
+ "info",
1162
+ StateStatus.LOADING,
1163
+ {
1164
+ type: options.type
1165
+ }
1166
+ );
1167
+ }
1168
+ const { publicKey } = await withSignal(adapter.connect(), signal);
1169
+ emitState(
1170
+ PollarStateVar.LOGIN,
1171
+ STATE_VAR_CODES[PollarStateVar.LOGIN].WALLET_AUTH_CONNECTED,
1172
+ "info",
1173
+ StateStatus.LOADING,
1174
+ {
1175
+ adapter: options.type,
1176
+ publicKey
1177
+ }
1178
+ );
1179
+ emitState(
1180
+ PollarStateVar.LOGIN,
1181
+ STATE_VAR_CODES[PollarStateVar.LOGIN].WALLET_AUTH_LOGIN_START,
1182
+ "info",
1183
+ StateStatus.LOADING,
1184
+ {
1185
+ adapter: options.type,
1186
+ publicKey
1187
+ }
1188
+ );
1189
+ const emailRes = await api.POST(`/auth/wallet`, {
1190
+ body: { clientSessionId, walletAddress: publicKey },
1191
+ signal
1192
+ });
1193
+ if (!emitResponse(
1194
+ emailRes,
1195
+ STATE_VAR_CODES[PollarStateVar.LOGIN].WALLET_AUTH_LOGIN_START_SUCCESS,
1196
+ STATE_VAR_CODES[PollarStateVar.LOGIN].WALLET_AUTH_LOGIN_START_ERROR,
1197
+ emitState
1198
+ )) {
1199
+ return;
1200
+ }
1201
+ } catch (error2) {
1202
+ emitState(PollarStateVar.LOGIN, STATE_VAR_CODES[PollarStateVar.LOGIN].WALLET_AUTH_ERROR, "error", StateStatus.ERROR, {
1203
+ clientSessionId
1204
+ });
1205
+ }
1206
+ break;
1207
+ }
1208
+ }
1209
+ emitState(PollarStateVar.LOGIN, STATE_VAR_CODES[PollarStateVar.LOGIN].STREAM_POLL_START, "info", StateStatus.LOADING, {
1210
+ clientSessionId
1211
+ });
1212
+ await streamUntilFound(
1213
+ api,
1214
+ clientSessionId,
1215
+ (data2) => {
1216
+ const status = data2?.status;
1217
+ if (status === "READY") {
1218
+ emitState(PollarStateVar.LOGIN, STATE_VAR_CODES[PollarStateVar.LOGIN].STREAM_POLL_READY, "info", StateStatus.LOADING);
1219
+ return true;
1220
+ }
1221
+ emitState(
1222
+ PollarStateVar.LOGIN,
1223
+ STATE_VAR_CODES[PollarStateVar.LOGIN].STREAM_POLL_EVENT + (status ? `/${status}` : ""),
1224
+ "info",
1225
+ StateStatus.LOADING,
1226
+ data2
1227
+ );
1228
+ return false;
1229
+ },
1230
+ 200,
1231
+ signal
1232
+ );
1233
+ emitState(PollarStateVar.LOGIN, STATE_VAR_CODES[PollarStateVar.LOGIN].FETCH_SESSION_START, "info", StateStatus.LOADING);
1234
+ const { data, error } = await api.POST(`/auth/login`, {
1235
+ body: { clientSessionId },
1236
+ signal
1237
+ });
1238
+ if (data?.code === "SDK_LOGIN_SUCCESS" && isValidSession(data?.content)) {
1239
+ emitState(PollarStateVar.LOGIN, STATE_VAR_CODES[PollarStateVar.LOGIN].FETCH_SESSION_SUCCESS, "info", StateStatus.SUCCESS);
1240
+ storeSession(data.content);
1241
+ } else {
1242
+ emitState(PollarStateVar.LOGIN, STATE_VAR_CODES[PollarStateVar.LOGIN].FETCH_SESSION_ERROR, "error", StateStatus.ERROR, {
1243
+ error,
1244
+ data
1245
+ });
1246
+ clearSession();
1247
+ }
1248
+ }
1249
+
1250
+ // src/client/client.ts
1251
+ var isBrowser = typeof window !== "undefined" && typeof localStorage !== "undefined";
1252
+ function warnServerSide(method) {
1253
+ console.warn(
1254
+ `[PollarClient] ${method}() called server-side \u2014 browser APIs unavailable. Use PollarClient only in Client Components.`
1255
+ );
1256
+ }
1257
+ var PollarClient = class {
1258
+ constructor(config) {
1259
+ this._session = null;
1260
+ this._stateListeners = /* @__PURE__ */ new Set();
1261
+ this._state = {
1262
+ [PollarStateVar.LOGIN]: [],
1263
+ [PollarStateVar.WALLET_ADDRESS]: []
1264
+ };
1265
+ this.apiKey = config.apiKey;
1266
+ this.id = crypto.randomUUID();
1267
+ this.basePath = `${config.baseUrl || "https://sdk.api.pollar.xyz"}/v1`;
1268
+ this._api = createApiClient(this.basePath);
1269
+ this._api.use({
1270
+ onRequest({ request }) {
1271
+ request.headers.set("x-pollar-api-key", config.apiKey);
1272
+ return request;
1273
+ }
1274
+ });
1275
+ if (!isBrowser) {
1276
+ warnServerSide("constructor");
1277
+ this._session = null;
1278
+ return;
1279
+ }
1280
+ console.info(`[PollarClient] Initialized \u2014 endpoint: ${this.basePath}`);
1281
+ this._readStore();
1282
+ window.addEventListener("storage", (e) => {
1283
+ if (e.key === STORAGE_KEY) {
1284
+ const prev = this._session;
1285
+ console.info(`[PollarClient] Storage event \u2014 session ${this._session ? "updated" : prev ? "cleared" : "unchanged"}`);
1286
+ this._readStore();
1287
+ }
1288
+ });
1289
+ }
1290
+ isAuthenticated() {
1291
+ return !!this._session?.wallet?.publicKey;
1292
+ }
1293
+ getState() {
1294
+ return { session: this._session };
1295
+ }
1296
+ getApi() {
1297
+ return this._api;
1298
+ }
1299
+ login(options) {
1300
+ if (!isBrowser) {
1301
+ warnServerSide("login");
1302
+ return {
1303
+ cancelLogin: () => {
1304
+ }
1305
+ };
1306
+ }
1307
+ const controller = new AbortController();
1308
+ console.info(`[PollarClient] Login started \u2014 provider: ${options.provider}`);
1309
+ login(options, {
1310
+ api: this._api,
1311
+ basePath: this.basePath,
1312
+ apiKey: this.apiKey,
1313
+ signal: controller.signal,
1314
+ emitState: this._emitState.bind(this),
1315
+ storeSession: this._storeSession.bind(this),
1316
+ clearSession: this._clearSession.bind(this)
1317
+ }).catch((error) => {
1318
+ if (error instanceof Error && error.name === "AbortError") {
1319
+ console.info("[PollarClient] Login aborted by user");
1320
+ this._emitState(PollarStateVar.LOGIN, STATE_VAR_CODES[PollarStateVar.LOGIN].ERROR_ABORTED, "error", StateStatus.ERROR);
1321
+ return;
1322
+ }
1323
+ console.error("[PollarClient] Login failed with unexpected error", error);
1324
+ this._emitState(PollarStateVar.LOGIN, STATE_VAR_CODES[PollarStateVar.LOGIN].ERROR_UNKNOWN, "error", StateStatus.ERROR, {
1325
+ error
1326
+ });
1327
+ });
1328
+ return { cancelLogin: () => controller.abort() };
1329
+ }
1330
+ onStateChange(cb) {
1331
+ this._stateListeners.add(cb);
1332
+ for (const [, stateEntry] of Object.entries(this._state)) {
1333
+ if (stateEntry.length >= 1) {
1334
+ cb(stateEntry.at(-1));
1335
+ }
1336
+ }
1337
+ return () => this._stateListeners.delete(cb);
1338
+ }
1339
+ async verifyEmailCode(clientSessionId, code) {
1340
+ if (!isBrowser) {
1341
+ warnServerSide("verifyEmailCode");
1342
+ return;
1343
+ }
1344
+ try {
1345
+ const { error, data } = await this._api.POST("/auth/email/verify-code", {
1346
+ body: { clientSessionId, code }
1347
+ });
1348
+ if (error || !data || data?.code !== "SDK_EMAIL_CODE_VERIFIED") {
1349
+ this._emitState(
1350
+ PollarStateVar.LOGIN,
1351
+ STATE_VAR_CODES[PollarStateVar.LOGIN].EMAIL_AUTH_CODE_ERROR,
1352
+ "error",
1353
+ StateStatus.ERROR,
1354
+ {
1355
+ data,
1356
+ error
1357
+ }
1358
+ );
1359
+ return;
1360
+ }
1361
+ this._emitState(
1362
+ PollarStateVar.LOGIN,
1363
+ STATE_VAR_CODES[PollarStateVar.LOGIN].EMAIL_AUTH_CODE_SUCCESS,
1364
+ "info",
1365
+ StateStatus.SUCCESS,
1366
+ {
1367
+ data,
1368
+ error
1369
+ }
1370
+ );
1371
+ } catch (error) {
1372
+ this._emitState(
1373
+ PollarStateVar.LOGIN,
1374
+ STATE_VAR_CODES[PollarStateVar.LOGIN].WALLET_AUTH_ALBEDO_NOT_INSTALLED,
1375
+ "error",
1376
+ StateStatus.ERROR
1377
+ );
1378
+ }
1379
+ }
1380
+ logout() {
1381
+ if (!isBrowser) {
1382
+ warnServerSide("logout");
1383
+ return;
1384
+ }
1385
+ console.info("[PollarClient] Logout requested");
1386
+ this._clearSession();
1387
+ }
1388
+ _readStore() {
1389
+ this._session = readStorage();
1390
+ if (this._session) {
1391
+ this._emitState(
1392
+ PollarStateVar.WALLET_ADDRESS,
1393
+ STATE_VAR_CODES[PollarStateVar.WALLET_ADDRESS].UPDATED_ADDRESS,
1394
+ "info",
1395
+ StateStatus.SUCCESS,
1396
+ this._session
1397
+ );
1398
+ console.info("[PollarClient] Session restored from storage");
1399
+ } else {
1400
+ this._emitState(
1401
+ PollarStateVar.WALLET_ADDRESS,
1402
+ STATE_VAR_CODES[PollarStateVar.WALLET_ADDRESS].REMOVED_ADDRESS,
1403
+ "info",
1404
+ StateStatus.SUCCESS
1405
+ );
1406
+ console.info("[PollarClient] Session NO restored from storage");
1407
+ }
1408
+ }
1409
+ _storeSession(session) {
1410
+ console.info(`[PollarClient] Session stored \u2014 user: ${session.userId ?? "anonymous"}`);
1411
+ this._session = session;
1412
+ writeStorage(session);
1413
+ this._emitState(
1414
+ PollarStateVar.WALLET_ADDRESS,
1415
+ STATE_VAR_CODES[PollarStateVar.WALLET_ADDRESS].UPDATED_ADDRESS,
1416
+ "info",
1417
+ StateStatus.SUCCESS,
1418
+ this._session
1419
+ );
1420
+ }
1421
+ _clearSession() {
1422
+ console.info("[PollarClient] Session cleared");
1423
+ this._session = null;
1424
+ removeStorage();
1425
+ this._state = {
1426
+ [PollarStateVar.LOGIN]: [],
1427
+ [PollarStateVar.WALLET_ADDRESS]: []
1428
+ };
1429
+ this._emitState(PollarStateVar.LOGIN, STATE_VAR_CODES[PollarStateVar.LOGIN].LOGOUT, "info", StateStatus.NONE);
1430
+ this._emitState(
1431
+ PollarStateVar.WALLET_ADDRESS,
1432
+ STATE_VAR_CODES[PollarStateVar.WALLET_ADDRESS].REMOVED_ADDRESS,
1433
+ "info",
1434
+ StateStatus.NONE
1435
+ );
1436
+ }
1437
+ _emitState(fn, code, level, status, data) {
1438
+ const stateEntry = { var: fn, code, level, data, status, ts: Date.now() };
1439
+ this._state[fn].push(stateEntry);
1440
+ console[level](`[PollarClient] ${fn}:${code} \u2014 ${status}`);
1441
+ for (const cb of this._stateListeners) {
1442
+ cb(stateEntry);
1443
+ }
1444
+ }
1445
+ };
1446
+
1447
+ // src/stellar/StellarClient.ts
1448
+ var HORIZON_URLS = {
1449
+ mainnet: "https://horizon.stellar.org",
1450
+ testnet: "https://horizon-testnet.stellar.org"
1451
+ };
1452
+ var StellarClient = class {
1453
+ constructor(config) {
1454
+ this.horizonUrl = typeof config === "string" ? HORIZON_URLS[config] : config.horizonUrl;
1455
+ }
1456
+ async getBalances(publicKey) {
1457
+ try {
1458
+ const response = await fetch(`${this.horizonUrl}/accounts/${publicKey}`);
1459
+ if (!response.ok) {
1460
+ if (response.status === 404) {
1461
+ console.warn(`[StellarClient] Account not found: ${publicKey}`);
1462
+ return { success: false, errorCode: "ACCOUNT_NOT_FOUND", balances: [] };
1463
+ }
1464
+ console.warn(`[StellarClient] Horizon API error: ${response.status}`);
1465
+ return { success: false, errorCode: "HORIZON_ERROR", balances: [] };
1466
+ }
1467
+ const data = await response.json();
1468
+ return {
1469
+ success: true,
1470
+ balances: data.balances.filter((b) => b.asset_type !== "liquidity_pool_shares").map((b) => ({
1471
+ asset: b.asset_type === "native" ? "XLM" : b.asset_code ?? "",
1472
+ balance: b.balance,
1473
+ ...b.asset_type !== "native" && { assetIssuer: b.asset_issuer }
1474
+ }))
1475
+ };
1476
+ } catch (error) {
1477
+ console.warn("[StellarClient] Network error fetching balances", error);
1478
+ return { success: false, errorCode: "NETWORK_ERROR", balances: [] };
1479
+ }
1480
+ }
1481
+ };
1482
+
1483
+ export { AlbedoAdapter, FreighterAdapter, PollarClient, PollarError, PollarStateVar, STATE_VAR_CODES, StateStatus, StellarClient, WalletType, isValidSession };
1484
+ //# sourceMappingURL=index.mjs.map
1485
+ //# sourceMappingURL=index.mjs.map