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