@xkova/sdk 0.1.0-alpha.4 → 0.1.0-alpha.6
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/README.md +4 -32
- package/dist/abi.d.ts +40 -0
- package/dist/abi.js +25 -0
- package/dist/generated/types.d.ts +264 -1
- package/dist/member-bff.d.ts +7 -2
- package/dist/member-bff.js +4 -4
- package/dist/member-resources.d.ts +10 -1
- package/dist/member-resources.js +7 -6
- package/dist/resources/account-holders.d.ts +100 -1
- package/dist/resources/account-holders.js +36 -7
- package/dist/resources/tokenization.d.ts +4 -0
- package/llms.txt +5 -5
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -491,39 +491,11 @@ idempotency, and settlement. It links the public customer OpenAPI and expanded
|
|
|
491
491
|
documentation. Installed declarations determine the methods available in your
|
|
492
492
|
version; live documentation may describe a newer release.
|
|
493
493
|
|
|
494
|
-
##
|
|
494
|
+
## Contributing
|
|
495
495
|
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
calls. Keep commits small and omit attribution or co-author trailers.
|
|
500
|
-
|
|
501
|
-
The local pre-push hook checks both public SDKs before the existing test gates.
|
|
502
|
-
It reads each pushed branch or tag's committed files, plus new commit messages
|
|
503
|
-
that touch either package. Uncommitted edits cannot change that result. No
|
|
504
|
-
build or network access is needed. Use the repository's pinned Node version,
|
|
505
|
-
then install workspace dependencies with `pnpm install` to set up the hook.
|
|
506
|
-
|
|
507
|
-
To check edits before committing:
|
|
508
|
-
|
|
509
|
-
```sh
|
|
510
|
-
pnpm --filter @xkova/sdk writing:check
|
|
511
|
-
```
|
|
512
|
-
|
|
513
|
-
The check covers package guides, examples, public source and generated types,
|
|
514
|
-
and descriptive package metadata. It rejects stock wording, emoji, em dashes,
|
|
515
|
-
attribution, internal decision narratives, and implementation-provider details.
|
|
516
|
-
Describe installation, supported methods, inputs, results, and the steps an
|
|
517
|
-
application developer needs. Do not turn release planning or maintainer
|
|
518
|
-
conversations into package documentation. Standard license text, rule
|
|
519
|
-
definitions, and negative test fixtures are checked separately.
|
|
520
|
-
|
|
521
|
-
A pass is a mechanical check, not a judgment of authorship. Before pushing,
|
|
522
|
-
reread the result for sentence rhythm, repeated structures, useful comments,
|
|
523
|
-
accurate examples, and test quality. This gate does not scan historical file
|
|
524
|
-
contents or replace secret scanning. It checks commit messages locally;
|
|
525
|
-
review PR descriptions separately. Run `pnpm --filter @xkova/sdk writing:test`
|
|
526
|
-
when changing the rules or hook.
|
|
496
|
+
Run `pnpm check` from the source repository root before committing. The
|
|
497
|
+
[contributor guide](https://github.com/XKOVA/typescript-sdk/blob/main/CONTRIBUTING.md)
|
|
498
|
+
covers generated files, local pre-push checks, writing rules, and packaging.
|
|
527
499
|
|
|
528
500
|
## License
|
|
529
501
|
|
package/dist/abi.d.ts
CHANGED
|
@@ -336,6 +336,14 @@ export declare const erc20XGaslessAbi: readonly [{
|
|
|
336
336
|
readonly name: "";
|
|
337
337
|
readonly type: "string";
|
|
338
338
|
readonly internalType: "string";
|
|
339
|
+
}, {
|
|
340
|
+
readonly name: "";
|
|
341
|
+
readonly type: "uint8";
|
|
342
|
+
readonly internalType: "uint8";
|
|
343
|
+
}, {
|
|
344
|
+
readonly name: "";
|
|
345
|
+
readonly type: "address";
|
|
346
|
+
readonly internalType: "address";
|
|
339
347
|
}, {
|
|
340
348
|
readonly name: "";
|
|
341
349
|
readonly type: "address";
|
|
@@ -362,6 +370,10 @@ export declare const erc20XGaslessAbi: readonly [{
|
|
|
362
370
|
readonly name: "_symbol";
|
|
363
371
|
readonly type: "string";
|
|
364
372
|
readonly internalType: "string";
|
|
373
|
+
}, {
|
|
374
|
+
readonly name: "decimals_";
|
|
375
|
+
readonly type: "uint8";
|
|
376
|
+
readonly internalType: "uint8";
|
|
365
377
|
}, {
|
|
366
378
|
readonly name: "defaultAdmin";
|
|
367
379
|
readonly type: "address";
|
|
@@ -370,6 +382,10 @@ export declare const erc20XGaslessAbi: readonly [{
|
|
|
370
382
|
readonly name: "minter";
|
|
371
383
|
readonly type: "address";
|
|
372
384
|
readonly internalType: "address";
|
|
385
|
+
}, {
|
|
386
|
+
readonly name: "burner";
|
|
387
|
+
readonly type: "address";
|
|
388
|
+
readonly internalType: "address";
|
|
373
389
|
}, {
|
|
374
390
|
readonly name: "pauser";
|
|
375
391
|
readonly type: "address";
|
|
@@ -1062,6 +1078,10 @@ export declare const erc20XGaslessAbi: readonly [{
|
|
|
1062
1078
|
readonly type: "error";
|
|
1063
1079
|
readonly name: "InvalidAddress";
|
|
1064
1080
|
readonly inputs: readonly [];
|
|
1081
|
+
}, {
|
|
1082
|
+
readonly type: "error";
|
|
1083
|
+
readonly name: "InvalidDecimals";
|
|
1084
|
+
readonly inputs: readonly [];
|
|
1065
1085
|
}, {
|
|
1066
1086
|
readonly type: "error";
|
|
1067
1087
|
readonly name: "InvalidImplementation";
|
|
@@ -5482,6 +5502,14 @@ export declare const tokenizationAbis: {
|
|
|
5482
5502
|
readonly name: "";
|
|
5483
5503
|
readonly type: "string";
|
|
5484
5504
|
readonly internalType: "string";
|
|
5505
|
+
}, {
|
|
5506
|
+
readonly name: "";
|
|
5507
|
+
readonly type: "uint8";
|
|
5508
|
+
readonly internalType: "uint8";
|
|
5509
|
+
}, {
|
|
5510
|
+
readonly name: "";
|
|
5511
|
+
readonly type: "address";
|
|
5512
|
+
readonly internalType: "address";
|
|
5485
5513
|
}, {
|
|
5486
5514
|
readonly name: "";
|
|
5487
5515
|
readonly type: "address";
|
|
@@ -5508,6 +5536,10 @@ export declare const tokenizationAbis: {
|
|
|
5508
5536
|
readonly name: "_symbol";
|
|
5509
5537
|
readonly type: "string";
|
|
5510
5538
|
readonly internalType: "string";
|
|
5539
|
+
}, {
|
|
5540
|
+
readonly name: "decimals_";
|
|
5541
|
+
readonly type: "uint8";
|
|
5542
|
+
readonly internalType: "uint8";
|
|
5511
5543
|
}, {
|
|
5512
5544
|
readonly name: "defaultAdmin";
|
|
5513
5545
|
readonly type: "address";
|
|
@@ -5516,6 +5548,10 @@ export declare const tokenizationAbis: {
|
|
|
5516
5548
|
readonly name: "minter";
|
|
5517
5549
|
readonly type: "address";
|
|
5518
5550
|
readonly internalType: "address";
|
|
5551
|
+
}, {
|
|
5552
|
+
readonly name: "burner";
|
|
5553
|
+
readonly type: "address";
|
|
5554
|
+
readonly internalType: "address";
|
|
5519
5555
|
}, {
|
|
5520
5556
|
readonly name: "pauser";
|
|
5521
5557
|
readonly type: "address";
|
|
@@ -6208,6 +6244,10 @@ export declare const tokenizationAbis: {
|
|
|
6208
6244
|
readonly type: "error";
|
|
6209
6245
|
readonly name: "InvalidAddress";
|
|
6210
6246
|
readonly inputs: readonly [];
|
|
6247
|
+
}, {
|
|
6248
|
+
readonly type: "error";
|
|
6249
|
+
readonly name: "InvalidDecimals";
|
|
6250
|
+
readonly inputs: readonly [];
|
|
6211
6251
|
}, {
|
|
6212
6252
|
readonly type: "error";
|
|
6213
6253
|
readonly name: "InvalidImplementation";
|
package/dist/abi.js
CHANGED
|
@@ -443,6 +443,16 @@ export const erc20XGaslessAbi = [
|
|
|
443
443
|
"type": "string",
|
|
444
444
|
"internalType": "string"
|
|
445
445
|
},
|
|
446
|
+
{
|
|
447
|
+
"name": "",
|
|
448
|
+
"type": "uint8",
|
|
449
|
+
"internalType": "uint8"
|
|
450
|
+
},
|
|
451
|
+
{
|
|
452
|
+
"name": "",
|
|
453
|
+
"type": "address",
|
|
454
|
+
"internalType": "address"
|
|
455
|
+
},
|
|
446
456
|
{
|
|
447
457
|
"name": "",
|
|
448
458
|
"type": "address",
|
|
@@ -476,6 +486,11 @@ export const erc20XGaslessAbi = [
|
|
|
476
486
|
"type": "string",
|
|
477
487
|
"internalType": "string"
|
|
478
488
|
},
|
|
489
|
+
{
|
|
490
|
+
"name": "decimals_",
|
|
491
|
+
"type": "uint8",
|
|
492
|
+
"internalType": "uint8"
|
|
493
|
+
},
|
|
479
494
|
{
|
|
480
495
|
"name": "defaultAdmin",
|
|
481
496
|
"type": "address",
|
|
@@ -486,6 +501,11 @@ export const erc20XGaslessAbi = [
|
|
|
486
501
|
"type": "address",
|
|
487
502
|
"internalType": "address"
|
|
488
503
|
},
|
|
504
|
+
{
|
|
505
|
+
"name": "burner",
|
|
506
|
+
"type": "address",
|
|
507
|
+
"internalType": "address"
|
|
508
|
+
},
|
|
489
509
|
{
|
|
490
510
|
"name": "pauser",
|
|
491
511
|
"type": "address",
|
|
@@ -1376,6 +1396,11 @@ export const erc20XGaslessAbi = [
|
|
|
1376
1396
|
"name": "InvalidAddress",
|
|
1377
1397
|
"inputs": []
|
|
1378
1398
|
},
|
|
1399
|
+
{
|
|
1400
|
+
"type": "error",
|
|
1401
|
+
"name": "InvalidDecimals",
|
|
1402
|
+
"inputs": []
|
|
1403
|
+
},
|
|
1379
1404
|
{
|
|
1380
1405
|
"type": "error",
|
|
1381
1406
|
"name": "InvalidImplementation",
|
|
@@ -1150,6 +1150,23 @@ export interface paths {
|
|
|
1150
1150
|
patch?: never;
|
|
1151
1151
|
trace?: never;
|
|
1152
1152
|
};
|
|
1153
|
+
"/account-holders/self/wallet-auth": {
|
|
1154
|
+
parameters: {
|
|
1155
|
+
query?: never;
|
|
1156
|
+
header?: never;
|
|
1157
|
+
path?: never;
|
|
1158
|
+
cookie?: never;
|
|
1159
|
+
};
|
|
1160
|
+
get?: never;
|
|
1161
|
+
put?: never;
|
|
1162
|
+
/** Connect the current member's registered wallet */
|
|
1163
|
+
post: operations["issueAccountHolderSelfWalletAuth"];
|
|
1164
|
+
delete?: never;
|
|
1165
|
+
options?: never;
|
|
1166
|
+
head?: never;
|
|
1167
|
+
patch?: never;
|
|
1168
|
+
trace?: never;
|
|
1169
|
+
};
|
|
1153
1170
|
"/account-holders/self/wallet-provision": {
|
|
1154
1171
|
parameters: {
|
|
1155
1172
|
query?: never;
|
|
@@ -1235,6 +1252,23 @@ export interface paths {
|
|
|
1235
1252
|
patch?: never;
|
|
1236
1253
|
trace?: never;
|
|
1237
1254
|
};
|
|
1255
|
+
"/account-holders/self": {
|
|
1256
|
+
parameters: {
|
|
1257
|
+
query?: never;
|
|
1258
|
+
header?: never;
|
|
1259
|
+
path?: never;
|
|
1260
|
+
cookie?: never;
|
|
1261
|
+
};
|
|
1262
|
+
/** Get the current account holder's profile */
|
|
1263
|
+
get: operations["getAccountHolderSelf"];
|
|
1264
|
+
put?: never;
|
|
1265
|
+
post?: never;
|
|
1266
|
+
delete?: never;
|
|
1267
|
+
options?: never;
|
|
1268
|
+
head?: never;
|
|
1269
|
+
patch?: never;
|
|
1270
|
+
trace?: never;
|
|
1271
|
+
};
|
|
1238
1272
|
"/account-holders/self/balance": {
|
|
1239
1273
|
parameters: {
|
|
1240
1274
|
query?: never;
|
|
@@ -1440,6 +1474,58 @@ export interface paths {
|
|
|
1440
1474
|
patch?: never;
|
|
1441
1475
|
trace?: never;
|
|
1442
1476
|
};
|
|
1477
|
+
"/account-holders/self/avatar/upload-url": {
|
|
1478
|
+
parameters: {
|
|
1479
|
+
query?: never;
|
|
1480
|
+
header?: never;
|
|
1481
|
+
path?: never;
|
|
1482
|
+
cookie?: never;
|
|
1483
|
+
};
|
|
1484
|
+
get?: never;
|
|
1485
|
+
put?: never;
|
|
1486
|
+
/** Create a short-lived avatar upload URL */
|
|
1487
|
+
post: operations["presignAccountHolderSelfAvatarUpload"];
|
|
1488
|
+
delete?: never;
|
|
1489
|
+
options?: never;
|
|
1490
|
+
head?: never;
|
|
1491
|
+
patch?: never;
|
|
1492
|
+
trace?: never;
|
|
1493
|
+
};
|
|
1494
|
+
"/account-holders/self/avatar/confirm": {
|
|
1495
|
+
parameters: {
|
|
1496
|
+
query?: never;
|
|
1497
|
+
header?: never;
|
|
1498
|
+
path?: never;
|
|
1499
|
+
cookie?: never;
|
|
1500
|
+
};
|
|
1501
|
+
get?: never;
|
|
1502
|
+
put?: never;
|
|
1503
|
+
/** Confirm an avatar upload for the account holder */
|
|
1504
|
+
post: operations["confirmAccountHolderSelfAvatar"];
|
|
1505
|
+
delete?: never;
|
|
1506
|
+
options?: never;
|
|
1507
|
+
head?: never;
|
|
1508
|
+
patch?: never;
|
|
1509
|
+
trace?: never;
|
|
1510
|
+
};
|
|
1511
|
+
"/account-holders/self/avatar": {
|
|
1512
|
+
parameters: {
|
|
1513
|
+
query?: never;
|
|
1514
|
+
header?: never;
|
|
1515
|
+
path?: never;
|
|
1516
|
+
cookie?: never;
|
|
1517
|
+
};
|
|
1518
|
+
/** Get a short-TTL presigned GET URL for the holder's avatar */
|
|
1519
|
+
get: operations["getAccountHolderSelfAvatarUrl"];
|
|
1520
|
+
put?: never;
|
|
1521
|
+
post?: never;
|
|
1522
|
+
/** Delete the account holder avatar */
|
|
1523
|
+
delete: operations["deleteAccountHolderSelfAvatar"];
|
|
1524
|
+
options?: never;
|
|
1525
|
+
head?: never;
|
|
1526
|
+
patch?: never;
|
|
1527
|
+
trace?: never;
|
|
1528
|
+
};
|
|
1443
1529
|
"/account-holders/{id}/avatar/upload-url": {
|
|
1444
1530
|
parameters: {
|
|
1445
1531
|
query?: never;
|
|
@@ -4385,6 +4471,18 @@ export interface components {
|
|
|
4385
4471
|
transaction_hash: string | null;
|
|
4386
4472
|
} | null;
|
|
4387
4473
|
};
|
|
4474
|
+
WalletAdmissionBootstrap: {
|
|
4475
|
+
/** @enum {string} */
|
|
4476
|
+
strategy: "auth_endpoint";
|
|
4477
|
+
payload: string;
|
|
4478
|
+
client_id: string;
|
|
4479
|
+
/** Format: uuid */
|
|
4480
|
+
project_id: string;
|
|
4481
|
+
external_user_id: string;
|
|
4482
|
+
/** Format: date-time */
|
|
4483
|
+
expires_at: string;
|
|
4484
|
+
expected_address?: string;
|
|
4485
|
+
};
|
|
4388
4486
|
CuPayoutAccountRef: {
|
|
4389
4487
|
routing_number: string;
|
|
4390
4488
|
account_number: string;
|
|
@@ -4478,6 +4576,7 @@ export interface components {
|
|
|
4478
4576
|
/** @enum {string} */
|
|
4479
4577
|
purpose: "operator" | "service_account";
|
|
4480
4578
|
safe_purpose: ("fund_vault" | "token_control" | "multi_purpose") | null;
|
|
4579
|
+
managed_safe_state: ("deploying" | "active" | "decommissioned") | null;
|
|
4481
4580
|
address: string;
|
|
4482
4581
|
label: string | null;
|
|
4483
4582
|
managed_safe_id: components["schemas"]["ManagedSafeId"] | null;
|
|
@@ -5022,6 +5121,8 @@ export interface components {
|
|
|
5022
5121
|
code_challenge_method: "S256";
|
|
5023
5122
|
};
|
|
5024
5123
|
MemberAuthHostedAuthorizationStart: {
|
|
5124
|
+
/** Format: uri */
|
|
5125
|
+
hosted_origin: string;
|
|
5025
5126
|
/** Format: uri */
|
|
5026
5127
|
authorization_url: string;
|
|
5027
5128
|
expires_at: components["schemas"]["TimestampUtc"];
|
|
@@ -5077,6 +5178,8 @@ export interface components {
|
|
|
5077
5178
|
AccountCenterHandoffStart: {
|
|
5078
5179
|
/** Format: uri */
|
|
5079
5180
|
handoff_url: string;
|
|
5181
|
+
/** Format: uri */
|
|
5182
|
+
hosted_origin: string;
|
|
5080
5183
|
expires_at: components["schemas"]["TimestampUtc"];
|
|
5081
5184
|
};
|
|
5082
5185
|
AccountCenterHandoffExchange: {
|
|
@@ -5846,7 +5949,7 @@ export interface components {
|
|
|
5846
5949
|
AccountCenterIntent: "security" | "sessions" | "wallet_readiness";
|
|
5847
5950
|
MemberActionReadiness: {
|
|
5848
5951
|
/** @enum {string} */
|
|
5849
|
-
authorization_method: "hosted_passkey" | "external_oidc";
|
|
5952
|
+
authorization_method: "hosted_passkey" | "external_oidc" | "xkova_webauthn";
|
|
5850
5953
|
/** @enum {string} */
|
|
5851
5954
|
setup_status: "passkey_required" | "recovery_acknowledgement_required" | "recovery_required" | "ready" | "externally_managed";
|
|
5852
5955
|
action_authorization_enabled: boolean;
|
|
@@ -8261,6 +8364,30 @@ export interface operations {
|
|
|
8261
8364
|
403: components["responses"]["Forbidden"];
|
|
8262
8365
|
};
|
|
8263
8366
|
};
|
|
8367
|
+
issueAccountHolderSelfWalletAuth: {
|
|
8368
|
+
parameters: {
|
|
8369
|
+
query?: never;
|
|
8370
|
+
header: {
|
|
8371
|
+
"X-Member-Session-Id": components["parameters"]["xMemberSessionId"];
|
|
8372
|
+
"X-XKOVA-Publishable-Key": components["parameters"]["xXkovaPublishableKey"];
|
|
8373
|
+
};
|
|
8374
|
+
path?: never;
|
|
8375
|
+
cookie?: never;
|
|
8376
|
+
};
|
|
8377
|
+
requestBody?: never;
|
|
8378
|
+
responses: {
|
|
8379
|
+
200: {
|
|
8380
|
+
headers: {
|
|
8381
|
+
[name: string]: unknown;
|
|
8382
|
+
};
|
|
8383
|
+
content: {
|
|
8384
|
+
"application/json": components["schemas"]["WalletAdmissionBootstrap"] & Record<string, never>;
|
|
8385
|
+
};
|
|
8386
|
+
};
|
|
8387
|
+
401: components["responses"]["Unauthorized"];
|
|
8388
|
+
403: components["responses"]["Forbidden"];
|
|
8389
|
+
};
|
|
8390
|
+
};
|
|
8264
8391
|
ensureAccountHolderSelfWalletProvisioning: {
|
|
8265
8392
|
parameters: {
|
|
8266
8393
|
query?: never;
|
|
@@ -8411,6 +8538,30 @@ export interface operations {
|
|
|
8411
8538
|
403: components["responses"]["Forbidden"];
|
|
8412
8539
|
};
|
|
8413
8540
|
};
|
|
8541
|
+
getAccountHolderSelf: {
|
|
8542
|
+
parameters: {
|
|
8543
|
+
query?: never;
|
|
8544
|
+
header: {
|
|
8545
|
+
"X-Member-Session-Id": components["parameters"]["xMemberSessionId"];
|
|
8546
|
+
"X-XKOVA-Publishable-Key": components["parameters"]["xXkovaPublishableKey"];
|
|
8547
|
+
};
|
|
8548
|
+
path?: never;
|
|
8549
|
+
cookie?: never;
|
|
8550
|
+
};
|
|
8551
|
+
requestBody?: never;
|
|
8552
|
+
responses: {
|
|
8553
|
+
200: {
|
|
8554
|
+
headers: {
|
|
8555
|
+
[name: string]: unknown;
|
|
8556
|
+
};
|
|
8557
|
+
content: {
|
|
8558
|
+
"application/json": components["schemas"]["AccountHolder"];
|
|
8559
|
+
};
|
|
8560
|
+
};
|
|
8561
|
+
401: components["responses"]["Unauthorized"];
|
|
8562
|
+
404: components["responses"]["NotFound"];
|
|
8563
|
+
};
|
|
8564
|
+
};
|
|
8414
8565
|
getAccountHolderSelfBalance: {
|
|
8415
8566
|
parameters: {
|
|
8416
8567
|
query?: never;
|
|
@@ -8820,6 +8971,118 @@ export interface operations {
|
|
|
8820
8971
|
404: components["responses"]["NotFound"];
|
|
8821
8972
|
};
|
|
8822
8973
|
};
|
|
8974
|
+
presignAccountHolderSelfAvatarUpload: {
|
|
8975
|
+
parameters: {
|
|
8976
|
+
query?: never;
|
|
8977
|
+
header: {
|
|
8978
|
+
"X-Member-Session-Id": components["parameters"]["xMemberSessionId"];
|
|
8979
|
+
"X-XKOVA-Publishable-Key": components["parameters"]["xXkovaPublishableKey"];
|
|
8980
|
+
};
|
|
8981
|
+
path?: never;
|
|
8982
|
+
cookie?: never;
|
|
8983
|
+
};
|
|
8984
|
+
requestBody: {
|
|
8985
|
+
content: {
|
|
8986
|
+
"application/json": components["schemas"]["AccountHolderAvatarUploadUrl"];
|
|
8987
|
+
};
|
|
8988
|
+
};
|
|
8989
|
+
responses: {
|
|
8990
|
+
200: {
|
|
8991
|
+
headers: {
|
|
8992
|
+
[name: string]: unknown;
|
|
8993
|
+
};
|
|
8994
|
+
content: {
|
|
8995
|
+
"application/json": components["schemas"]["AccountHolderAvatarUploadUrlResponse"];
|
|
8996
|
+
};
|
|
8997
|
+
};
|
|
8998
|
+
400: components["responses"]["BadRequest"];
|
|
8999
|
+
401: components["responses"]["Unauthorized"];
|
|
9000
|
+
403: components["responses"]["Forbidden"];
|
|
9001
|
+
404: components["responses"]["NotFound"];
|
|
9002
|
+
422: components["responses"]["UnprocessableEntity"];
|
|
9003
|
+
};
|
|
9004
|
+
};
|
|
9005
|
+
confirmAccountHolderSelfAvatar: {
|
|
9006
|
+
parameters: {
|
|
9007
|
+
query?: never;
|
|
9008
|
+
header: {
|
|
9009
|
+
"X-Member-Session-Id": components["parameters"]["xMemberSessionId"];
|
|
9010
|
+
"X-XKOVA-Publishable-Key": components["parameters"]["xXkovaPublishableKey"];
|
|
9011
|
+
};
|
|
9012
|
+
path?: never;
|
|
9013
|
+
cookie?: never;
|
|
9014
|
+
};
|
|
9015
|
+
requestBody: {
|
|
9016
|
+
content: {
|
|
9017
|
+
"application/json": components["schemas"]["AccountHolderAvatarConfirm"];
|
|
9018
|
+
};
|
|
9019
|
+
};
|
|
9020
|
+
responses: {
|
|
9021
|
+
200: {
|
|
9022
|
+
headers: {
|
|
9023
|
+
[name: string]: unknown;
|
|
9024
|
+
};
|
|
9025
|
+
content: {
|
|
9026
|
+
"application/json": components["schemas"]["AccountHolder"];
|
|
9027
|
+
};
|
|
9028
|
+
};
|
|
9029
|
+
400: components["responses"]["BadRequest"];
|
|
9030
|
+
401: components["responses"]["Unauthorized"];
|
|
9031
|
+
403: components["responses"]["Forbidden"];
|
|
9032
|
+
404: components["responses"]["NotFound"];
|
|
9033
|
+
422: components["responses"]["UnprocessableEntity"];
|
|
9034
|
+
};
|
|
9035
|
+
};
|
|
9036
|
+
getAccountHolderSelfAvatarUrl: {
|
|
9037
|
+
parameters: {
|
|
9038
|
+
query?: never;
|
|
9039
|
+
header: {
|
|
9040
|
+
"X-Member-Session-Id": components["parameters"]["xMemberSessionId"];
|
|
9041
|
+
"X-XKOVA-Publishable-Key": components["parameters"]["xXkovaPublishableKey"];
|
|
9042
|
+
};
|
|
9043
|
+
path?: never;
|
|
9044
|
+
cookie?: never;
|
|
9045
|
+
};
|
|
9046
|
+
requestBody?: never;
|
|
9047
|
+
responses: {
|
|
9048
|
+
200: {
|
|
9049
|
+
headers: {
|
|
9050
|
+
[name: string]: unknown;
|
|
9051
|
+
};
|
|
9052
|
+
content: {
|
|
9053
|
+
"application/json": components["schemas"]["AccountHolderAvatarUrl"];
|
|
9054
|
+
};
|
|
9055
|
+
};
|
|
9056
|
+
401: components["responses"]["Unauthorized"];
|
|
9057
|
+
403: components["responses"]["Forbidden"];
|
|
9058
|
+
404: components["responses"]["NotFound"];
|
|
9059
|
+
};
|
|
9060
|
+
};
|
|
9061
|
+
deleteAccountHolderSelfAvatar: {
|
|
9062
|
+
parameters: {
|
|
9063
|
+
query?: never;
|
|
9064
|
+
header: {
|
|
9065
|
+
"X-Member-Session-Id": components["parameters"]["xMemberSessionId"];
|
|
9066
|
+
"X-XKOVA-Publishable-Key": components["parameters"]["xXkovaPublishableKey"];
|
|
9067
|
+
};
|
|
9068
|
+
path?: never;
|
|
9069
|
+
cookie?: never;
|
|
9070
|
+
};
|
|
9071
|
+
requestBody?: never;
|
|
9072
|
+
responses: {
|
|
9073
|
+
200: {
|
|
9074
|
+
headers: {
|
|
9075
|
+
[name: string]: unknown;
|
|
9076
|
+
};
|
|
9077
|
+
content: {
|
|
9078
|
+
"application/json": components["schemas"]["AccountHolder"];
|
|
9079
|
+
};
|
|
9080
|
+
};
|
|
9081
|
+
401: components["responses"]["Unauthorized"];
|
|
9082
|
+
403: components["responses"]["Forbidden"];
|
|
9083
|
+
404: components["responses"]["NotFound"];
|
|
9084
|
+
};
|
|
9085
|
+
};
|
|
8823
9086
|
presignAccountHolderAvatarUpload: {
|
|
8824
9087
|
parameters: {
|
|
8825
9088
|
query?: never;
|
package/dist/member-bff.d.ts
CHANGED
|
@@ -116,7 +116,7 @@ export type XKOVAMemberAuthorizationTransaction<TApplicationData = unknown> = {
|
|
|
116
116
|
readonly sessionReference: string;
|
|
117
117
|
readonly intent: XKOVAAccountCenterIntent;
|
|
118
118
|
readonly actionAuthorization?: {
|
|
119
|
-
readonly method: 'hosted_passkey';
|
|
119
|
+
readonly method: 'hosted_passkey' | 'xkova_webauthn';
|
|
120
120
|
} | {
|
|
121
121
|
readonly method: 'external_oidc';
|
|
122
122
|
readonly actionToken: string;
|
|
@@ -239,7 +239,7 @@ export interface XKOVAAccountCenterHandoffCompletion {
|
|
|
239
239
|
readonly applicationReturnUri?: string;
|
|
240
240
|
}
|
|
241
241
|
export type XKOVAMemberActionAuthorizationStart = {
|
|
242
|
-
readonly authorizationMethod: 'hosted_passkey';
|
|
242
|
+
readonly authorizationMethod: 'hosted_passkey' | 'xkova_webauthn';
|
|
243
243
|
readonly authorizationUrl: string;
|
|
244
244
|
readonly state: string;
|
|
245
245
|
readonly expiresAt: string;
|
|
@@ -455,6 +455,11 @@ export declare class XKOVAMemberBffClient {
|
|
|
455
455
|
resolveResources<TApplicationData>(input: {
|
|
456
456
|
readonly reference: string;
|
|
457
457
|
readonly sessionStore: XKOVAMemberSessionStore<TApplicationData>;
|
|
458
|
+
/**
|
|
459
|
+
* Defaults true. Set false only when the bound resource request executes
|
|
460
|
+
* immediately and therefore performs the same exact-session validation.
|
|
461
|
+
*/
|
|
462
|
+
readonly validateWithXkova?: boolean;
|
|
458
463
|
}): Promise<{
|
|
459
464
|
readonly session: StoredXKOVAMemberSession<TApplicationData>;
|
|
460
465
|
readonly resources: XKOVAMemberResources;
|
package/dist/member-bff.js
CHANGED
|
@@ -536,15 +536,15 @@ export class XKOVAMemberBffClient {
|
|
|
536
536
|
const object = requireObject(value, 'member action authorization start');
|
|
537
537
|
const method = requireString(object, 'authorization_method', 'member action authorization start');
|
|
538
538
|
const { expiresAt, expiresAtMillis } = boundedAuthorizationExpiry(object, provisionalExpiresAt, 'member action authorization start');
|
|
539
|
-
if (method === 'hosted_passkey') {
|
|
539
|
+
if (method === 'hosted_passkey' || method === 'xkova_webauthn') {
|
|
540
540
|
const authorizationUrl = normalizeHostedAuthorizationUrl(requireString(object, 'authorization_url', 'member action authorization start'));
|
|
541
541
|
await input.transactionStore.replace(stateHash, {
|
|
542
542
|
...transaction,
|
|
543
|
-
actionAuthorization: { method
|
|
543
|
+
actionAuthorization: { method },
|
|
544
544
|
expiresAt: expiresAtMillis,
|
|
545
545
|
});
|
|
546
546
|
return {
|
|
547
|
-
authorizationMethod:
|
|
547
|
+
authorizationMethod: method,
|
|
548
548
|
authorizationUrl,
|
|
549
549
|
state,
|
|
550
550
|
expiresAt,
|
|
@@ -606,7 +606,7 @@ export class XKOVAMemberBffClient {
|
|
|
606
606
|
if (initial?.completionMode === 'account_center_result_code' &&
|
|
607
607
|
initial.status === 'pending' &&
|
|
608
608
|
initial.intent === 'action' &&
|
|
609
|
-
initial.actionAuthorization?.method
|
|
609
|
+
['hosted_passkey', 'xkova_webauthn'].includes(initial.actionAuthorization?.method ?? '')) {
|
|
610
610
|
const completion = await this.completeAccountCenterHandoff(input);
|
|
611
611
|
if (!completion.signingExchangeCode || !completion.signingUrl) {
|
|
612
612
|
throw new Error('XKOVA Hosted action completion omitted its signing projection');
|
|
@@ -69,7 +69,7 @@ export declare class XKOVAMemberResources {
|
|
|
69
69
|
} | null;
|
|
70
70
|
}>;
|
|
71
71
|
actionReadiness: (control?: XKOVARequestControl) => Promise<{
|
|
72
|
-
authorization_method: "hosted_passkey" | "external_oidc";
|
|
72
|
+
authorization_method: "hosted_passkey" | "external_oidc" | "xkova_webauthn";
|
|
73
73
|
setup_status: "passkey_required" | "recovery_acknowledgement_required" | "recovery_required" | "ready" | "externally_managed";
|
|
74
74
|
action_authorization_enabled: boolean;
|
|
75
75
|
requires_fresh_proof: true;
|
|
@@ -107,6 +107,15 @@ export declare class XKOVAMemberResources {
|
|
|
107
107
|
wallets: (control?: XKOVARequestControl) => Promise<{
|
|
108
108
|
data: import("./generated/types.js").components["schemas"]["Wallet"][];
|
|
109
109
|
}>;
|
|
110
|
+
walletAuth: (control?: XKOVARequestControl) => Promise<{
|
|
111
|
+
strategy: "auth_endpoint";
|
|
112
|
+
payload: string;
|
|
113
|
+
client_id: string;
|
|
114
|
+
project_id: string;
|
|
115
|
+
external_user_id: string;
|
|
116
|
+
expires_at: string;
|
|
117
|
+
expected_address?: string;
|
|
118
|
+
} & Record<string, never>>;
|
|
110
119
|
walletReadiness: (control?: XKOVARequestControl) => Promise<{
|
|
111
120
|
status: "not_registered" | "provisioning" | "ready";
|
|
112
121
|
wallets: import("./generated/types.js").components["schemas"]["Wallet"][];
|
package/dist/member-resources.js
CHANGED
|
@@ -31,7 +31,7 @@ export class XKOVAMemberResources {
|
|
|
31
31
|
return this.client.wallets;
|
|
32
32
|
}
|
|
33
33
|
self = {
|
|
34
|
-
profile: () => this.client.accountHolders.
|
|
34
|
+
profile: () => this.client.accountHolders.selfProfile(this.context),
|
|
35
35
|
productEnrollment: (product, control) => this.client.accountHolders.selfProductEnrollment(this.context, product, control),
|
|
36
36
|
acceptProductEnrollment: (product, body, opts) => this.client.accountHolders.acceptSelfProductEnrollment(this.context, product, body, opts),
|
|
37
37
|
actionReadiness: (control) => this.client.accountHolders.selfActionReadiness({ ...this.context, accountHolderId: this.accountHolderId }, control),
|
|
@@ -39,6 +39,7 @@ export class XKOVAMemberResources {
|
|
|
39
39
|
verification: (control) => this.client.accountHolders.selfVerification(this.context, control),
|
|
40
40
|
balance: (control) => this.client.accountHolders.selfBalance(this.context, control),
|
|
41
41
|
wallets: (control) => this.client.accountHolders.listSelfWallets(this.context, control),
|
|
42
|
+
walletAuth: (control) => this.client.accountHolders.selfWalletAuth(this.context, control),
|
|
42
43
|
walletReadiness: (control) => this.client.accountHolders.selfWalletReadiness(this.context, control),
|
|
43
44
|
ensureWalletProvisioning: (opts) => this.client.accountHolders.ensureSelfWalletProvisioning(this.context, opts),
|
|
44
45
|
bankBalance: (control) => this.client.accountHolders.selfBankBalance(this.context, control),
|
|
@@ -50,10 +51,10 @@ export class XKOVAMemberResources {
|
|
|
50
51
|
requestDataExport: (opts) => this.client.accountHolders.requestSelfDataExport(this.context, opts),
|
|
51
52
|
dataExport: (id, control) => this.client.accountHolders.selfDataExport(this.context, id, control),
|
|
52
53
|
transactions: (query, control) => this.client.accountHolders.listSelfTransactions(this.context, query, control),
|
|
53
|
-
avatar: () => this.client.accountHolders.
|
|
54
|
-
uploadAvatar: (image, control) => this.client.accountHolders.
|
|
55
|
-
deleteAvatar: (opts) => this.client.accountHolders.
|
|
56
|
-
confirmAvatar: (body, opts) => this.client.accountHolders.
|
|
57
|
-
presignAvatarUpload: (body, opts) => this.client.accountHolders.
|
|
54
|
+
avatar: () => this.client.accountHolders.selfAvatarUrl(this.context),
|
|
55
|
+
uploadAvatar: (image, control) => this.client.accountHolders.uploadSelfAvatar(this.context, image, control),
|
|
56
|
+
deleteAvatar: (opts) => this.client.accountHolders.deleteSelfAvatar(this.context, opts),
|
|
57
|
+
confirmAvatar: (body, opts) => this.client.accountHolders.confirmSelfAvatar(this.context, body, opts),
|
|
58
|
+
presignAvatarUpload: (body, opts) => this.client.accountHolders.presignSelfAvatarUpload(this.context, body, opts),
|
|
58
59
|
};
|
|
59
60
|
}
|
|
@@ -100,6 +100,32 @@ export declare class AccountHoldersResource extends Resource {
|
|
|
100
100
|
next_cursor?: string | null;
|
|
101
101
|
has_more: boolean;
|
|
102
102
|
}>;
|
|
103
|
+
selfProfile(context: XKOVAMemberSessionContext, control?: XKOVARequestControl): Promise<{
|
|
104
|
+
id: import("../generated/types.js").components["schemas"]["AccountHolderId"];
|
|
105
|
+
tenant_id?: string;
|
|
106
|
+
state: "active" | "held" | "closed" | "closed_uncooperative" | "provisioning_failed";
|
|
107
|
+
state_reason?: string | null;
|
|
108
|
+
state_changed_at?: import("../generated/types.js").components["schemas"]["TimestampUtc"] | null;
|
|
109
|
+
tier: "tier_1" | "tier_2";
|
|
110
|
+
tier_2_uplift_status?: "not_requested" | "pending" | "passed" | "failed";
|
|
111
|
+
first_use_completed: boolean;
|
|
112
|
+
cip_payload?: {
|
|
113
|
+
name_hash?: string;
|
|
114
|
+
dob_hash?: string;
|
|
115
|
+
id_hash?: string;
|
|
116
|
+
address_hash?: string;
|
|
117
|
+
} | null;
|
|
118
|
+
cip_accepted_at?: import("../generated/types.js").components["schemas"]["TimestampUtc"] | null;
|
|
119
|
+
merchant_role_state?: "none" | "pending_review" | "approved" | "rejected" | "revoked";
|
|
120
|
+
auto_save_contacts?: boolean;
|
|
121
|
+
created_at: import("../generated/types.js").components["schemas"]["TimestampUtc"];
|
|
122
|
+
updated_at?: import("../generated/types.js").components["schemas"]["TimestampUtc"];
|
|
123
|
+
email?: string | null;
|
|
124
|
+
first_name?: string | null;
|
|
125
|
+
last_name?: string | null;
|
|
126
|
+
phone?: string | null;
|
|
127
|
+
avatar_url?: string | null;
|
|
128
|
+
}>;
|
|
103
129
|
selfVerification(context: XKOVAMemberSessionContext, control?: XKOVARequestControl): Promise<{
|
|
104
130
|
required: boolean;
|
|
105
131
|
status: string;
|
|
@@ -148,6 +174,15 @@ export declare class AccountHoldersResource extends Resource {
|
|
|
148
174
|
listSelfWallets(context: XKOVAMemberSessionContext, control?: XKOVARequestControl): Promise<{
|
|
149
175
|
data: import("../generated/types.js").components["schemas"]["Wallet"][];
|
|
150
176
|
}>;
|
|
177
|
+
selfWalletAuth(context: XKOVAMemberSessionContext, control?: XKOVARequestControl): Promise<{
|
|
178
|
+
strategy: "auth_endpoint";
|
|
179
|
+
payload: string;
|
|
180
|
+
client_id: string;
|
|
181
|
+
project_id: string;
|
|
182
|
+
external_user_id: string;
|
|
183
|
+
expires_at: string;
|
|
184
|
+
expected_address?: string;
|
|
185
|
+
} & Record<string, never>>;
|
|
151
186
|
selfWalletReadiness(context: XKOVAMemberSessionContext, control?: XKOVARequestControl): Promise<{
|
|
152
187
|
status: "not_registered" | "provisioning" | "ready";
|
|
153
188
|
wallets: import("../generated/types.js").components["schemas"]["Wallet"][];
|
|
@@ -173,7 +208,7 @@ export declare class AccountHoldersResource extends Resource {
|
|
|
173
208
|
selfActionReadiness(context: XKOVAMemberSessionContext & {
|
|
174
209
|
accountHolderId: string;
|
|
175
210
|
}, control?: XKOVARequestControl): Promise<{
|
|
176
|
-
authorization_method: "hosted_passkey" | "external_oidc";
|
|
211
|
+
authorization_method: "hosted_passkey" | "external_oidc" | "xkova_webauthn";
|
|
177
212
|
setup_status: "passkey_required" | "recovery_acknowledgement_required" | "recovery_required" | "ready" | "externally_managed";
|
|
178
213
|
action_authorization_enabled: boolean;
|
|
179
214
|
requires_fresh_proof: true;
|
|
@@ -253,6 +288,70 @@ export declare class AccountHoldersResource extends Resource {
|
|
|
253
288
|
uploadAvatar(id: string, image: Blob, control?: XKOVARequestControl): Promise<{
|
|
254
289
|
url: string | null;
|
|
255
290
|
}>;
|
|
291
|
+
uploadSelfAvatar(context: XKOVAMemberSessionContext, image: Blob, control?: XKOVARequestControl): Promise<{
|
|
292
|
+
url: string | null;
|
|
293
|
+
}>;
|
|
294
|
+
private uploadAvatarImage;
|
|
295
|
+
selfAvatarUrl(context: XKOVAMemberSessionContext): Promise<{
|
|
296
|
+
url: string | null;
|
|
297
|
+
}>;
|
|
298
|
+
deleteSelfAvatar(context: XKOVAMemberSessionContext, opts?: XKOVAMutationOptions): Promise<{
|
|
299
|
+
id: import("../generated/types.js").components["schemas"]["AccountHolderId"];
|
|
300
|
+
tenant_id?: string;
|
|
301
|
+
state: "active" | "held" | "closed" | "closed_uncooperative" | "provisioning_failed";
|
|
302
|
+
state_reason?: string | null;
|
|
303
|
+
state_changed_at?: import("../generated/types.js").components["schemas"]["TimestampUtc"] | null;
|
|
304
|
+
tier: "tier_1" | "tier_2";
|
|
305
|
+
tier_2_uplift_status?: "not_requested" | "pending" | "passed" | "failed";
|
|
306
|
+
first_use_completed: boolean;
|
|
307
|
+
cip_payload?: {
|
|
308
|
+
name_hash?: string;
|
|
309
|
+
dob_hash?: string;
|
|
310
|
+
id_hash?: string;
|
|
311
|
+
address_hash?: string;
|
|
312
|
+
} | null;
|
|
313
|
+
cip_accepted_at?: import("../generated/types.js").components["schemas"]["TimestampUtc"] | null;
|
|
314
|
+
merchant_role_state?: "none" | "pending_review" | "approved" | "rejected" | "revoked";
|
|
315
|
+
auto_save_contacts?: boolean;
|
|
316
|
+
created_at: import("../generated/types.js").components["schemas"]["TimestampUtc"];
|
|
317
|
+
updated_at?: import("../generated/types.js").components["schemas"]["TimestampUtc"];
|
|
318
|
+
email?: string | null;
|
|
319
|
+
first_name?: string | null;
|
|
320
|
+
last_name?: string | null;
|
|
321
|
+
phone?: string | null;
|
|
322
|
+
avatar_url?: string | null;
|
|
323
|
+
}>;
|
|
324
|
+
confirmSelfAvatar(context: XKOVAMemberSessionContext, body: ReqBody<'confirmAccountHolderSelfAvatar'>, opts?: XKOVAMutationOptions): Promise<{
|
|
325
|
+
id: import("../generated/types.js").components["schemas"]["AccountHolderId"];
|
|
326
|
+
tenant_id?: string;
|
|
327
|
+
state: "active" | "held" | "closed" | "closed_uncooperative" | "provisioning_failed";
|
|
328
|
+
state_reason?: string | null;
|
|
329
|
+
state_changed_at?: import("../generated/types.js").components["schemas"]["TimestampUtc"] | null;
|
|
330
|
+
tier: "tier_1" | "tier_2";
|
|
331
|
+
tier_2_uplift_status?: "not_requested" | "pending" | "passed" | "failed";
|
|
332
|
+
first_use_completed: boolean;
|
|
333
|
+
cip_payload?: {
|
|
334
|
+
name_hash?: string;
|
|
335
|
+
dob_hash?: string;
|
|
336
|
+
id_hash?: string;
|
|
337
|
+
address_hash?: string;
|
|
338
|
+
} | null;
|
|
339
|
+
cip_accepted_at?: import("../generated/types.js").components["schemas"]["TimestampUtc"] | null;
|
|
340
|
+
merchant_role_state?: "none" | "pending_review" | "approved" | "rejected" | "revoked";
|
|
341
|
+
auto_save_contacts?: boolean;
|
|
342
|
+
created_at: import("../generated/types.js").components["schemas"]["TimestampUtc"];
|
|
343
|
+
updated_at?: import("../generated/types.js").components["schemas"]["TimestampUtc"];
|
|
344
|
+
email?: string | null;
|
|
345
|
+
first_name?: string | null;
|
|
346
|
+
last_name?: string | null;
|
|
347
|
+
phone?: string | null;
|
|
348
|
+
avatar_url?: string | null;
|
|
349
|
+
}>;
|
|
350
|
+
presignSelfAvatarUpload(context: XKOVAMemberSessionContext, body: ReqBody<'presignAccountHolderSelfAvatarUpload'>, opts?: XKOVAMutationOptions): Promise<{
|
|
351
|
+
upload_url: string;
|
|
352
|
+
object_key: string;
|
|
353
|
+
expires_at: import("../generated/types.js").components["schemas"]["TimestampUtc"];
|
|
354
|
+
}>;
|
|
256
355
|
avatarUrl(id: string): Promise<{
|
|
257
356
|
url: string | null;
|
|
258
357
|
}>;
|
|
@@ -28,6 +28,9 @@ export class AccountHoldersResource extends Resource {
|
|
|
28
28
|
history(id, query = {}) {
|
|
29
29
|
return this.getJson(`/account-holders/${this.enc(id)}/history`, query);
|
|
30
30
|
}
|
|
31
|
+
selfProfile(context, control) {
|
|
32
|
+
return this.getJson('/account-holders/self', undefined, control, memberSessionHeaders(context));
|
|
33
|
+
}
|
|
31
34
|
selfVerification(context, control) {
|
|
32
35
|
return this.getJson('/account-holders/self/verification', undefined, control, memberSessionHeaders(context));
|
|
33
36
|
}
|
|
@@ -43,6 +46,9 @@ export class AccountHoldersResource extends Resource {
|
|
|
43
46
|
listSelfWallets(context, control) {
|
|
44
47
|
return this.getJson('/account-holders/self/wallets', undefined, control, memberSessionHeaders(context));
|
|
45
48
|
}
|
|
49
|
+
selfWalletAuth(context, control) {
|
|
50
|
+
return this.postJson('/account-holders/self/wallet-auth', undefined, control, undefined, memberSessionHeaders(context));
|
|
51
|
+
}
|
|
46
52
|
selfWalletReadiness(context, control) {
|
|
47
53
|
return this.getJson('/account-holders/self/wallet-readiness', undefined, control, memberSessionHeaders(context));
|
|
48
54
|
}
|
|
@@ -64,7 +70,7 @@ export class AccountHoldersResource extends Resource {
|
|
|
64
70
|
}
|
|
65
71
|
const readiness = status.action_readiness;
|
|
66
72
|
if (!readiness ||
|
|
67
|
-
!['hosted_passkey', 'external_oidc'].includes(readiness.authorization_method) ||
|
|
73
|
+
!['hosted_passkey', 'external_oidc', 'xkova_webauthn'].includes(readiness.authorization_method) ||
|
|
68
74
|
![
|
|
69
75
|
'passkey_required',
|
|
70
76
|
'recovery_acknowledgement_required',
|
|
@@ -109,15 +115,26 @@ export class AccountHoldersResource extends Resource {
|
|
|
109
115
|
* member context and cookies never follow the presigned URL or a redirect.
|
|
110
116
|
*/
|
|
111
117
|
async uploadAvatar(id, image, control = {}) {
|
|
118
|
+
return this.uploadAvatarImage(image, control, {
|
|
119
|
+
presign: (body) => this.presignAvatarUpload(id, body, control),
|
|
120
|
+
confirm: (object_key) => this.confirmAvatar(id, { object_key }, control),
|
|
121
|
+
read: () => this.avatarUrl(id),
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
async uploadSelfAvatar(context, image, control = {}) {
|
|
125
|
+
return this.uploadAvatarImage(image, control, {
|
|
126
|
+
presign: (body) => this.presignSelfAvatarUpload(context, body, control),
|
|
127
|
+
confirm: (object_key) => this.confirmSelfAvatar(context, { object_key }, control),
|
|
128
|
+
read: () => this.selfAvatarUrl(context),
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
async uploadAvatarImage(image, control, operations) {
|
|
112
132
|
if (!['image/png', 'image/jpeg', 'image/webp', 'image/gif'].includes(image.type) ||
|
|
113
133
|
image.size === 0 ||
|
|
114
134
|
image.size > 5 * 1024 * 1024) {
|
|
115
135
|
throw new TypeError('Avatar must be a PNG, JPEG, WebP, or GIF image of at most 5 MiB');
|
|
116
136
|
}
|
|
117
|
-
const upload = await
|
|
118
|
-
content_type: image.type,
|
|
119
|
-
content_length: image.size,
|
|
120
|
-
}, control);
|
|
137
|
+
const upload = await operations.presign({ content_type: image.type, content_length: image.size });
|
|
121
138
|
const target = new URL(upload.upload_url);
|
|
122
139
|
if (target.username ||
|
|
123
140
|
target.password ||
|
|
@@ -151,8 +168,20 @@ export class AccountHoldersResource extends Resource {
|
|
|
151
168
|
}
|
|
152
169
|
if (!response.ok)
|
|
153
170
|
throw new XKOVAUploadError('Object storage rejected the avatar upload', response.status);
|
|
154
|
-
await
|
|
155
|
-
return
|
|
171
|
+
await operations.confirm(upload.object_key);
|
|
172
|
+
return operations.read();
|
|
173
|
+
}
|
|
174
|
+
selfAvatarUrl(context) {
|
|
175
|
+
return this.getJson('/account-holders/self/avatar', undefined, {}, memberSessionHeaders(context));
|
|
176
|
+
}
|
|
177
|
+
deleteSelfAvatar(context, opts) {
|
|
178
|
+
return this.deleteJson('/account-holders/self/avatar', opts, undefined, memberSessionHeaders(context));
|
|
179
|
+
}
|
|
180
|
+
confirmSelfAvatar(context, body, opts) {
|
|
181
|
+
return this.postJson('/account-holders/self/avatar/confirm', body, opts, undefined, memberSessionHeaders(context));
|
|
182
|
+
}
|
|
183
|
+
presignSelfAvatarUpload(context, body, opts) {
|
|
184
|
+
return this.postJson('/account-holders/self/avatar/upload-url', body, opts, undefined, memberSessionHeaders(context));
|
|
156
185
|
}
|
|
157
186
|
avatarUrl(id) {
|
|
158
187
|
return this.getJson(`/account-holders/${this.enc(id)}/avatar`);
|
|
@@ -56,6 +56,7 @@ export declare class TokenizationResource extends Resource {
|
|
|
56
56
|
kind: "server_key" | "safe";
|
|
57
57
|
purpose: "operator" | "service_account";
|
|
58
58
|
safe_purpose: ("fund_vault" | "token_control" | "multi_purpose") | null;
|
|
59
|
+
managed_safe_state: ("deploying" | "active" | "decommissioned") | null;
|
|
59
60
|
address: string;
|
|
60
61
|
label: string | null;
|
|
61
62
|
managed_safe_id: import("../generated/types.js").components["schemas"]["ManagedSafeId"] | null;
|
|
@@ -68,6 +69,7 @@ export declare class TokenizationResource extends Resource {
|
|
|
68
69
|
kind: "server_key" | "safe";
|
|
69
70
|
purpose: "operator" | "service_account";
|
|
70
71
|
safe_purpose: ("fund_vault" | "token_control" | "multi_purpose") | null;
|
|
72
|
+
managed_safe_state: ("deploying" | "active" | "decommissioned") | null;
|
|
71
73
|
address: string;
|
|
72
74
|
label: string | null;
|
|
73
75
|
managed_safe_id: import("../generated/types.js").components["schemas"]["ManagedSafeId"] | null;
|
|
@@ -82,6 +84,7 @@ export declare class TokenizationResource extends Resource {
|
|
|
82
84
|
kind: "server_key" | "safe";
|
|
83
85
|
purpose: "operator" | "service_account";
|
|
84
86
|
safe_purpose: ("fund_vault" | "token_control" | "multi_purpose") | null;
|
|
87
|
+
managed_safe_state: ("deploying" | "active" | "decommissioned") | null;
|
|
85
88
|
address: string;
|
|
86
89
|
label: string | null;
|
|
87
90
|
managed_safe_id: import("../generated/types.js").components["schemas"]["ManagedSafeId"] | null;
|
|
@@ -100,6 +103,7 @@ export declare class TokenizationResource extends Resource {
|
|
|
100
103
|
kind: "server_key" | "safe";
|
|
101
104
|
purpose: "operator" | "service_account";
|
|
102
105
|
safe_purpose: ("fund_vault" | "token_control" | "multi_purpose") | null;
|
|
106
|
+
managed_safe_state: ("deploying" | "active" | "decommissioned") | null;
|
|
103
107
|
address: string;
|
|
104
108
|
label: string | null;
|
|
105
109
|
managed_safe_id: import("../generated/types.js").components["schemas"]["ManagedSafeId"] | null;
|
package/llms.txt
CHANGED
|
@@ -5,12 +5,12 @@ Use this package on a Node.js 22+ server. Read the installed declarations before
|
|
|
5
5
|
## Read first
|
|
6
6
|
|
|
7
7
|
- [Package guide](README.md): installation, production signing, Hosted Auth, member sessions, durable stores, cancellation, errors, webhooks, and proof verification.
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
8
|
+
- `dist/client.d.ts`: exact resource properties and client options for this installed release.
|
|
9
|
+
- `dist/generated/types.d.ts`: exact request bodies, responses, parameters, and operation IDs. Import types through @xkova/sdk/types.
|
|
10
|
+
- `dist/member-bff.d.ts`: authorization, session persistence, refresh, logout, action reviews, and human authorization.
|
|
11
|
+
- `dist/member-resources.d.ts`: typed resources bound to the exact authenticated member.
|
|
12
12
|
- [Quickstart](https://docs.xkova.com/getting-started.html): sandbox access and first authenticated call.
|
|
13
|
-
- [Customer OpenAPI](https://
|
|
13
|
+
- [Customer OpenAPI](https://github.com/XKOVA/typescript-sdk/blob/main/schema/customer-api.json): machine-readable contract for the public SDK source. For an installed release, use its generated declarations.
|
|
14
14
|
- [SDK guide](https://docs.xkova.com/sdk-overview.html): client and resource examples.
|
|
15
15
|
- [Workflow guide](https://docs.xkova.com/sdk-workflows.html): supported workflow helpers.
|
|
16
16
|
- [Member integration](https://docs.xkova.com/embedded-member.html): browser, BFF, identity, and signing boundaries.
|