@sereel/sdk 0.1.0 → 0.1.2
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 +10 -10
- package/dist/index.cjs +59 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +65 -20
- package/dist/index.d.ts +65 -20
- package/dist/index.js +58 -11
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Sereel TypeScript SDK
|
|
2
2
|
|
|
3
|
-
TypeScript SDK for the
|
|
3
|
+
TypeScript SDK for the Sereel SDK-facing REST asset endpoints.
|
|
4
4
|
|
|
5
5
|
## Install
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
npm install @
|
|
8
|
+
npm install @sereel/sdk
|
|
9
9
|
```
|
|
10
10
|
|
|
11
11
|
## Quickstart
|
|
12
12
|
|
|
13
13
|
```ts
|
|
14
|
-
import { createClient } from "@
|
|
14
|
+
import { createClient } from "@sereel/sdk";
|
|
15
15
|
|
|
16
16
|
const client = createClient({
|
|
17
17
|
environment: "mainnet",
|
|
18
|
-
apiKey: process.env.
|
|
18
|
+
apiKey: process.env.SEREEL_SDK_API_KEY!,
|
|
19
19
|
});
|
|
20
20
|
|
|
21
21
|
const assets = await client.getAssets();
|
|
@@ -29,11 +29,11 @@ The SDK sends your API key in the `x-api-key` header.
|
|
|
29
29
|
Only MATATA-issued API keys are supported right now.
|
|
30
30
|
|
|
31
31
|
```ts
|
|
32
|
-
import { createClient } from "@
|
|
32
|
+
import { createClient } from "@sereel/sdk";
|
|
33
33
|
|
|
34
34
|
const client = createClient({
|
|
35
35
|
environment: "testnet",
|
|
36
|
-
apiKey: process.env.
|
|
36
|
+
apiKey: process.env.SEREEL_SDK_API_KEY!,
|
|
37
37
|
});
|
|
38
38
|
|
|
39
39
|
const assets = await client.getAssets();
|
|
@@ -52,11 +52,11 @@ The SDK resolves the API base URL from the configured environment so callers do
|
|
|
52
52
|
### `createClient`
|
|
53
53
|
|
|
54
54
|
```ts
|
|
55
|
-
import { createClient } from "@
|
|
55
|
+
import { createClient } from "@sereel/sdk";
|
|
56
56
|
|
|
57
57
|
const client = createClient({
|
|
58
58
|
environment: "testnet",
|
|
59
|
-
apiKey: process.env.
|
|
59
|
+
apiKey: process.env.SEREEL_SDK_API_KEY!,
|
|
60
60
|
timeoutMs: 10_000,
|
|
61
61
|
});
|
|
62
62
|
```
|
|
@@ -68,7 +68,7 @@ Advanced option:
|
|
|
68
68
|
```ts
|
|
69
69
|
const client = createClient({
|
|
70
70
|
environment: "devnet",
|
|
71
|
-
apiKey: process.env.
|
|
71
|
+
apiKey: process.env.SEREEL_SDK_API_KEY!,
|
|
72
72
|
baseUrl: "http://localhost:8080",
|
|
73
73
|
});
|
|
74
74
|
```
|
package/dist/index.cjs
CHANGED
|
@@ -25,7 +25,7 @@ __export(index_exports, {
|
|
|
25
25
|
InvalidConfigurationError: () => InvalidConfigurationError,
|
|
26
26
|
MalformedResponseError: () => MalformedResponseError,
|
|
27
27
|
NotFoundError: () => NotFoundError,
|
|
28
|
-
|
|
28
|
+
SereelSdkError: () => SereelSdkError,
|
|
29
29
|
ServerError: () => ServerError,
|
|
30
30
|
TimeoutError: () => TimeoutError,
|
|
31
31
|
UnauthorizedError: () => UnauthorizedError,
|
|
@@ -35,7 +35,7 @@ __export(index_exports, {
|
|
|
35
35
|
module.exports = __toCommonJS(index_exports);
|
|
36
36
|
|
|
37
37
|
// src/errors.ts
|
|
38
|
-
var
|
|
38
|
+
var SereelSdkError = class extends Error {
|
|
39
39
|
status;
|
|
40
40
|
code;
|
|
41
41
|
details;
|
|
@@ -47,9 +47,9 @@ var SereeSdkError = class extends Error {
|
|
|
47
47
|
this.details = options.details;
|
|
48
48
|
}
|
|
49
49
|
};
|
|
50
|
-
var InvalidConfigurationError = class extends
|
|
50
|
+
var InvalidConfigurationError = class extends SereelSdkError {
|
|
51
51
|
};
|
|
52
|
-
var HttpError = class extends
|
|
52
|
+
var HttpError = class extends SereelSdkError {
|
|
53
53
|
};
|
|
54
54
|
var UnauthorizedError = class extends HttpError {
|
|
55
55
|
};
|
|
@@ -57,9 +57,9 @@ var NotFoundError = class extends HttpError {
|
|
|
57
57
|
};
|
|
58
58
|
var ServerError = class extends HttpError {
|
|
59
59
|
};
|
|
60
|
-
var TimeoutError = class extends
|
|
60
|
+
var TimeoutError = class extends SereelSdkError {
|
|
61
61
|
};
|
|
62
|
-
var MalformedResponseError = class extends
|
|
62
|
+
var MalformedResponseError = class extends SereelSdkError {
|
|
63
63
|
};
|
|
64
64
|
|
|
65
65
|
// src/config.ts
|
|
@@ -212,17 +212,53 @@ function isNullableString(value) {
|
|
|
212
212
|
function isFiniteNumber(value) {
|
|
213
213
|
return typeof value === "number" && Number.isFinite(value);
|
|
214
214
|
}
|
|
215
|
-
function
|
|
216
|
-
return
|
|
215
|
+
function isBoolean(value) {
|
|
216
|
+
return typeof value === "boolean";
|
|
217
217
|
}
|
|
218
|
-
function
|
|
219
|
-
return isRecord(value) && isString(value.
|
|
218
|
+
function isProspectus(value) {
|
|
219
|
+
return isRecord(value) && isString(value.name) && isString(value.url);
|
|
220
|
+
}
|
|
221
|
+
function isTokenPartner(value) {
|
|
222
|
+
return isRecord(value) && isString(value.partner_name) && isString(value.partner_logo) && isString(value.partner_role);
|
|
223
|
+
}
|
|
224
|
+
function isRuleSummary(value) {
|
|
225
|
+
return isRecord(value) && isString(value.rule_address) && isString(value.rule_type);
|
|
226
|
+
}
|
|
227
|
+
function isRuleEngineSummary(value) {
|
|
228
|
+
return isRecord(value) && isString(value.name) && isString(value.rule_engine_address) && Array.isArray(value.rules) && value.rules.every(isRuleSummary);
|
|
229
|
+
}
|
|
230
|
+
function isSecurityDetails(value) {
|
|
231
|
+
if (!isRecord(value)) return false;
|
|
232
|
+
const hasRequiredStrings = isString(value.token_address) && isString(value.token_name) && isString(value.token_symbol) && isString(value.token_decimal) && isString(value.network_id) && isString(value.token_type) && isString(value.admin);
|
|
233
|
+
if (!hasRequiredStrings) return false;
|
|
234
|
+
if (!isNullableString(value.icon_url)) return false;
|
|
235
|
+
if (!isNullableString(value.created_at)) return false;
|
|
236
|
+
if (value.prospectus !== null && value.prospectus !== void 0) {
|
|
237
|
+
if (!isProspectus(value.prospectus)) return false;
|
|
238
|
+
}
|
|
239
|
+
if (value.partners !== null && value.partners !== void 0) {
|
|
240
|
+
if (!Array.isArray(value.partners) || !value.partners.every(isTokenPartner))
|
|
241
|
+
return false;
|
|
242
|
+
}
|
|
243
|
+
if (value.rule_engine !== null && value.rule_engine !== void 0) {
|
|
244
|
+
if (!isRuleEngineSummary(value.rule_engine)) return false;
|
|
245
|
+
}
|
|
246
|
+
return true;
|
|
247
|
+
}
|
|
248
|
+
function isIssuerSummary(value) {
|
|
249
|
+
return isRecord(value) && isString(value.id) && isString(value.legal_name) && isNullableString(value.display_name) && isString(value.jurisdiction) && isNullableString(value.website) && isNullableString(value.logo_url);
|
|
250
|
+
}
|
|
251
|
+
function isNativeCurrency(value) {
|
|
252
|
+
return isRecord(value) && isString(value.symbol) && isString(value.name) && isFiniteNumber(value.decimals);
|
|
253
|
+
}
|
|
254
|
+
function isNetworkDetails(value) {
|
|
255
|
+
return isRecord(value) && isString(value.network_id) && isString(value.name) && isString(value.family) && (isFiniteNumber(value.chain_id) || value.chain_id === null) && isNativeCurrency(value.native_currency) && isString(value.rpc_endpoint) && Array.isArray(value.explorer_urls) && value.explorer_urls.every(isString) && isBoolean(value.can_deploy_token) && isBoolean(value.is_testnet) && isBoolean(value.is_supported);
|
|
220
256
|
}
|
|
221
257
|
function isBookSummary(value) {
|
|
222
258
|
return isRecord(value) && isString(value.id) && isString(value.order_book_address) && isString(value.status) && isString(value.network_id) && isFiniteNumber(value.subscription_start) && isFiniteNumber(value.subscription_end) && isString(value.prospectus_file_url);
|
|
223
259
|
}
|
|
224
260
|
function isAssetRecord(value) {
|
|
225
|
-
return isRecord(value) &&
|
|
261
|
+
return isRecord(value) && isSecurityDetails(value.security) && isIssuerSummary(value.issuer) && Array.isArray(value.books) && value.books.every(isBookSummary) && isNetworkDetails(value.network);
|
|
226
262
|
}
|
|
227
263
|
function validateSdkAssetsResponse(value) {
|
|
228
264
|
if (!isRecord(value) || !Array.isArray(value.data) || !isFiniteNumber(value.count) || !value.data.every(isAssetRecord)) {
|
|
@@ -262,6 +298,17 @@ function createClient(config) {
|
|
|
262
298
|
`/sdk/assets/${encodeURIComponent(trimmedTokenAddress)}`,
|
|
263
299
|
validateSdkAssetResponse
|
|
264
300
|
);
|
|
301
|
+
},
|
|
302
|
+
getAssetsByIssuer(issuerId) {
|
|
303
|
+
const trimmedIssuerId = issuerId.trim();
|
|
304
|
+
if (!trimmedIssuerId) {
|
|
305
|
+
throw new InvalidConfigurationError("issuerId must not be empty.");
|
|
306
|
+
}
|
|
307
|
+
return requestJson(
|
|
308
|
+
resolved,
|
|
309
|
+
`/sdk/assets/issuer/${encodeURIComponent(trimmedIssuerId)}`,
|
|
310
|
+
validateSdkAssetsResponse
|
|
311
|
+
);
|
|
265
312
|
}
|
|
266
313
|
};
|
|
267
314
|
}
|
|
@@ -272,7 +319,7 @@ function createClient(config) {
|
|
|
272
319
|
InvalidConfigurationError,
|
|
273
320
|
MalformedResponseError,
|
|
274
321
|
NotFoundError,
|
|
275
|
-
|
|
322
|
+
SereelSdkError,
|
|
276
323
|
ServerError,
|
|
277
324
|
TimeoutError,
|
|
278
325
|
UnauthorizedError,
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/config.ts","../src/transport.ts","../src/validation.ts","../src/client.ts"],"sourcesContent":["export { createClient } from \"./client\";\nexport { ENVIRONMENT_BASE_URLS, resolveBaseUrl } from \"./config\";\nexport {\n HttpError,\n InvalidConfigurationError,\n MalformedResponseError,\n NotFoundError,\n ServerError,\n SereeSdkError,\n TimeoutError,\n UnauthorizedError,\n} from \"./errors\";\nexport type {\n ClientConfig,\n SdkAssetRecord,\n SdkAssetResponse,\n SdkAssetsResponse,\n SdkBookSummary,\n SdkSecuritySummary,\n SdkSellerOrganizationSummary,\n SereeEnvironment,\n SereeSdkClient,\n} from \"./types\";\n","export interface SereeSdkErrorOptions {\n status?: number;\n code?: string;\n cause?: unknown;\n details?: unknown;\n}\n\nexport class SereeSdkError extends Error {\n readonly status: number | undefined;\n readonly code: string | undefined;\n readonly details?: unknown;\n\n constructor(message: string, options: SereeSdkErrorOptions = {}) {\n super(message, options.cause ? { cause: options.cause } : undefined);\n this.name = new.target.name;\n this.status = options.status;\n this.code = options.code;\n this.details = options.details;\n }\n}\n\nexport class InvalidConfigurationError extends SereeSdkError {}\n\nexport class HttpError extends SereeSdkError {}\n\nexport class UnauthorizedError extends HttpError {}\n\nexport class NotFoundError extends HttpError {}\n\nexport class ServerError extends HttpError {}\n\nexport class TimeoutError extends SereeSdkError {}\n\nexport class MalformedResponseError extends SereeSdkError {}\n","import { InvalidConfigurationError } from \"./errors\";\nimport type { ClientConfig, SereeEnvironment } from \"./types\";\n\nexport const ENVIRONMENT_BASE_URLS: Record<SereeEnvironment, string> = {\n devnet: \"https://api-lazer.sereel.com\",\n testnet: \"https://api-lazer-v2.sereel.com\",\n mainnet: \"https://cahokia.sereel.com\",\n};\n\nexport interface ResolvedClientConfig {\n environment: SereeEnvironment;\n apiKey: string;\n timeoutMs: number;\n baseUrl: string;\n fetch: typeof fetch;\n}\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\nfunction getFetchImplementation(\n providedFetch: ClientConfig[\"fetch\"],\n): typeof fetch {\n if (providedFetch) {\n return providedFetch;\n }\n\n if (typeof globalThis.fetch === \"function\") {\n return globalThis.fetch.bind(globalThis);\n }\n\n throw new InvalidConfigurationError(\n \"No fetch implementation is available. Provide config.fetch in this runtime.\",\n );\n}\n\nfunction normalizeBaseUrl(baseUrl: string): string {\n const trimmed = baseUrl.trim();\n\n if (!trimmed) {\n throw new InvalidConfigurationError(\"baseUrl must not be empty when provided.\");\n }\n\n try {\n return new URL(trimmed).toString().replace(/\\/+$/, \"\");\n } catch (cause) {\n throw new InvalidConfigurationError(\"baseUrl must be a valid absolute URL.\", {\n cause,\n });\n }\n}\n\nexport function resolveBaseUrl(\n environment: SereeEnvironment,\n baseUrl?: string,\n): string {\n if (baseUrl) {\n return normalizeBaseUrl(baseUrl);\n }\n\n return ENVIRONMENT_BASE_URLS[environment];\n}\n\nexport function resolveClientConfig(config: ClientConfig): ResolvedClientConfig {\n const apiKey = config.apiKey.trim();\n\n if (!apiKey) {\n throw new InvalidConfigurationError(\"apiKey must not be empty.\");\n }\n\n const timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n throw new InvalidConfigurationError(\"timeoutMs must be a positive number.\");\n }\n\n return {\n environment: config.environment,\n apiKey,\n timeoutMs,\n baseUrl: resolveBaseUrl(config.environment, config.baseUrl),\n fetch: getFetchImplementation(config.fetch),\n };\n}\n","import {\n HttpError,\n MalformedResponseError,\n NotFoundError,\n ServerError,\n TimeoutError,\n UnauthorizedError,\n} from \"./errors\";\nimport type { ResolvedClientConfig } from \"./config\";\n\ninterface ApiErrorBody {\n error?: string;\n message?: string;\n}\n\nfunction createTimeoutSignal(timeoutMs: number): {\n signal: AbortSignal;\n cleanup: () => void;\n} {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n\n return {\n signal: controller.signal,\n cleanup: () => clearTimeout(timeout),\n };\n}\n\nasync function parseBody(response: Response): Promise<unknown> {\n const text = await response.text();\n if (!text) {\n return null;\n }\n\n try {\n return JSON.parse(text) as unknown;\n } catch (cause) {\n throw new MalformedResponseError(\"Received a non-JSON response body.\", {\n cause,\n status: response.status,\n details: text,\n });\n }\n}\n\nfunction getErrorMessage(status: number, body: unknown): string {\n if (body && typeof body === \"object\") {\n const apiError = body as ApiErrorBody;\n if (typeof apiError.error === \"string\" && apiError.error.trim()) {\n return apiError.error;\n }\n if (typeof apiError.message === \"string\" && apiError.message.trim()) {\n return apiError.message;\n }\n }\n\n return `Request failed with status ${status}.`;\n}\n\nfunction toHttpError(status: number, body: unknown): HttpError {\n const message = getErrorMessage(status, body);\n const options = { status, details: body };\n\n if (status === 401) {\n return new UnauthorizedError(message, options);\n }\n if (status === 404) {\n return new NotFoundError(message, options);\n }\n if (status >= 500) {\n return new ServerError(message, options);\n }\n\n return new HttpError(message, options);\n}\n\nexport async function requestJson<T>(\n config: ResolvedClientConfig,\n path: string,\n validate: (value: unknown) => T,\n): Promise<T> {\n const { signal, cleanup } = createTimeoutSignal(config.timeoutMs);\n\n try {\n const response = await config.fetch(`${config.baseUrl}${path}`, {\n method: \"GET\",\n signal,\n headers: {\n accept: \"application/json\",\n \"x-api-key\": config.apiKey,\n },\n });\n\n const body = await parseBody(response);\n if (!response.ok) {\n throw toHttpError(response.status, body);\n }\n\n return validate(body);\n } catch (error) {\n if (error instanceof HttpError || error instanceof MalformedResponseError) {\n throw error;\n }\n\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new TimeoutError(\n `Request timed out after ${config.timeoutMs}ms.`,\n { cause: error },\n );\n }\n\n throw error;\n } finally {\n cleanup();\n }\n}\n","import { MalformedResponseError } from \"./errors\";\nimport type {\n SdkAssetRecord,\n SdkAssetResponse,\n SdkAssetsResponse,\n SdkBookSummary,\n SdkSecuritySummary,\n SdkSellerOrganizationSummary,\n} from \"./types\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isString(value: unknown): value is string {\n return typeof value === \"string\";\n}\n\nfunction isNullableString(value: unknown): value is string | null {\n return typeof value === \"string\" || value === null;\n}\n\nfunction isFiniteNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction isSecuritySummary(value: unknown): value is SdkSecuritySummary {\n return (\n isRecord(value) &&\n isString(value.id) &&\n isString(value.token_address) &&\n isString(value.token_name) &&\n isString(value.token_symbol) &&\n isString(value.network_id) &&\n isString(value.token_type)\n );\n}\n\nfunction isSellerOrganizationSummary(\n value: unknown,\n): value is SdkSellerOrganizationSummary {\n return (\n isRecord(value) &&\n isString(value.id) &&\n isString(value.legal_name) &&\n isNullableString(value.display_name) &&\n isString(value.jurisdiction) &&\n isNullableString(value.website)\n );\n}\n\nfunction isBookSummary(value: unknown): value is SdkBookSummary {\n return (\n isRecord(value) &&\n isString(value.id) &&\n isString(value.order_book_address) &&\n isString(value.status) &&\n isString(value.network_id) &&\n isFiniteNumber(value.subscription_start) &&\n isFiniteNumber(value.subscription_end) &&\n isString(value.prospectus_file_url)\n );\n}\n\nfunction isAssetRecord(value: unknown): value is SdkAssetRecord {\n return (\n isRecord(value) &&\n isSecuritySummary(value.security) &&\n isSellerOrganizationSummary(value.seller_organization) &&\n Array.isArray(value.books) &&\n value.books.every(isBookSummary)\n );\n}\n\nexport function validateSdkAssetsResponse(value: unknown): SdkAssetsResponse {\n if (\n !isRecord(value) ||\n !Array.isArray(value.data) ||\n !isFiniteNumber(value.count) ||\n !value.data.every(isAssetRecord)\n ) {\n throw new MalformedResponseError(\n \"Received an invalid SDK assets response shape.\",\n { details: value },\n );\n }\n\n return value as unknown as SdkAssetsResponse;\n}\n\nexport function validateSdkAssetResponse(value: unknown): SdkAssetResponse {\n if (!isRecord(value) || !isAssetRecord(value.data)) {\n throw new MalformedResponseError(\n \"Received an invalid SDK asset response shape.\",\n { details: value },\n );\n }\n\n return value as unknown as SdkAssetResponse;\n}\n","import { resolveClientConfig } from \"./config\";\nimport { InvalidConfigurationError } from \"./errors\";\nimport { requestJson } from \"./transport\";\nimport type {\n ClientConfig,\n SdkAssetResponse,\n SdkAssetsResponse,\n SereeSdkClient,\n} from \"./types\";\nimport {\n validateSdkAssetResponse,\n validateSdkAssetsResponse,\n} from \"./validation\";\n\nexport function createClient(config: ClientConfig): SereeSdkClient {\n const resolved = resolveClientConfig(config);\n\n return {\n getAssets(): Promise<SdkAssetsResponse> {\n return requestJson(resolved, \"/sdk/assets\", validateSdkAssetsResponse);\n },\n\n getAssetByTokenAddress(tokenAddress: string): Promise<SdkAssetResponse> {\n const trimmedTokenAddress = tokenAddress.trim();\n if (!trimmedTokenAddress) {\n throw new InvalidConfigurationError(\n \"tokenAddress must not be empty.\",\n );\n }\n\n return requestJson(\n resolved,\n `/sdk/assets/${encodeURIComponent(trimmedTokenAddress)}`,\n validateSdkAssetResponse,\n );\n },\n };\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/config.ts","../src/transport.ts","../src/validation.ts","../src/client.ts"],"sourcesContent":["export { createClient } from \"./client\";\nexport { ENVIRONMENT_BASE_URLS, resolveBaseUrl } from \"./config\";\nexport {\n HttpError,\n InvalidConfigurationError,\n MalformedResponseError,\n NotFoundError,\n ServerError,\n SereelSdkError,\n TimeoutError,\n UnauthorizedError,\n} from \"./errors\";\nexport type {\n ClientConfig,\n NativeCurrency,\n NetworkDetails,\n SdkAssetRecord,\n SdkAssetResponse,\n SdkAssetsResponse,\n SdkBookSummary,\n SdkIssuerSummary,\n SdkRuleEngineSummary,\n SdkRuleSummary,\n SdkSecurityDetails,\n SdkTokenPartner,\n SdkTokenProspectus,\n SereelEnvironment,\n SereelSdkClient,\n} from \"./types\";\n","export interface SereelSdkErrorOptions {\n status?: number;\n code?: string;\n cause?: unknown;\n details?: unknown;\n}\n\nexport class SereelSdkError extends Error {\n readonly status: number | undefined;\n readonly code: string | undefined;\n readonly details?: unknown;\n\n constructor(message: string, options: SereelSdkErrorOptions = {}) {\n super(message, options.cause ? { cause: options.cause } : undefined);\n this.name = new.target.name;\n this.status = options.status;\n this.code = options.code;\n this.details = options.details;\n }\n}\n\nexport class InvalidConfigurationError extends SereelSdkError {}\n\nexport class HttpError extends SereelSdkError {}\n\nexport class UnauthorizedError extends HttpError {}\n\nexport class NotFoundError extends HttpError {}\n\nexport class ServerError extends HttpError {}\n\nexport class TimeoutError extends SereelSdkError {}\n\nexport class MalformedResponseError extends SereelSdkError {}\n","import { InvalidConfigurationError } from \"./errors\";\nimport type { ClientConfig, SereelEnvironment } from \"./types\";\n\nexport const ENVIRONMENT_BASE_URLS: Record<SereelEnvironment, string> = {\n devnet: \"https://api-lazer.sereel.com\",\n testnet: \"https://api-lazer-v2.sereel.com\",\n mainnet: \"https://cahokia.sereel.com\",\n};\n\nexport interface ResolvedClientConfig {\n environment: SereelEnvironment;\n apiKey: string;\n timeoutMs: number;\n baseUrl: string;\n fetch: typeof fetch;\n}\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\nfunction getFetchImplementation(\n providedFetch: ClientConfig[\"fetch\"],\n): typeof fetch {\n if (providedFetch) {\n return providedFetch;\n }\n\n if (typeof globalThis.fetch === \"function\") {\n return globalThis.fetch.bind(globalThis);\n }\n\n throw new InvalidConfigurationError(\n \"No fetch implementation is available. Provide config.fetch in this runtime.\",\n );\n}\n\nfunction normalizeBaseUrl(baseUrl: string): string {\n const trimmed = baseUrl.trim();\n\n if (!trimmed) {\n throw new InvalidConfigurationError(\"baseUrl must not be empty when provided.\");\n }\n\n try {\n return new URL(trimmed).toString().replace(/\\/+$/, \"\");\n } catch (cause) {\n throw new InvalidConfigurationError(\"baseUrl must be a valid absolute URL.\", {\n cause,\n });\n }\n}\n\nexport function resolveBaseUrl(\n environment: SereelEnvironment,\n baseUrl?: string,\n): string {\n if (baseUrl) {\n return normalizeBaseUrl(baseUrl);\n }\n\n return ENVIRONMENT_BASE_URLS[environment];\n}\n\nexport function resolveClientConfig(config: ClientConfig): ResolvedClientConfig {\n const apiKey = config.apiKey.trim();\n\n if (!apiKey) {\n throw new InvalidConfigurationError(\"apiKey must not be empty.\");\n }\n\n const timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n throw new InvalidConfigurationError(\"timeoutMs must be a positive number.\");\n }\n\n return {\n environment: config.environment,\n apiKey,\n timeoutMs,\n baseUrl: resolveBaseUrl(config.environment, config.baseUrl),\n fetch: getFetchImplementation(config.fetch),\n };\n}\n","import {\n HttpError,\n MalformedResponseError,\n NotFoundError,\n ServerError,\n TimeoutError,\n UnauthorizedError,\n} from \"./errors\";\nimport type { ResolvedClientConfig } from \"./config\";\n\ninterface ApiErrorBody {\n error?: string;\n message?: string;\n}\n\nfunction createTimeoutSignal(timeoutMs: number): {\n signal: AbortSignal;\n cleanup: () => void;\n} {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n\n return {\n signal: controller.signal,\n cleanup: () => clearTimeout(timeout),\n };\n}\n\nasync function parseBody(response: Response): Promise<unknown> {\n const text = await response.text();\n if (!text) {\n return null;\n }\n\n try {\n return JSON.parse(text) as unknown;\n } catch (cause) {\n throw new MalformedResponseError(\"Received a non-JSON response body.\", {\n cause,\n status: response.status,\n details: text,\n });\n }\n}\n\nfunction getErrorMessage(status: number, body: unknown): string {\n if (body && typeof body === \"object\") {\n const apiError = body as ApiErrorBody;\n if (typeof apiError.error === \"string\" && apiError.error.trim()) {\n return apiError.error;\n }\n if (typeof apiError.message === \"string\" && apiError.message.trim()) {\n return apiError.message;\n }\n }\n\n return `Request failed with status ${status}.`;\n}\n\nfunction toHttpError(status: number, body: unknown): HttpError {\n const message = getErrorMessage(status, body);\n const options = { status, details: body };\n\n if (status === 401) {\n return new UnauthorizedError(message, options);\n }\n if (status === 404) {\n return new NotFoundError(message, options);\n }\n if (status >= 500) {\n return new ServerError(message, options);\n }\n\n return new HttpError(message, options);\n}\n\nexport async function requestJson<T>(\n config: ResolvedClientConfig,\n path: string,\n validate: (value: unknown) => T,\n): Promise<T> {\n const { signal, cleanup } = createTimeoutSignal(config.timeoutMs);\n\n try {\n const response = await config.fetch(`${config.baseUrl}${path}`, {\n method: \"GET\",\n signal,\n headers: {\n accept: \"application/json\",\n \"x-api-key\": config.apiKey,\n },\n });\n\n const body = await parseBody(response);\n if (!response.ok) {\n throw toHttpError(response.status, body);\n }\n\n return validate(body);\n } catch (error) {\n if (error instanceof HttpError || error instanceof MalformedResponseError) {\n throw error;\n }\n\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new TimeoutError(\n `Request timed out after ${config.timeoutMs}ms.`,\n { cause: error },\n );\n }\n\n throw error;\n } finally {\n cleanup();\n }\n}\n","import { MalformedResponseError } from \"./errors\";\nimport type {\n NativeCurrency,\n NetworkDetails,\n SdkAssetRecord,\n SdkAssetResponse,\n SdkAssetsResponse,\n SdkBookSummary,\n SdkIssuerSummary,\n SdkRuleEngineSummary,\n SdkRuleSummary,\n SdkSecurityDetails,\n SdkTokenPartner,\n SdkTokenProspectus,\n} from \"./types\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isString(value: unknown): value is string {\n return typeof value === \"string\";\n}\n\nfunction isNullableString(value: unknown): value is string | null {\n return typeof value === \"string\" || value === null;\n}\n\nfunction isFiniteNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction isBoolean(value: unknown): value is boolean {\n return typeof value === \"boolean\";\n}\n\nfunction isProspectus(value: unknown): value is SdkTokenProspectus {\n return isRecord(value) && isString(value.name) && isString(value.url);\n}\n\nfunction isTokenPartner(value: unknown): value is SdkTokenPartner {\n return (\n isRecord(value) &&\n isString(value.partner_name) &&\n isString(value.partner_logo) &&\n isString(value.partner_role)\n );\n}\n\nfunction isRuleSummary(value: unknown): value is SdkRuleSummary {\n return (\n isRecord(value) &&\n isString(value.rule_address) &&\n isString(value.rule_type)\n );\n}\n\nfunction isRuleEngineSummary(value: unknown): value is SdkRuleEngineSummary {\n return (\n isRecord(value) &&\n isString(value.name) &&\n isString(value.rule_engine_address) &&\n Array.isArray(value.rules) &&\n (value.rules as unknown[]).every(isRuleSummary)\n );\n}\n\nfunction isSecurityDetails(value: unknown): value is SdkSecurityDetails {\n if (!isRecord(value)) return false;\n\n const hasRequiredStrings =\n isString(value.token_address) &&\n isString(value.token_name) &&\n isString(value.token_symbol) &&\n isString(value.token_decimal) &&\n isString(value.network_id) &&\n isString(value.token_type) &&\n isString(value.admin);\n\n if (!hasRequiredStrings) return false;\n\n if (!isNullableString(value.icon_url)) return false;\n if (!isNullableString(value.created_at)) return false;\n\n if (value.prospectus !== null && value.prospectus !== undefined) {\n if (!isProspectus(value.prospectus)) return false;\n }\n\n if (value.partners !== null && value.partners !== undefined) {\n if (\n !Array.isArray(value.partners) ||\n !(value.partners as unknown[]).every(isTokenPartner)\n )\n return false;\n }\n\n if (value.rule_engine !== null && value.rule_engine !== undefined) {\n if (!isRuleEngineSummary(value.rule_engine)) return false;\n }\n\n return true;\n}\n\nfunction isIssuerSummary(value: unknown): value is SdkIssuerSummary {\n return (\n isRecord(value) &&\n isString(value.id) &&\n isString(value.legal_name) &&\n isNullableString(value.display_name) &&\n isString(value.jurisdiction) &&\n isNullableString(value.website) &&\n isNullableString(value.logo_url)\n );\n}\n\nfunction isNativeCurrency(value: unknown): value is NativeCurrency {\n return (\n isRecord(value) &&\n isString(value.symbol) &&\n isString(value.name) &&\n isFiniteNumber(value.decimals)\n );\n}\n\nfunction isNetworkDetails(value: unknown): value is NetworkDetails {\n return (\n isRecord(value) &&\n isString(value.network_id) &&\n isString(value.name) &&\n isString(value.family) &&\n (isFiniteNumber(value.chain_id) || value.chain_id === null) &&\n isNativeCurrency(value.native_currency) &&\n isString(value.rpc_endpoint) &&\n Array.isArray(value.explorer_urls) &&\n (value.explorer_urls as unknown[]).every(isString) &&\n isBoolean(value.can_deploy_token) &&\n isBoolean(value.is_testnet) &&\n isBoolean(value.is_supported)\n );\n}\n\nfunction isBookSummary(value: unknown): value is SdkBookSummary {\n return (\n isRecord(value) &&\n isString(value.id) &&\n isString(value.order_book_address) &&\n isString(value.status) &&\n isString(value.network_id) &&\n isFiniteNumber(value.subscription_start) &&\n isFiniteNumber(value.subscription_end) &&\n isString(value.prospectus_file_url)\n );\n}\n\nfunction isAssetRecord(value: unknown): value is SdkAssetRecord {\n return (\n isRecord(value) &&\n isSecurityDetails(value.security) &&\n isIssuerSummary(value.issuer) &&\n Array.isArray(value.books) &&\n value.books.every(isBookSummary) &&\n isNetworkDetails(value.network)\n );\n}\n\nexport function validateSdkAssetsResponse(value: unknown): SdkAssetsResponse {\n if (\n !isRecord(value) ||\n !Array.isArray(value.data) ||\n !isFiniteNumber(value.count) ||\n !value.data.every(isAssetRecord)\n ) {\n throw new MalformedResponseError(\n \"Received an invalid SDK assets response shape.\",\n { details: value },\n );\n }\n\n return value as unknown as SdkAssetsResponse;\n}\n\nexport function validateSdkAssetResponse(value: unknown): SdkAssetResponse {\n if (!isRecord(value) || !isAssetRecord(value.data)) {\n throw new MalformedResponseError(\n \"Received an invalid SDK asset response shape.\",\n { details: value },\n );\n }\n\n return value as unknown as SdkAssetResponse;\n}\n","import { resolveClientConfig } from \"./config\";\nimport { InvalidConfigurationError } from \"./errors\";\nimport { requestJson } from \"./transport\";\nimport type {\n ClientConfig,\n SdkAssetResponse,\n SdkAssetsResponse,\n SereelSdkClient,\n} from \"./types\";\nimport {\n validateSdkAssetResponse,\n validateSdkAssetsResponse,\n} from \"./validation\";\n\nexport function createClient(config: ClientConfig): SereelSdkClient {\n const resolved = resolveClientConfig(config);\n\n return {\n getAssets(): Promise<SdkAssetsResponse> {\n return requestJson(resolved, \"/sdk/assets\", validateSdkAssetsResponse);\n },\n\n getAssetByTokenAddress(tokenAddress: string): Promise<SdkAssetResponse> {\n const trimmedTokenAddress = tokenAddress.trim();\n if (!trimmedTokenAddress) {\n throw new InvalidConfigurationError(\n \"tokenAddress must not be empty.\",\n );\n }\n\n return requestJson(\n resolved,\n `/sdk/assets/${encodeURIComponent(trimmedTokenAddress)}`,\n validateSdkAssetResponse,\n );\n },\n\n getAssetsByIssuer(issuerId: string): Promise<SdkAssetsResponse> {\n const trimmedIssuerId = issuerId.trim();\n if (!trimmedIssuerId) {\n throw new InvalidConfigurationError(\"issuerId must not be empty.\");\n }\n\n return requestJson(\n resolved,\n `/sdk/assets/issuer/${encodeURIComponent(trimmedIssuerId)}`,\n validateSdkAssetsResponse,\n );\n },\n };\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,25 +1,68 @@
|
|
|
1
|
-
type
|
|
1
|
+
type SereelEnvironment = "devnet" | "testnet" | "mainnet";
|
|
2
2
|
interface ClientConfig {
|
|
3
|
-
environment:
|
|
3
|
+
environment: SereelEnvironment;
|
|
4
4
|
apiKey: string;
|
|
5
5
|
timeoutMs?: number;
|
|
6
6
|
baseUrl?: string;
|
|
7
7
|
fetch?: typeof fetch;
|
|
8
8
|
}
|
|
9
|
-
interface
|
|
10
|
-
|
|
9
|
+
interface NativeCurrency {
|
|
10
|
+
symbol: string;
|
|
11
|
+
name: string;
|
|
12
|
+
decimals: number;
|
|
13
|
+
}
|
|
14
|
+
interface NetworkDetails {
|
|
15
|
+
network_id: string;
|
|
16
|
+
name: string;
|
|
17
|
+
family: string;
|
|
18
|
+
chain_id: number | null;
|
|
19
|
+
native_currency: NativeCurrency;
|
|
20
|
+
rpc_endpoint: string;
|
|
21
|
+
explorer_urls: string[];
|
|
22
|
+
can_deploy_token: boolean;
|
|
23
|
+
is_testnet: boolean;
|
|
24
|
+
is_supported: boolean;
|
|
25
|
+
}
|
|
26
|
+
interface SdkTokenProspectus {
|
|
27
|
+
name: string;
|
|
28
|
+
url: string;
|
|
29
|
+
}
|
|
30
|
+
interface SdkTokenPartner {
|
|
31
|
+
partner_name: string;
|
|
32
|
+
partner_logo: string;
|
|
33
|
+
partner_role: string;
|
|
34
|
+
}
|
|
35
|
+
interface SdkRuleSummary {
|
|
36
|
+
rule_address: string;
|
|
37
|
+
rule_type: string;
|
|
38
|
+
}
|
|
39
|
+
interface SdkRuleEngineSummary {
|
|
40
|
+
name: string;
|
|
41
|
+
rule_engine_address: string;
|
|
42
|
+
rules: SdkRuleSummary[];
|
|
43
|
+
}
|
|
44
|
+
/** Full security token details. Sensitive/internal fields are excluded. */
|
|
45
|
+
interface SdkSecurityDetails {
|
|
11
46
|
token_address: string;
|
|
12
47
|
token_name: string;
|
|
13
48
|
token_symbol: string;
|
|
49
|
+
token_decimal: string;
|
|
14
50
|
network_id: string;
|
|
15
51
|
token_type: string;
|
|
16
|
-
|
|
17
|
-
|
|
52
|
+
admin: string;
|
|
53
|
+
icon_url: string | null;
|
|
54
|
+
prospectus: SdkTokenProspectus | null;
|
|
55
|
+
partners: SdkTokenPartner[] | null;
|
|
56
|
+
rule_engine: SdkRuleEngineSummary | null;
|
|
57
|
+
created_at: string | null;
|
|
58
|
+
}
|
|
59
|
+
interface SdkIssuerSummary {
|
|
18
60
|
id: string;
|
|
19
61
|
legal_name: string;
|
|
20
62
|
display_name: string | null;
|
|
21
63
|
jurisdiction: string;
|
|
22
64
|
website: string | null;
|
|
65
|
+
logo_url: string | null;
|
|
23
66
|
}
|
|
24
67
|
interface SdkBookSummary {
|
|
25
68
|
id: string;
|
|
@@ -31,9 +74,10 @@ interface SdkBookSummary {
|
|
|
31
74
|
prospectus_file_url: string;
|
|
32
75
|
}
|
|
33
76
|
interface SdkAssetRecord {
|
|
34
|
-
security:
|
|
35
|
-
|
|
77
|
+
security: SdkSecurityDetails;
|
|
78
|
+
issuer: SdkIssuerSummary;
|
|
36
79
|
books: SdkBookSummary[];
|
|
80
|
+
network: NetworkDetails;
|
|
37
81
|
}
|
|
38
82
|
interface SdkAssetsResponse {
|
|
39
83
|
data: SdkAssetRecord[];
|
|
@@ -42,31 +86,32 @@ interface SdkAssetsResponse {
|
|
|
42
86
|
interface SdkAssetResponse {
|
|
43
87
|
data: SdkAssetRecord;
|
|
44
88
|
}
|
|
45
|
-
interface
|
|
89
|
+
interface SereelSdkClient {
|
|
46
90
|
getAssets(): Promise<SdkAssetsResponse>;
|
|
47
91
|
getAssetByTokenAddress(tokenAddress: string): Promise<SdkAssetResponse>;
|
|
92
|
+
getAssetsByIssuer(issuerId: string): Promise<SdkAssetsResponse>;
|
|
48
93
|
}
|
|
49
94
|
|
|
50
|
-
declare function createClient(config: ClientConfig):
|
|
95
|
+
declare function createClient(config: ClientConfig): SereelSdkClient;
|
|
51
96
|
|
|
52
|
-
declare const ENVIRONMENT_BASE_URLS: Record<
|
|
53
|
-
declare function resolveBaseUrl(environment:
|
|
97
|
+
declare const ENVIRONMENT_BASE_URLS: Record<SereelEnvironment, string>;
|
|
98
|
+
declare function resolveBaseUrl(environment: SereelEnvironment, baseUrl?: string): string;
|
|
54
99
|
|
|
55
|
-
interface
|
|
100
|
+
interface SereelSdkErrorOptions {
|
|
56
101
|
status?: number;
|
|
57
102
|
code?: string;
|
|
58
103
|
cause?: unknown;
|
|
59
104
|
details?: unknown;
|
|
60
105
|
}
|
|
61
|
-
declare class
|
|
106
|
+
declare class SereelSdkError extends Error {
|
|
62
107
|
readonly status: number | undefined;
|
|
63
108
|
readonly code: string | undefined;
|
|
64
109
|
readonly details?: unknown;
|
|
65
|
-
constructor(message: string, options?:
|
|
110
|
+
constructor(message: string, options?: SereelSdkErrorOptions);
|
|
66
111
|
}
|
|
67
|
-
declare class InvalidConfigurationError extends
|
|
112
|
+
declare class InvalidConfigurationError extends SereelSdkError {
|
|
68
113
|
}
|
|
69
|
-
declare class HttpError extends
|
|
114
|
+
declare class HttpError extends SereelSdkError {
|
|
70
115
|
}
|
|
71
116
|
declare class UnauthorizedError extends HttpError {
|
|
72
117
|
}
|
|
@@ -74,9 +119,9 @@ declare class NotFoundError extends HttpError {
|
|
|
74
119
|
}
|
|
75
120
|
declare class ServerError extends HttpError {
|
|
76
121
|
}
|
|
77
|
-
declare class TimeoutError extends
|
|
122
|
+
declare class TimeoutError extends SereelSdkError {
|
|
78
123
|
}
|
|
79
|
-
declare class MalformedResponseError extends
|
|
124
|
+
declare class MalformedResponseError extends SereelSdkError {
|
|
80
125
|
}
|
|
81
126
|
|
|
82
|
-
export { type ClientConfig, ENVIRONMENT_BASE_URLS, HttpError, InvalidConfigurationError, MalformedResponseError, NotFoundError, type SdkAssetRecord, type SdkAssetResponse, type SdkAssetsResponse, type SdkBookSummary, type
|
|
127
|
+
export { type ClientConfig, ENVIRONMENT_BASE_URLS, HttpError, InvalidConfigurationError, MalformedResponseError, type NativeCurrency, type NetworkDetails, NotFoundError, type SdkAssetRecord, type SdkAssetResponse, type SdkAssetsResponse, type SdkBookSummary, type SdkIssuerSummary, type SdkRuleEngineSummary, type SdkRuleSummary, type SdkSecurityDetails, type SdkTokenPartner, type SdkTokenProspectus, type SereelEnvironment, type SereelSdkClient, SereelSdkError, ServerError, TimeoutError, UnauthorizedError, createClient, resolveBaseUrl };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,25 +1,68 @@
|
|
|
1
|
-
type
|
|
1
|
+
type SereelEnvironment = "devnet" | "testnet" | "mainnet";
|
|
2
2
|
interface ClientConfig {
|
|
3
|
-
environment:
|
|
3
|
+
environment: SereelEnvironment;
|
|
4
4
|
apiKey: string;
|
|
5
5
|
timeoutMs?: number;
|
|
6
6
|
baseUrl?: string;
|
|
7
7
|
fetch?: typeof fetch;
|
|
8
8
|
}
|
|
9
|
-
interface
|
|
10
|
-
|
|
9
|
+
interface NativeCurrency {
|
|
10
|
+
symbol: string;
|
|
11
|
+
name: string;
|
|
12
|
+
decimals: number;
|
|
13
|
+
}
|
|
14
|
+
interface NetworkDetails {
|
|
15
|
+
network_id: string;
|
|
16
|
+
name: string;
|
|
17
|
+
family: string;
|
|
18
|
+
chain_id: number | null;
|
|
19
|
+
native_currency: NativeCurrency;
|
|
20
|
+
rpc_endpoint: string;
|
|
21
|
+
explorer_urls: string[];
|
|
22
|
+
can_deploy_token: boolean;
|
|
23
|
+
is_testnet: boolean;
|
|
24
|
+
is_supported: boolean;
|
|
25
|
+
}
|
|
26
|
+
interface SdkTokenProspectus {
|
|
27
|
+
name: string;
|
|
28
|
+
url: string;
|
|
29
|
+
}
|
|
30
|
+
interface SdkTokenPartner {
|
|
31
|
+
partner_name: string;
|
|
32
|
+
partner_logo: string;
|
|
33
|
+
partner_role: string;
|
|
34
|
+
}
|
|
35
|
+
interface SdkRuleSummary {
|
|
36
|
+
rule_address: string;
|
|
37
|
+
rule_type: string;
|
|
38
|
+
}
|
|
39
|
+
interface SdkRuleEngineSummary {
|
|
40
|
+
name: string;
|
|
41
|
+
rule_engine_address: string;
|
|
42
|
+
rules: SdkRuleSummary[];
|
|
43
|
+
}
|
|
44
|
+
/** Full security token details. Sensitive/internal fields are excluded. */
|
|
45
|
+
interface SdkSecurityDetails {
|
|
11
46
|
token_address: string;
|
|
12
47
|
token_name: string;
|
|
13
48
|
token_symbol: string;
|
|
49
|
+
token_decimal: string;
|
|
14
50
|
network_id: string;
|
|
15
51
|
token_type: string;
|
|
16
|
-
|
|
17
|
-
|
|
52
|
+
admin: string;
|
|
53
|
+
icon_url: string | null;
|
|
54
|
+
prospectus: SdkTokenProspectus | null;
|
|
55
|
+
partners: SdkTokenPartner[] | null;
|
|
56
|
+
rule_engine: SdkRuleEngineSummary | null;
|
|
57
|
+
created_at: string | null;
|
|
58
|
+
}
|
|
59
|
+
interface SdkIssuerSummary {
|
|
18
60
|
id: string;
|
|
19
61
|
legal_name: string;
|
|
20
62
|
display_name: string | null;
|
|
21
63
|
jurisdiction: string;
|
|
22
64
|
website: string | null;
|
|
65
|
+
logo_url: string | null;
|
|
23
66
|
}
|
|
24
67
|
interface SdkBookSummary {
|
|
25
68
|
id: string;
|
|
@@ -31,9 +74,10 @@ interface SdkBookSummary {
|
|
|
31
74
|
prospectus_file_url: string;
|
|
32
75
|
}
|
|
33
76
|
interface SdkAssetRecord {
|
|
34
|
-
security:
|
|
35
|
-
|
|
77
|
+
security: SdkSecurityDetails;
|
|
78
|
+
issuer: SdkIssuerSummary;
|
|
36
79
|
books: SdkBookSummary[];
|
|
80
|
+
network: NetworkDetails;
|
|
37
81
|
}
|
|
38
82
|
interface SdkAssetsResponse {
|
|
39
83
|
data: SdkAssetRecord[];
|
|
@@ -42,31 +86,32 @@ interface SdkAssetsResponse {
|
|
|
42
86
|
interface SdkAssetResponse {
|
|
43
87
|
data: SdkAssetRecord;
|
|
44
88
|
}
|
|
45
|
-
interface
|
|
89
|
+
interface SereelSdkClient {
|
|
46
90
|
getAssets(): Promise<SdkAssetsResponse>;
|
|
47
91
|
getAssetByTokenAddress(tokenAddress: string): Promise<SdkAssetResponse>;
|
|
92
|
+
getAssetsByIssuer(issuerId: string): Promise<SdkAssetsResponse>;
|
|
48
93
|
}
|
|
49
94
|
|
|
50
|
-
declare function createClient(config: ClientConfig):
|
|
95
|
+
declare function createClient(config: ClientConfig): SereelSdkClient;
|
|
51
96
|
|
|
52
|
-
declare const ENVIRONMENT_BASE_URLS: Record<
|
|
53
|
-
declare function resolveBaseUrl(environment:
|
|
97
|
+
declare const ENVIRONMENT_BASE_URLS: Record<SereelEnvironment, string>;
|
|
98
|
+
declare function resolveBaseUrl(environment: SereelEnvironment, baseUrl?: string): string;
|
|
54
99
|
|
|
55
|
-
interface
|
|
100
|
+
interface SereelSdkErrorOptions {
|
|
56
101
|
status?: number;
|
|
57
102
|
code?: string;
|
|
58
103
|
cause?: unknown;
|
|
59
104
|
details?: unknown;
|
|
60
105
|
}
|
|
61
|
-
declare class
|
|
106
|
+
declare class SereelSdkError extends Error {
|
|
62
107
|
readonly status: number | undefined;
|
|
63
108
|
readonly code: string | undefined;
|
|
64
109
|
readonly details?: unknown;
|
|
65
|
-
constructor(message: string, options?:
|
|
110
|
+
constructor(message: string, options?: SereelSdkErrorOptions);
|
|
66
111
|
}
|
|
67
|
-
declare class InvalidConfigurationError extends
|
|
112
|
+
declare class InvalidConfigurationError extends SereelSdkError {
|
|
68
113
|
}
|
|
69
|
-
declare class HttpError extends
|
|
114
|
+
declare class HttpError extends SereelSdkError {
|
|
70
115
|
}
|
|
71
116
|
declare class UnauthorizedError extends HttpError {
|
|
72
117
|
}
|
|
@@ -74,9 +119,9 @@ declare class NotFoundError extends HttpError {
|
|
|
74
119
|
}
|
|
75
120
|
declare class ServerError extends HttpError {
|
|
76
121
|
}
|
|
77
|
-
declare class TimeoutError extends
|
|
122
|
+
declare class TimeoutError extends SereelSdkError {
|
|
78
123
|
}
|
|
79
|
-
declare class MalformedResponseError extends
|
|
124
|
+
declare class MalformedResponseError extends SereelSdkError {
|
|
80
125
|
}
|
|
81
126
|
|
|
82
|
-
export { type ClientConfig, ENVIRONMENT_BASE_URLS, HttpError, InvalidConfigurationError, MalformedResponseError, NotFoundError, type SdkAssetRecord, type SdkAssetResponse, type SdkAssetsResponse, type SdkBookSummary, type
|
|
127
|
+
export { type ClientConfig, ENVIRONMENT_BASE_URLS, HttpError, InvalidConfigurationError, MalformedResponseError, type NativeCurrency, type NetworkDetails, NotFoundError, type SdkAssetRecord, type SdkAssetResponse, type SdkAssetsResponse, type SdkBookSummary, type SdkIssuerSummary, type SdkRuleEngineSummary, type SdkRuleSummary, type SdkSecurityDetails, type SdkTokenPartner, type SdkTokenProspectus, type SereelEnvironment, type SereelSdkClient, SereelSdkError, ServerError, TimeoutError, UnauthorizedError, createClient, resolveBaseUrl };
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/errors.ts
|
|
2
|
-
var
|
|
2
|
+
var SereelSdkError = class extends Error {
|
|
3
3
|
status;
|
|
4
4
|
code;
|
|
5
5
|
details;
|
|
@@ -11,9 +11,9 @@ var SereeSdkError = class extends Error {
|
|
|
11
11
|
this.details = options.details;
|
|
12
12
|
}
|
|
13
13
|
};
|
|
14
|
-
var InvalidConfigurationError = class extends
|
|
14
|
+
var InvalidConfigurationError = class extends SereelSdkError {
|
|
15
15
|
};
|
|
16
|
-
var HttpError = class extends
|
|
16
|
+
var HttpError = class extends SereelSdkError {
|
|
17
17
|
};
|
|
18
18
|
var UnauthorizedError = class extends HttpError {
|
|
19
19
|
};
|
|
@@ -21,9 +21,9 @@ var NotFoundError = class extends HttpError {
|
|
|
21
21
|
};
|
|
22
22
|
var ServerError = class extends HttpError {
|
|
23
23
|
};
|
|
24
|
-
var TimeoutError = class extends
|
|
24
|
+
var TimeoutError = class extends SereelSdkError {
|
|
25
25
|
};
|
|
26
|
-
var MalformedResponseError = class extends
|
|
26
|
+
var MalformedResponseError = class extends SereelSdkError {
|
|
27
27
|
};
|
|
28
28
|
|
|
29
29
|
// src/config.ts
|
|
@@ -176,17 +176,53 @@ function isNullableString(value) {
|
|
|
176
176
|
function isFiniteNumber(value) {
|
|
177
177
|
return typeof value === "number" && Number.isFinite(value);
|
|
178
178
|
}
|
|
179
|
-
function
|
|
180
|
-
return
|
|
179
|
+
function isBoolean(value) {
|
|
180
|
+
return typeof value === "boolean";
|
|
181
181
|
}
|
|
182
|
-
function
|
|
183
|
-
return isRecord(value) && isString(value.
|
|
182
|
+
function isProspectus(value) {
|
|
183
|
+
return isRecord(value) && isString(value.name) && isString(value.url);
|
|
184
|
+
}
|
|
185
|
+
function isTokenPartner(value) {
|
|
186
|
+
return isRecord(value) && isString(value.partner_name) && isString(value.partner_logo) && isString(value.partner_role);
|
|
187
|
+
}
|
|
188
|
+
function isRuleSummary(value) {
|
|
189
|
+
return isRecord(value) && isString(value.rule_address) && isString(value.rule_type);
|
|
190
|
+
}
|
|
191
|
+
function isRuleEngineSummary(value) {
|
|
192
|
+
return isRecord(value) && isString(value.name) && isString(value.rule_engine_address) && Array.isArray(value.rules) && value.rules.every(isRuleSummary);
|
|
193
|
+
}
|
|
194
|
+
function isSecurityDetails(value) {
|
|
195
|
+
if (!isRecord(value)) return false;
|
|
196
|
+
const hasRequiredStrings = isString(value.token_address) && isString(value.token_name) && isString(value.token_symbol) && isString(value.token_decimal) && isString(value.network_id) && isString(value.token_type) && isString(value.admin);
|
|
197
|
+
if (!hasRequiredStrings) return false;
|
|
198
|
+
if (!isNullableString(value.icon_url)) return false;
|
|
199
|
+
if (!isNullableString(value.created_at)) return false;
|
|
200
|
+
if (value.prospectus !== null && value.prospectus !== void 0) {
|
|
201
|
+
if (!isProspectus(value.prospectus)) return false;
|
|
202
|
+
}
|
|
203
|
+
if (value.partners !== null && value.partners !== void 0) {
|
|
204
|
+
if (!Array.isArray(value.partners) || !value.partners.every(isTokenPartner))
|
|
205
|
+
return false;
|
|
206
|
+
}
|
|
207
|
+
if (value.rule_engine !== null && value.rule_engine !== void 0) {
|
|
208
|
+
if (!isRuleEngineSummary(value.rule_engine)) return false;
|
|
209
|
+
}
|
|
210
|
+
return true;
|
|
211
|
+
}
|
|
212
|
+
function isIssuerSummary(value) {
|
|
213
|
+
return isRecord(value) && isString(value.id) && isString(value.legal_name) && isNullableString(value.display_name) && isString(value.jurisdiction) && isNullableString(value.website) && isNullableString(value.logo_url);
|
|
214
|
+
}
|
|
215
|
+
function isNativeCurrency(value) {
|
|
216
|
+
return isRecord(value) && isString(value.symbol) && isString(value.name) && isFiniteNumber(value.decimals);
|
|
217
|
+
}
|
|
218
|
+
function isNetworkDetails(value) {
|
|
219
|
+
return isRecord(value) && isString(value.network_id) && isString(value.name) && isString(value.family) && (isFiniteNumber(value.chain_id) || value.chain_id === null) && isNativeCurrency(value.native_currency) && isString(value.rpc_endpoint) && Array.isArray(value.explorer_urls) && value.explorer_urls.every(isString) && isBoolean(value.can_deploy_token) && isBoolean(value.is_testnet) && isBoolean(value.is_supported);
|
|
184
220
|
}
|
|
185
221
|
function isBookSummary(value) {
|
|
186
222
|
return isRecord(value) && isString(value.id) && isString(value.order_book_address) && isString(value.status) && isString(value.network_id) && isFiniteNumber(value.subscription_start) && isFiniteNumber(value.subscription_end) && isString(value.prospectus_file_url);
|
|
187
223
|
}
|
|
188
224
|
function isAssetRecord(value) {
|
|
189
|
-
return isRecord(value) &&
|
|
225
|
+
return isRecord(value) && isSecurityDetails(value.security) && isIssuerSummary(value.issuer) && Array.isArray(value.books) && value.books.every(isBookSummary) && isNetworkDetails(value.network);
|
|
190
226
|
}
|
|
191
227
|
function validateSdkAssetsResponse(value) {
|
|
192
228
|
if (!isRecord(value) || !Array.isArray(value.data) || !isFiniteNumber(value.count) || !value.data.every(isAssetRecord)) {
|
|
@@ -226,6 +262,17 @@ function createClient(config) {
|
|
|
226
262
|
`/sdk/assets/${encodeURIComponent(trimmedTokenAddress)}`,
|
|
227
263
|
validateSdkAssetResponse
|
|
228
264
|
);
|
|
265
|
+
},
|
|
266
|
+
getAssetsByIssuer(issuerId) {
|
|
267
|
+
const trimmedIssuerId = issuerId.trim();
|
|
268
|
+
if (!trimmedIssuerId) {
|
|
269
|
+
throw new InvalidConfigurationError("issuerId must not be empty.");
|
|
270
|
+
}
|
|
271
|
+
return requestJson(
|
|
272
|
+
resolved,
|
|
273
|
+
`/sdk/assets/issuer/${encodeURIComponent(trimmedIssuerId)}`,
|
|
274
|
+
validateSdkAssetsResponse
|
|
275
|
+
);
|
|
229
276
|
}
|
|
230
277
|
};
|
|
231
278
|
}
|
|
@@ -235,7 +282,7 @@ export {
|
|
|
235
282
|
InvalidConfigurationError,
|
|
236
283
|
MalformedResponseError,
|
|
237
284
|
NotFoundError,
|
|
238
|
-
|
|
285
|
+
SereelSdkError,
|
|
239
286
|
ServerError,
|
|
240
287
|
TimeoutError,
|
|
241
288
|
UnauthorizedError,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/config.ts","../src/transport.ts","../src/validation.ts","../src/client.ts"],"sourcesContent":["export interface SereeSdkErrorOptions {\n status?: number;\n code?: string;\n cause?: unknown;\n details?: unknown;\n}\n\nexport class SereeSdkError extends Error {\n readonly status: number | undefined;\n readonly code: string | undefined;\n readonly details?: unknown;\n\n constructor(message: string, options: SereeSdkErrorOptions = {}) {\n super(message, options.cause ? { cause: options.cause } : undefined);\n this.name = new.target.name;\n this.status = options.status;\n this.code = options.code;\n this.details = options.details;\n }\n}\n\nexport class InvalidConfigurationError extends SereeSdkError {}\n\nexport class HttpError extends SereeSdkError {}\n\nexport class UnauthorizedError extends HttpError {}\n\nexport class NotFoundError extends HttpError {}\n\nexport class ServerError extends HttpError {}\n\nexport class TimeoutError extends SereeSdkError {}\n\nexport class MalformedResponseError extends SereeSdkError {}\n","import { InvalidConfigurationError } from \"./errors\";\nimport type { ClientConfig, SereeEnvironment } from \"./types\";\n\nexport const ENVIRONMENT_BASE_URLS: Record<SereeEnvironment, string> = {\n devnet: \"https://api-lazer.sereel.com\",\n testnet: \"https://api-lazer-v2.sereel.com\",\n mainnet: \"https://cahokia.sereel.com\",\n};\n\nexport interface ResolvedClientConfig {\n environment: SereeEnvironment;\n apiKey: string;\n timeoutMs: number;\n baseUrl: string;\n fetch: typeof fetch;\n}\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\nfunction getFetchImplementation(\n providedFetch: ClientConfig[\"fetch\"],\n): typeof fetch {\n if (providedFetch) {\n return providedFetch;\n }\n\n if (typeof globalThis.fetch === \"function\") {\n return globalThis.fetch.bind(globalThis);\n }\n\n throw new InvalidConfigurationError(\n \"No fetch implementation is available. Provide config.fetch in this runtime.\",\n );\n}\n\nfunction normalizeBaseUrl(baseUrl: string): string {\n const trimmed = baseUrl.trim();\n\n if (!trimmed) {\n throw new InvalidConfigurationError(\"baseUrl must not be empty when provided.\");\n }\n\n try {\n return new URL(trimmed).toString().replace(/\\/+$/, \"\");\n } catch (cause) {\n throw new InvalidConfigurationError(\"baseUrl must be a valid absolute URL.\", {\n cause,\n });\n }\n}\n\nexport function resolveBaseUrl(\n environment: SereeEnvironment,\n baseUrl?: string,\n): string {\n if (baseUrl) {\n return normalizeBaseUrl(baseUrl);\n }\n\n return ENVIRONMENT_BASE_URLS[environment];\n}\n\nexport function resolveClientConfig(config: ClientConfig): ResolvedClientConfig {\n const apiKey = config.apiKey.trim();\n\n if (!apiKey) {\n throw new InvalidConfigurationError(\"apiKey must not be empty.\");\n }\n\n const timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n throw new InvalidConfigurationError(\"timeoutMs must be a positive number.\");\n }\n\n return {\n environment: config.environment,\n apiKey,\n timeoutMs,\n baseUrl: resolveBaseUrl(config.environment, config.baseUrl),\n fetch: getFetchImplementation(config.fetch),\n };\n}\n","import {\n HttpError,\n MalformedResponseError,\n NotFoundError,\n ServerError,\n TimeoutError,\n UnauthorizedError,\n} from \"./errors\";\nimport type { ResolvedClientConfig } from \"./config\";\n\ninterface ApiErrorBody {\n error?: string;\n message?: string;\n}\n\nfunction createTimeoutSignal(timeoutMs: number): {\n signal: AbortSignal;\n cleanup: () => void;\n} {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n\n return {\n signal: controller.signal,\n cleanup: () => clearTimeout(timeout),\n };\n}\n\nasync function parseBody(response: Response): Promise<unknown> {\n const text = await response.text();\n if (!text) {\n return null;\n }\n\n try {\n return JSON.parse(text) as unknown;\n } catch (cause) {\n throw new MalformedResponseError(\"Received a non-JSON response body.\", {\n cause,\n status: response.status,\n details: text,\n });\n }\n}\n\nfunction getErrorMessage(status: number, body: unknown): string {\n if (body && typeof body === \"object\") {\n const apiError = body as ApiErrorBody;\n if (typeof apiError.error === \"string\" && apiError.error.trim()) {\n return apiError.error;\n }\n if (typeof apiError.message === \"string\" && apiError.message.trim()) {\n return apiError.message;\n }\n }\n\n return `Request failed with status ${status}.`;\n}\n\nfunction toHttpError(status: number, body: unknown): HttpError {\n const message = getErrorMessage(status, body);\n const options = { status, details: body };\n\n if (status === 401) {\n return new UnauthorizedError(message, options);\n }\n if (status === 404) {\n return new NotFoundError(message, options);\n }\n if (status >= 500) {\n return new ServerError(message, options);\n }\n\n return new HttpError(message, options);\n}\n\nexport async function requestJson<T>(\n config: ResolvedClientConfig,\n path: string,\n validate: (value: unknown) => T,\n): Promise<T> {\n const { signal, cleanup } = createTimeoutSignal(config.timeoutMs);\n\n try {\n const response = await config.fetch(`${config.baseUrl}${path}`, {\n method: \"GET\",\n signal,\n headers: {\n accept: \"application/json\",\n \"x-api-key\": config.apiKey,\n },\n });\n\n const body = await parseBody(response);\n if (!response.ok) {\n throw toHttpError(response.status, body);\n }\n\n return validate(body);\n } catch (error) {\n if (error instanceof HttpError || error instanceof MalformedResponseError) {\n throw error;\n }\n\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new TimeoutError(\n `Request timed out after ${config.timeoutMs}ms.`,\n { cause: error },\n );\n }\n\n throw error;\n } finally {\n cleanup();\n }\n}\n","import { MalformedResponseError } from \"./errors\";\nimport type {\n SdkAssetRecord,\n SdkAssetResponse,\n SdkAssetsResponse,\n SdkBookSummary,\n SdkSecuritySummary,\n SdkSellerOrganizationSummary,\n} from \"./types\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isString(value: unknown): value is string {\n return typeof value === \"string\";\n}\n\nfunction isNullableString(value: unknown): value is string | null {\n return typeof value === \"string\" || value === null;\n}\n\nfunction isFiniteNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction isSecuritySummary(value: unknown): value is SdkSecuritySummary {\n return (\n isRecord(value) &&\n isString(value.id) &&\n isString(value.token_address) &&\n isString(value.token_name) &&\n isString(value.token_symbol) &&\n isString(value.network_id) &&\n isString(value.token_type)\n );\n}\n\nfunction isSellerOrganizationSummary(\n value: unknown,\n): value is SdkSellerOrganizationSummary {\n return (\n isRecord(value) &&\n isString(value.id) &&\n isString(value.legal_name) &&\n isNullableString(value.display_name) &&\n isString(value.jurisdiction) &&\n isNullableString(value.website)\n );\n}\n\nfunction isBookSummary(value: unknown): value is SdkBookSummary {\n return (\n isRecord(value) &&\n isString(value.id) &&\n isString(value.order_book_address) &&\n isString(value.status) &&\n isString(value.network_id) &&\n isFiniteNumber(value.subscription_start) &&\n isFiniteNumber(value.subscription_end) &&\n isString(value.prospectus_file_url)\n );\n}\n\nfunction isAssetRecord(value: unknown): value is SdkAssetRecord {\n return (\n isRecord(value) &&\n isSecuritySummary(value.security) &&\n isSellerOrganizationSummary(value.seller_organization) &&\n Array.isArray(value.books) &&\n value.books.every(isBookSummary)\n );\n}\n\nexport function validateSdkAssetsResponse(value: unknown): SdkAssetsResponse {\n if (\n !isRecord(value) ||\n !Array.isArray(value.data) ||\n !isFiniteNumber(value.count) ||\n !value.data.every(isAssetRecord)\n ) {\n throw new MalformedResponseError(\n \"Received an invalid SDK assets response shape.\",\n { details: value },\n );\n }\n\n return value as unknown as SdkAssetsResponse;\n}\n\nexport function validateSdkAssetResponse(value: unknown): SdkAssetResponse {\n if (!isRecord(value) || !isAssetRecord(value.data)) {\n throw new MalformedResponseError(\n \"Received an invalid SDK asset response shape.\",\n { details: value },\n );\n }\n\n return value as unknown as SdkAssetResponse;\n}\n","import { resolveClientConfig } from \"./config\";\nimport { InvalidConfigurationError } from \"./errors\";\nimport { requestJson } from \"./transport\";\nimport type {\n ClientConfig,\n SdkAssetResponse,\n SdkAssetsResponse,\n SereeSdkClient,\n} from \"./types\";\nimport {\n validateSdkAssetResponse,\n validateSdkAssetsResponse,\n} from \"./validation\";\n\nexport function createClient(config: ClientConfig): SereeSdkClient {\n const resolved = resolveClientConfig(config);\n\n return {\n getAssets(): Promise<SdkAssetsResponse> {\n return requestJson(resolved, \"/sdk/assets\", validateSdkAssetsResponse);\n },\n\n getAssetByTokenAddress(tokenAddress: string): Promise<SdkAssetResponse> {\n const trimmedTokenAddress = tokenAddress.trim();\n if (!trimmedTokenAddress) {\n throw new InvalidConfigurationError(\n \"tokenAddress must not be empty.\",\n );\n }\n\n return requestJson(\n resolved,\n `/sdk/assets/${encodeURIComponent(trimmedTokenAddress)}`,\n validateSdkAssetResponse,\n );\n },\n };\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/config.ts","../src/transport.ts","../src/validation.ts","../src/client.ts"],"sourcesContent":["export interface SereelSdkErrorOptions {\n status?: number;\n code?: string;\n cause?: unknown;\n details?: unknown;\n}\n\nexport class SereelSdkError extends Error {\n readonly status: number | undefined;\n readonly code: string | undefined;\n readonly details?: unknown;\n\n constructor(message: string, options: SereelSdkErrorOptions = {}) {\n super(message, options.cause ? { cause: options.cause } : undefined);\n this.name = new.target.name;\n this.status = options.status;\n this.code = options.code;\n this.details = options.details;\n }\n}\n\nexport class InvalidConfigurationError extends SereelSdkError {}\n\nexport class HttpError extends SereelSdkError {}\n\nexport class UnauthorizedError extends HttpError {}\n\nexport class NotFoundError extends HttpError {}\n\nexport class ServerError extends HttpError {}\n\nexport class TimeoutError extends SereelSdkError {}\n\nexport class MalformedResponseError extends SereelSdkError {}\n","import { InvalidConfigurationError } from \"./errors\";\nimport type { ClientConfig, SereelEnvironment } from \"./types\";\n\nexport const ENVIRONMENT_BASE_URLS: Record<SereelEnvironment, string> = {\n devnet: \"https://api-lazer.sereel.com\",\n testnet: \"https://api-lazer-v2.sereel.com\",\n mainnet: \"https://cahokia.sereel.com\",\n};\n\nexport interface ResolvedClientConfig {\n environment: SereelEnvironment;\n apiKey: string;\n timeoutMs: number;\n baseUrl: string;\n fetch: typeof fetch;\n}\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\nfunction getFetchImplementation(\n providedFetch: ClientConfig[\"fetch\"],\n): typeof fetch {\n if (providedFetch) {\n return providedFetch;\n }\n\n if (typeof globalThis.fetch === \"function\") {\n return globalThis.fetch.bind(globalThis);\n }\n\n throw new InvalidConfigurationError(\n \"No fetch implementation is available. Provide config.fetch in this runtime.\",\n );\n}\n\nfunction normalizeBaseUrl(baseUrl: string): string {\n const trimmed = baseUrl.trim();\n\n if (!trimmed) {\n throw new InvalidConfigurationError(\"baseUrl must not be empty when provided.\");\n }\n\n try {\n return new URL(trimmed).toString().replace(/\\/+$/, \"\");\n } catch (cause) {\n throw new InvalidConfigurationError(\"baseUrl must be a valid absolute URL.\", {\n cause,\n });\n }\n}\n\nexport function resolveBaseUrl(\n environment: SereelEnvironment,\n baseUrl?: string,\n): string {\n if (baseUrl) {\n return normalizeBaseUrl(baseUrl);\n }\n\n return ENVIRONMENT_BASE_URLS[environment];\n}\n\nexport function resolveClientConfig(config: ClientConfig): ResolvedClientConfig {\n const apiKey = config.apiKey.trim();\n\n if (!apiKey) {\n throw new InvalidConfigurationError(\"apiKey must not be empty.\");\n }\n\n const timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n throw new InvalidConfigurationError(\"timeoutMs must be a positive number.\");\n }\n\n return {\n environment: config.environment,\n apiKey,\n timeoutMs,\n baseUrl: resolveBaseUrl(config.environment, config.baseUrl),\n fetch: getFetchImplementation(config.fetch),\n };\n}\n","import {\n HttpError,\n MalformedResponseError,\n NotFoundError,\n ServerError,\n TimeoutError,\n UnauthorizedError,\n} from \"./errors\";\nimport type { ResolvedClientConfig } from \"./config\";\n\ninterface ApiErrorBody {\n error?: string;\n message?: string;\n}\n\nfunction createTimeoutSignal(timeoutMs: number): {\n signal: AbortSignal;\n cleanup: () => void;\n} {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n\n return {\n signal: controller.signal,\n cleanup: () => clearTimeout(timeout),\n };\n}\n\nasync function parseBody(response: Response): Promise<unknown> {\n const text = await response.text();\n if (!text) {\n return null;\n }\n\n try {\n return JSON.parse(text) as unknown;\n } catch (cause) {\n throw new MalformedResponseError(\"Received a non-JSON response body.\", {\n cause,\n status: response.status,\n details: text,\n });\n }\n}\n\nfunction getErrorMessage(status: number, body: unknown): string {\n if (body && typeof body === \"object\") {\n const apiError = body as ApiErrorBody;\n if (typeof apiError.error === \"string\" && apiError.error.trim()) {\n return apiError.error;\n }\n if (typeof apiError.message === \"string\" && apiError.message.trim()) {\n return apiError.message;\n }\n }\n\n return `Request failed with status ${status}.`;\n}\n\nfunction toHttpError(status: number, body: unknown): HttpError {\n const message = getErrorMessage(status, body);\n const options = { status, details: body };\n\n if (status === 401) {\n return new UnauthorizedError(message, options);\n }\n if (status === 404) {\n return new NotFoundError(message, options);\n }\n if (status >= 500) {\n return new ServerError(message, options);\n }\n\n return new HttpError(message, options);\n}\n\nexport async function requestJson<T>(\n config: ResolvedClientConfig,\n path: string,\n validate: (value: unknown) => T,\n): Promise<T> {\n const { signal, cleanup } = createTimeoutSignal(config.timeoutMs);\n\n try {\n const response = await config.fetch(`${config.baseUrl}${path}`, {\n method: \"GET\",\n signal,\n headers: {\n accept: \"application/json\",\n \"x-api-key\": config.apiKey,\n },\n });\n\n const body = await parseBody(response);\n if (!response.ok) {\n throw toHttpError(response.status, body);\n }\n\n return validate(body);\n } catch (error) {\n if (error instanceof HttpError || error instanceof MalformedResponseError) {\n throw error;\n }\n\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new TimeoutError(\n `Request timed out after ${config.timeoutMs}ms.`,\n { cause: error },\n );\n }\n\n throw error;\n } finally {\n cleanup();\n }\n}\n","import { MalformedResponseError } from \"./errors\";\nimport type {\n NativeCurrency,\n NetworkDetails,\n SdkAssetRecord,\n SdkAssetResponse,\n SdkAssetsResponse,\n SdkBookSummary,\n SdkIssuerSummary,\n SdkRuleEngineSummary,\n SdkRuleSummary,\n SdkSecurityDetails,\n SdkTokenPartner,\n SdkTokenProspectus,\n} from \"./types\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isString(value: unknown): value is string {\n return typeof value === \"string\";\n}\n\nfunction isNullableString(value: unknown): value is string | null {\n return typeof value === \"string\" || value === null;\n}\n\nfunction isFiniteNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction isBoolean(value: unknown): value is boolean {\n return typeof value === \"boolean\";\n}\n\nfunction isProspectus(value: unknown): value is SdkTokenProspectus {\n return isRecord(value) && isString(value.name) && isString(value.url);\n}\n\nfunction isTokenPartner(value: unknown): value is SdkTokenPartner {\n return (\n isRecord(value) &&\n isString(value.partner_name) &&\n isString(value.partner_logo) &&\n isString(value.partner_role)\n );\n}\n\nfunction isRuleSummary(value: unknown): value is SdkRuleSummary {\n return (\n isRecord(value) &&\n isString(value.rule_address) &&\n isString(value.rule_type)\n );\n}\n\nfunction isRuleEngineSummary(value: unknown): value is SdkRuleEngineSummary {\n return (\n isRecord(value) &&\n isString(value.name) &&\n isString(value.rule_engine_address) &&\n Array.isArray(value.rules) &&\n (value.rules as unknown[]).every(isRuleSummary)\n );\n}\n\nfunction isSecurityDetails(value: unknown): value is SdkSecurityDetails {\n if (!isRecord(value)) return false;\n\n const hasRequiredStrings =\n isString(value.token_address) &&\n isString(value.token_name) &&\n isString(value.token_symbol) &&\n isString(value.token_decimal) &&\n isString(value.network_id) &&\n isString(value.token_type) &&\n isString(value.admin);\n\n if (!hasRequiredStrings) return false;\n\n if (!isNullableString(value.icon_url)) return false;\n if (!isNullableString(value.created_at)) return false;\n\n if (value.prospectus !== null && value.prospectus !== undefined) {\n if (!isProspectus(value.prospectus)) return false;\n }\n\n if (value.partners !== null && value.partners !== undefined) {\n if (\n !Array.isArray(value.partners) ||\n !(value.partners as unknown[]).every(isTokenPartner)\n )\n return false;\n }\n\n if (value.rule_engine !== null && value.rule_engine !== undefined) {\n if (!isRuleEngineSummary(value.rule_engine)) return false;\n }\n\n return true;\n}\n\nfunction isIssuerSummary(value: unknown): value is SdkIssuerSummary {\n return (\n isRecord(value) &&\n isString(value.id) &&\n isString(value.legal_name) &&\n isNullableString(value.display_name) &&\n isString(value.jurisdiction) &&\n isNullableString(value.website) &&\n isNullableString(value.logo_url)\n );\n}\n\nfunction isNativeCurrency(value: unknown): value is NativeCurrency {\n return (\n isRecord(value) &&\n isString(value.symbol) &&\n isString(value.name) &&\n isFiniteNumber(value.decimals)\n );\n}\n\nfunction isNetworkDetails(value: unknown): value is NetworkDetails {\n return (\n isRecord(value) &&\n isString(value.network_id) &&\n isString(value.name) &&\n isString(value.family) &&\n (isFiniteNumber(value.chain_id) || value.chain_id === null) &&\n isNativeCurrency(value.native_currency) &&\n isString(value.rpc_endpoint) &&\n Array.isArray(value.explorer_urls) &&\n (value.explorer_urls as unknown[]).every(isString) &&\n isBoolean(value.can_deploy_token) &&\n isBoolean(value.is_testnet) &&\n isBoolean(value.is_supported)\n );\n}\n\nfunction isBookSummary(value: unknown): value is SdkBookSummary {\n return (\n isRecord(value) &&\n isString(value.id) &&\n isString(value.order_book_address) &&\n isString(value.status) &&\n isString(value.network_id) &&\n isFiniteNumber(value.subscription_start) &&\n isFiniteNumber(value.subscription_end) &&\n isString(value.prospectus_file_url)\n );\n}\n\nfunction isAssetRecord(value: unknown): value is SdkAssetRecord {\n return (\n isRecord(value) &&\n isSecurityDetails(value.security) &&\n isIssuerSummary(value.issuer) &&\n Array.isArray(value.books) &&\n value.books.every(isBookSummary) &&\n isNetworkDetails(value.network)\n );\n}\n\nexport function validateSdkAssetsResponse(value: unknown): SdkAssetsResponse {\n if (\n !isRecord(value) ||\n !Array.isArray(value.data) ||\n !isFiniteNumber(value.count) ||\n !value.data.every(isAssetRecord)\n ) {\n throw new MalformedResponseError(\n \"Received an invalid SDK assets response shape.\",\n { details: value },\n );\n }\n\n return value as unknown as SdkAssetsResponse;\n}\n\nexport function validateSdkAssetResponse(value: unknown): SdkAssetResponse {\n if (!isRecord(value) || !isAssetRecord(value.data)) {\n throw new MalformedResponseError(\n \"Received an invalid SDK asset response shape.\",\n { details: value },\n );\n }\n\n return value as unknown as SdkAssetResponse;\n}\n","import { resolveClientConfig } from \"./config\";\nimport { InvalidConfigurationError } from \"./errors\";\nimport { requestJson } from \"./transport\";\nimport type {\n ClientConfig,\n SdkAssetResponse,\n SdkAssetsResponse,\n SereelSdkClient,\n} from \"./types\";\nimport {\n validateSdkAssetResponse,\n validateSdkAssetsResponse,\n} from \"./validation\";\n\nexport function createClient(config: ClientConfig): SereelSdkClient {\n const resolved = resolveClientConfig(config);\n\n return {\n getAssets(): Promise<SdkAssetsResponse> {\n return requestJson(resolved, \"/sdk/assets\", validateSdkAssetsResponse);\n },\n\n getAssetByTokenAddress(tokenAddress: string): Promise<SdkAssetResponse> {\n const trimmedTokenAddress = tokenAddress.trim();\n if (!trimmedTokenAddress) {\n throw new InvalidConfigurationError(\n \"tokenAddress must not be empty.\",\n );\n }\n\n return requestJson(\n resolved,\n `/sdk/assets/${encodeURIComponent(trimmedTokenAddress)}`,\n validateSdkAssetResponse,\n );\n },\n\n getAssetsByIssuer(issuerId: string): Promise<SdkAssetsResponse> {\n const trimmedIssuerId = issuerId.trim();\n if (!trimmedIssuerId) {\n throw new InvalidConfigurationError(\"issuerId must not be empty.\");\n }\n\n return requestJson(\n resolved,\n `/sdk/assets/issuer/${encodeURIComponent(trimmedIssuerId)}`,\n validateSdkAssetsResponse,\n );\n },\n };\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sereel/sdk",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "TypeScript SDK for
|
|
3
|
+
"version": "0.1.2",
|
|
4
|
+
"description": "TypeScript SDK for Sereel asset read endpoints",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "./dist/index.cjs",
|