@pollar/core 0.3.9 → 0.4.0

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 CHANGED
@@ -650,20 +650,19 @@ function createApiClient(baseUrl) {
650
650
  return createClient({ baseUrl });
651
651
  }
652
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
- }
653
+ // src/constants.ts
654
+ var StateStatus = {
655
+ NONE: "NONE",
656
+ LOADING: "LOADING",
657
+ SUCCESS: "SUCCESS",
658
+ ERROR: "ERROR"
660
659
  };
661
660
  var PollarStateVar = {
662
- WALLET_ADDRESS: "WALLET_ADDRESS",
663
- LOGIN: "LOGIN"
661
+ AUTHENTICATION: "authentication",
662
+ TRANSACTION: "transaction"
664
663
  };
665
664
  var STATE_VAR_CODES = {
666
- [PollarStateVar.LOGIN]: {
665
+ authentication: {
667
666
  NONE: "NONE",
668
667
  LOGOUT: "LOGOUT",
669
668
  CREATE_SESSION_START: "CREATE_SESSION_START",
@@ -688,20 +687,43 @@ var STATE_VAR_CODES = {
688
687
  FETCH_SESSION_START: "FETCH_SESSION_START",
689
688
  FETCH_SESSION_SUCCESS: "FETCH_SESSION_SUCCESS",
690
689
  FETCH_SESSION_ERROR: "FETCH_SESSION_ERROR",
690
+ RESTORED_SESSION_SUCCESS: "RESTORED_SESSION_SUCCESS",
691
+ RESTORED_SESSION_ERROR: "RESTORED_SESSION_ERROR",
692
+ SESSION_STORED: "SESSION_STORED",
691
693
  ERROR_ABORTED: "ABORTED",
692
694
  ERROR_UNKNOWN: "ERROR_UNKNOWN"
693
695
  },
694
- [PollarStateVar.WALLET_ADDRESS]: {
696
+ walletAddress: {
695
697
  NONE: "NONE",
696
698
  REMOVED_ADDRESS: "REMOVED_ADDRESS",
697
699
  UPDATED_ADDRESS: "UPDATED_ADDRESS"
700
+ },
701
+ transaction: {
702
+ NONE: "NONE",
703
+ BUILD_TRANSACTION_ERROR_NO_WALLET: "BUILD_TRANSACTION_ERROR_NO_WALLET",
704
+ BUILD_TRANSACTION_START: "BUILD_TRANSACTION_START",
705
+ BUILD_TRANSACTION_SUCCESS: "BUILD_TRANSACTION_SUCCESS",
706
+ BUILD_TRANSACTION_ERROR: "BUILD_TRANSACTION_ERROR",
707
+ SIGN_TRANSACTION_START: "SIGN_TRANSACTION_START",
708
+ SIGN_TRANSACTION_SUCCESS: "SIGN_TRANSACTION_SUCCESS",
709
+ SIGN_TRANSACTION_ERROR: "SIGN_TRANSACTION_ERROR",
710
+ SEND_TRANSACTION_START: "SEND_TRANSACTION_START",
711
+ SEND_TRANSACTION_SUCCESS: "SEND_TRANSACTION_SUCCESS",
712
+ SEND_TRANSACTION_ERROR: "SEND_TRANSACTION_ERROR"
698
713
  }
699
714
  };
700
- var StateStatus = {
701
- NONE: "NONE",
702
- LOADING: "LOADING",
703
- SUCCESS: "SUCCESS",
704
- ERROR: "ERROR"
715
+
716
+ // src/client/helpers.ts
717
+ var emitResponse = (state, response, success, errorCode, emitLog) => {
718
+ const isSuccess = !response.error && !!response.data && !!response.data?.success;
719
+ emitLog(
720
+ state,
721
+ isSuccess ? success.code : errorCode,
722
+ isSuccess ? "info" : "error",
723
+ isSuccess ? success.status || StateStatus.LOADING : StateStatus.ERROR,
724
+ isSuccess ? response.data : response.error
725
+ );
726
+ return isSuccess;
705
727
  };
706
728
 
707
729
  // src/wallets/FreighterAdapter.ts
@@ -1095,25 +1117,15 @@ function withSignal(promise, signal) {
1095
1117
  })
1096
1118
  ]);
1097
1119
  }
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
1120
  async function login(options, deps) {
1110
1121
  const { api, basePath, apiKey, signal, emitState, storeSession, clearSession } = deps;
1111
- emitState(PollarStateVar.LOGIN, STATE_VAR_CODES[PollarStateVar.LOGIN].CREATE_SESSION_START, "info", StateStatus.LOADING);
1122
+ emitState("authentication", STATE_VAR_CODES.authentication.CREATE_SESSION_START, "info", StateStatus.LOADING);
1112
1123
  const createSessionResponse = await api.POST("/auth/session", { signal });
1113
1124
  if (!emitResponse(
1125
+ PollarStateVar.AUTHENTICATION,
1114
1126
  createSessionResponse,
1115
- STATE_VAR_CODES[PollarStateVar.LOGIN].CREATE_SESSION_SUCCESS,
1116
- STATE_VAR_CODES[PollarStateVar.LOGIN].CREATE_SESSION_ERROR,
1127
+ { code: STATE_VAR_CODES.authentication.CREATE_SESSION_SUCCESS },
1128
+ STATE_VAR_CODES.authentication.CREATE_SESSION_ERROR,
1117
1129
  emitState
1118
1130
  )) {
1119
1131
  return;
@@ -1121,7 +1133,7 @@ async function login(options, deps) {
1121
1133
  const clientSessionId = createSessionResponse.data.content.clientSessionId;
1122
1134
  switch (options.provider) {
1123
1135
  case "email": {
1124
- emitState(PollarStateVar.LOGIN, STATE_VAR_CODES[PollarStateVar.LOGIN].EMAIL_AUTH_START, "info", StateStatus.LOADING, {
1136
+ emitState("authentication", STATE_VAR_CODES.authentication.EMAIL_AUTH_START, "info", StateStatus.LOADING, {
1125
1137
  email: options.email
1126
1138
  });
1127
1139
  const emailRes = await api.POST(`/auth/email`, {
@@ -1129,9 +1141,10 @@ async function login(options, deps) {
1129
1141
  signal
1130
1142
  });
1131
1143
  if (!emitResponse(
1144
+ PollarStateVar.AUTHENTICATION,
1132
1145
  emailRes,
1133
- STATE_VAR_CODES[PollarStateVar.LOGIN].EMAIL_AUTH_START_SUCCESS,
1134
- STATE_VAR_CODES[PollarStateVar.LOGIN].EMAIL_AUTH_START_ERROR,
1146
+ { code: STATE_VAR_CODES.authentication.EMAIL_AUTH_START_SUCCESS },
1147
+ STATE_VAR_CODES.authentication.EMAIL_AUTH_START_ERROR,
1135
1148
  emitState
1136
1149
  )) {
1137
1150
  return;
@@ -1149,15 +1162,15 @@ async function login(options, deps) {
1149
1162
  }
1150
1163
  case "wallet": {
1151
1164
  try {
1152
- emitState(PollarStateVar.LOGIN, STATE_VAR_CODES[PollarStateVar.LOGIN].WALLET_AUTH_START, "info", StateStatus.LOADING, {
1165
+ emitState("authentication", STATE_VAR_CODES.authentication.WALLET_AUTH_START, "info", StateStatus.LOADING, {
1153
1166
  adapter: options.type
1154
1167
  });
1155
1168
  const adapter = options.type === "freighter" /* FREIGHTER */ ? new FreighterAdapter() : new AlbedoAdapter();
1156
1169
  const available = await withSignal(adapter.isAvailable(), signal);
1157
1170
  if (!available) {
1158
1171
  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,
1172
+ "authentication",
1173
+ options.type === "freighter" /* FREIGHTER */ ? STATE_VAR_CODES.authentication.WALLET_AUTH_FREIGHTER_NOT_INSTALLED : STATE_VAR_CODES.authentication.WALLET_AUTH_ALBEDO_NOT_INSTALLED,
1161
1174
  "info",
1162
1175
  StateStatus.LOADING,
1163
1176
  {
@@ -1166,47 +1179,36 @@ async function login(options, deps) {
1166
1179
  );
1167
1180
  }
1168
1181
  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
- );
1182
+ emitState("authentication", STATE_VAR_CODES.authentication.WALLET_AUTH_CONNECTED, "info", StateStatus.LOADING, {
1183
+ adapter: options.type,
1184
+ publicKey
1185
+ });
1186
+ emitState("authentication", STATE_VAR_CODES.authentication.WALLET_AUTH_LOGIN_START, "info", StateStatus.LOADING, {
1187
+ adapter: options.type,
1188
+ publicKey
1189
+ });
1189
1190
  const emailRes = await api.POST(`/auth/wallet`, {
1190
1191
  body: { clientSessionId, walletAddress: publicKey },
1191
1192
  signal
1192
1193
  });
1193
1194
  if (!emitResponse(
1195
+ PollarStateVar.AUTHENTICATION,
1194
1196
  emailRes,
1195
- STATE_VAR_CODES[PollarStateVar.LOGIN].WALLET_AUTH_LOGIN_START_SUCCESS,
1196
- STATE_VAR_CODES[PollarStateVar.LOGIN].WALLET_AUTH_LOGIN_START_ERROR,
1197
+ { code: STATE_VAR_CODES.authentication.WALLET_AUTH_LOGIN_START_SUCCESS },
1198
+ STATE_VAR_CODES.authentication.WALLET_AUTH_LOGIN_START_ERROR,
1197
1199
  emitState
1198
1200
  )) {
1199
1201
  return;
1200
1202
  }
1201
1203
  } catch (error2) {
1202
- emitState(PollarStateVar.LOGIN, STATE_VAR_CODES[PollarStateVar.LOGIN].WALLET_AUTH_ERROR, "error", StateStatus.ERROR, {
1204
+ emitState("authentication", STATE_VAR_CODES.authentication.WALLET_AUTH_ERROR, "error", StateStatus.ERROR, {
1203
1205
  clientSessionId
1204
1206
  });
1205
1207
  }
1206
1208
  break;
1207
1209
  }
1208
1210
  }
1209
- emitState(PollarStateVar.LOGIN, STATE_VAR_CODES[PollarStateVar.LOGIN].STREAM_POLL_START, "info", StateStatus.LOADING, {
1211
+ emitState("authentication", STATE_VAR_CODES.authentication.STREAM_POLL_START, "info", StateStatus.LOADING, {
1210
1212
  clientSessionId
1211
1213
  });
1212
1214
  await streamUntilFound(
@@ -1215,12 +1217,12 @@ async function login(options, deps) {
1215
1217
  (data2) => {
1216
1218
  const status = data2?.status;
1217
1219
  if (status === "READY") {
1218
- emitState(PollarStateVar.LOGIN, STATE_VAR_CODES[PollarStateVar.LOGIN].STREAM_POLL_READY, "info", StateStatus.LOADING);
1220
+ emitState("authentication", STATE_VAR_CODES.authentication.STREAM_POLL_READY, "info", StateStatus.LOADING);
1219
1221
  return true;
1220
1222
  }
1221
1223
  emitState(
1222
- PollarStateVar.LOGIN,
1223
- STATE_VAR_CODES[PollarStateVar.LOGIN].STREAM_POLL_EVENT + (status ? `/${status}` : ""),
1224
+ "authentication",
1225
+ STATE_VAR_CODES.authentication.STREAM_POLL_EVENT + (status ? `/${status}` : ""),
1224
1226
  "info",
1225
1227
  StateStatus.LOADING,
1226
1228
  data2
@@ -1230,16 +1232,16 @@ async function login(options, deps) {
1230
1232
  200,
1231
1233
  signal
1232
1234
  );
1233
- emitState(PollarStateVar.LOGIN, STATE_VAR_CODES[PollarStateVar.LOGIN].FETCH_SESSION_START, "info", StateStatus.LOADING);
1235
+ emitState("authentication", STATE_VAR_CODES.authentication.FETCH_SESSION_START, "info", StateStatus.LOADING);
1234
1236
  const { data, error } = await api.POST(`/auth/login`, {
1235
1237
  body: { clientSessionId },
1236
1238
  signal
1237
1239
  });
1238
1240
  if (data?.code === "SDK_LOGIN_SUCCESS" && isValidSession(data?.content)) {
1239
- emitState(PollarStateVar.LOGIN, STATE_VAR_CODES[PollarStateVar.LOGIN].FETCH_SESSION_SUCCESS, "info", StateStatus.SUCCESS);
1241
+ emitState("authentication", STATE_VAR_CODES.authentication.FETCH_SESSION_SUCCESS, "info", StateStatus.SUCCESS);
1240
1242
  storeSession(data.content);
1241
1243
  } else {
1242
- emitState(PollarStateVar.LOGIN, STATE_VAR_CODES[PollarStateVar.LOGIN].FETCH_SESSION_ERROR, "error", StateStatus.ERROR, {
1244
+ emitState("authentication", STATE_VAR_CODES.authentication.FETCH_SESSION_ERROR, "error", StateStatus.ERROR, {
1243
1245
  error,
1244
1246
  data
1245
1247
  });
@@ -1259,8 +1261,8 @@ var PollarClient = class {
1259
1261
  this._session = null;
1260
1262
  this._stateListeners = /* @__PURE__ */ new Set();
1261
1263
  this._state = {
1262
- [PollarStateVar.LOGIN]: [],
1263
- [PollarStateVar.WALLET_ADDRESS]: []
1264
+ authentication: [],
1265
+ transaction: []
1264
1266
  };
1265
1267
  this.apiKey = config.apiKey;
1266
1268
  this.id = crypto.randomUUID();
@@ -1317,11 +1319,11 @@ var PollarClient = class {
1317
1319
  }).catch((error) => {
1318
1320
  if (error instanceof Error && error.name === "AbortError") {
1319
1321
  console.info("[PollarClient] Login aborted by user");
1320
- this._emitState(PollarStateVar.LOGIN, STATE_VAR_CODES[PollarStateVar.LOGIN].ERROR_ABORTED, "error", StateStatus.ERROR);
1322
+ this._emitState("authentication", STATE_VAR_CODES.authentication.ERROR_ABORTED, "error", StateStatus.ERROR);
1321
1323
  return;
1322
1324
  }
1323
1325
  console.error("[PollarClient] Login failed with unexpected error", error);
1324
- this._emitState(PollarStateVar.LOGIN, STATE_VAR_CODES[PollarStateVar.LOGIN].ERROR_UNKNOWN, "error", StateStatus.ERROR, {
1326
+ this._emitState("authentication", STATE_VAR_CODES.authentication.ERROR_UNKNOWN, "error", StateStatus.ERROR, {
1325
1327
  error
1326
1328
  });
1327
1329
  });
@@ -1346,37 +1348,74 @@ var PollarClient = class {
1346
1348
  body: { clientSessionId, code }
1347
1349
  });
1348
1350
  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
- {
1351
+ this._emitState("authentication", STATE_VAR_CODES.authentication.EMAIL_AUTH_CODE_ERROR, "error", StateStatus.ERROR, {
1367
1352
  data,
1368
1353
  error
1369
- }
1370
- );
1354
+ });
1355
+ return;
1356
+ }
1357
+ this._emitState("authentication", STATE_VAR_CODES.authentication.EMAIL_AUTH_CODE_SUCCESS, "info", StateStatus.SUCCESS, {
1358
+ data,
1359
+ error
1360
+ });
1371
1361
  } catch (error) {
1372
1362
  this._emitState(
1373
- PollarStateVar.LOGIN,
1374
- STATE_VAR_CODES[PollarStateVar.LOGIN].WALLET_AUTH_ALBEDO_NOT_INSTALLED,
1363
+ "authentication",
1364
+ STATE_VAR_CODES.authentication.WALLET_AUTH_ALBEDO_NOT_INSTALLED,
1375
1365
  "error",
1376
1366
  StateStatus.ERROR
1377
1367
  );
1378
1368
  }
1379
1369
  }
1370
+ async buildTx(operation, params, options) {
1371
+ if (!this._session?.wallet?.publicKey) {
1372
+ this._emitState("transaction", STATE_VAR_CODES.transaction.BUILD_TRANSACTION_ERROR_NO_WALLET, "error", StateStatus.ERROR);
1373
+ return;
1374
+ }
1375
+ const body = {
1376
+ network: "testnet",
1377
+ publicKey: this._session?.wallet?.publicKey,
1378
+ operation,
1379
+ params,
1380
+ options: options || {}
1381
+ };
1382
+ try {
1383
+ this._emitState("transaction", STATE_VAR_CODES.transaction.BUILD_TRANSACTION_START, "info", StateStatus.LOADING);
1384
+ const response = await this._api.POST("/tx/build", { body });
1385
+ console.log({ response });
1386
+ if (!emitResponse(
1387
+ PollarStateVar.TRANSACTION,
1388
+ response,
1389
+ { code: STATE_VAR_CODES.transaction.BUILD_TRANSACTION_SUCCESS, status: StateStatus.SUCCESS },
1390
+ STATE_VAR_CODES.transaction.BUILD_TRANSACTION_ERROR,
1391
+ this._emitState.bind(this)
1392
+ )) {
1393
+ return;
1394
+ }
1395
+ } catch (error) {
1396
+ this._emitState("transaction", STATE_VAR_CODES.transaction.BUILD_TRANSACTION_ERROR, "error", StateStatus.ERROR, {
1397
+ body,
1398
+ error
1399
+ });
1400
+ return;
1401
+ }
1402
+ }
1403
+ async submitTx(signedXdr) {
1404
+ try {
1405
+ console.info("[PollarClient] Submitting signed transaction");
1406
+ const { data, error } = await this._api.POST("/tx/submit", { body: { signedXdr } });
1407
+ if (error || !data?.success) {
1408
+ const msg = error?.message ?? data?.error ?? "Failed to submit transaction";
1409
+ console.warn("[PollarClient] submitTx error \u2014", msg);
1410
+ return { success: false, error: msg };
1411
+ }
1412
+ return { success: true, ...data.content };
1413
+ } catch (err) {
1414
+ const msg = err instanceof Error ? err.message : "Network error";
1415
+ console.warn("[PollarClient] submitTx network error \u2014", msg);
1416
+ return { success: false, error: msg };
1417
+ }
1418
+ }
1380
1419
  logout() {
1381
1420
  if (!isBrowser) {
1382
1421
  warnServerSide("logout");
@@ -1389,20 +1428,15 @@ var PollarClient = class {
1389
1428
  this._session = readStorage();
1390
1429
  if (this._session) {
1391
1430
  this._emitState(
1392
- PollarStateVar.WALLET_ADDRESS,
1393
- STATE_VAR_CODES[PollarStateVar.WALLET_ADDRESS].UPDATED_ADDRESS,
1431
+ "authentication",
1432
+ STATE_VAR_CODES.authentication.RESTORED_SESSION_SUCCESS,
1394
1433
  "info",
1395
1434
  StateStatus.SUCCESS,
1396
1435
  this._session
1397
1436
  );
1398
1437
  console.info("[PollarClient] Session restored from storage");
1399
1438
  } else {
1400
- this._emitState(
1401
- PollarStateVar.WALLET_ADDRESS,
1402
- STATE_VAR_CODES[PollarStateVar.WALLET_ADDRESS].REMOVED_ADDRESS,
1403
- "info",
1404
- StateStatus.SUCCESS
1405
- );
1439
+ this._emitState("authentication", STATE_VAR_CODES.authentication.RESTORED_SESSION_SUCCESS, "warn", StateStatus.ERROR);
1406
1440
  console.info("[PollarClient] Session NO restored from storage");
1407
1441
  }
1408
1442
  }
@@ -1411,8 +1445,8 @@ var PollarClient = class {
1411
1445
  this._session = session;
1412
1446
  writeStorage(session);
1413
1447
  this._emitState(
1414
- PollarStateVar.WALLET_ADDRESS,
1415
- STATE_VAR_CODES[PollarStateVar.WALLET_ADDRESS].UPDATED_ADDRESS,
1448
+ "authentication",
1449
+ STATE_VAR_CODES.authentication.SESSION_STORED,
1416
1450
  "info",
1417
1451
  StateStatus.SUCCESS,
1418
1452
  this._session
@@ -1423,16 +1457,10 @@ var PollarClient = class {
1423
1457
  this._session = null;
1424
1458
  removeStorage();
1425
1459
  this._state = {
1426
- [PollarStateVar.LOGIN]: [],
1427
- [PollarStateVar.WALLET_ADDRESS]: []
1460
+ authentication: [],
1461
+ transaction: []
1428
1462
  };
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
- );
1463
+ this._emitState("authentication", STATE_VAR_CODES.authentication.LOGOUT, "info", StateStatus.NONE);
1436
1464
  }
1437
1465
  _emitState(fn, code, level, status, data) {
1438
1466
  const stateEntry = { var: fn, code, level, data, status, ts: Date.now() };
@@ -1480,6 +1508,6 @@ var StellarClient = class {
1480
1508
  }
1481
1509
  };
1482
1510
 
1483
- export { AlbedoAdapter, FreighterAdapter, PollarClient, PollarError, PollarStateVar, STATE_VAR_CODES, StateStatus, StellarClient, WalletType, isValidSession };
1511
+ export { AlbedoAdapter, FreighterAdapter, PollarClient, PollarStateVar, STATE_VAR_CODES, StateStatus, StellarClient, WalletType, isValidSession };
1484
1512
  //# sourceMappingURL=index.mjs.map
1485
1513
  //# sourceMappingURL=index.mjs.map