@sereel/sdk 0.1.1 → 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/dist/index.cjs CHANGED
@@ -212,15 +212,42 @@ function isNullableString(value) {
212
212
  function isFiniteNumber(value) {
213
213
  return typeof value === "number" && Number.isFinite(value);
214
214
  }
215
- function isSecuritySummary(value) {
216
- return isRecord(value) && isString(value.id) && isString(value.token_address) && isString(value.token_name) && isString(value.token_symbol) && isString(value.network_id) && isString(value.token_type);
217
- }
218
- function isSellerOrganizationSummary(value) {
219
- return isRecord(value) && isString(value.id) && isString(value.legal_name) && isNullableString(value.display_name) && isString(value.jurisdiction) && isNullableString(value.website);
220
- }
221
215
  function isBoolean(value) {
222
216
  return typeof value === "boolean";
223
217
  }
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
+ }
224
251
  function isNativeCurrency(value) {
225
252
  return isRecord(value) && isString(value.symbol) && isString(value.name) && isFiniteNumber(value.decimals);
226
253
  }
@@ -231,7 +258,7 @@ function isBookSummary(value) {
231
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);
232
259
  }
233
260
  function isAssetRecord(value) {
234
- return isRecord(value) && isSecuritySummary(value.security) && isSellerOrganizationSummary(value.seller_organization) && Array.isArray(value.books) && value.books.every(isBookSummary) && isNetworkDetails(value.network);
261
+ return isRecord(value) && isSecurityDetails(value.security) && isIssuerSummary(value.issuer) && Array.isArray(value.books) && value.books.every(isBookSummary) && isNetworkDetails(value.network);
235
262
  }
236
263
  function validateSdkAssetsResponse(value) {
237
264
  if (!isRecord(value) || !Array.isArray(value.data) || !isFiniteNumber(value.count) || !value.data.every(isAssetRecord)) {
@@ -271,6 +298,17 @@ function createClient(config) {
271
298
  `/sdk/assets/${encodeURIComponent(trimmedTokenAddress)}`,
272
299
  validateSdkAssetResponse
273
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
+ );
274
312
  }
275
313
  };
276
314
  }
@@ -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 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 SdkSecuritySummary,\n SdkSellerOrganizationSummary,\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 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 isBoolean(value: unknown): value is boolean {\n return typeof value === \"boolean\";\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 isSecuritySummary(value.security) &&\n isSellerOrganizationSummary(value.seller_organization) &&\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}\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":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACOO,IAAM,iBAAN,cAA6B,MAAM;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,SAAiB,UAAiC,CAAC,GAAG;AAChE,UAAM,SAAS,QAAQ,QAAQ,EAAE,OAAO,QAAQ,MAAM,IAAI,MAAS;AACnE,SAAK,OAAO,WAAW;AACvB,SAAK,SAAS,QAAQ;AACtB,SAAK,OAAO,QAAQ;AACpB,SAAK,UAAU,QAAQ;AAAA,EACzB;AACF;AAEO,IAAM,4BAAN,cAAwC,eAAe;AAAC;AAExD,IAAM,YAAN,cAAwB,eAAe;AAAC;AAExC,IAAM,oBAAN,cAAgC,UAAU;AAAC;AAE3C,IAAM,gBAAN,cAA4B,UAAU;AAAC;AAEvC,IAAM,cAAN,cAA0B,UAAU;AAAC;AAErC,IAAM,eAAN,cAA2B,eAAe;AAAC;AAE3C,IAAM,yBAAN,cAAqC,eAAe;AAAC;;;AC9BrD,IAAM,wBAA2D;AAAA,EACtE,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AACX;AAUA,IAAM,qBAAqB;AAE3B,SAAS,uBACP,eACc;AACd,MAAI,eAAe;AACjB,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,WAAW,UAAU,YAAY;AAC1C,WAAO,WAAW,MAAM,KAAK,UAAU;AAAA,EACzC;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,SAAyB;AACjD,QAAM,UAAU,QAAQ,KAAK;AAE7B,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,0BAA0B,0CAA0C;AAAA,EAChF;AAEA,MAAI;AACF,WAAO,IAAI,IAAI,OAAO,EAAE,SAAS,EAAE,QAAQ,QAAQ,EAAE;AAAA,EACvD,SAAS,OAAO;AACd,UAAM,IAAI,0BAA0B,yCAAyC;AAAA,MAC3E;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEO,SAAS,eACd,aACA,SACQ;AACR,MAAI,SAAS;AACX,WAAO,iBAAiB,OAAO;AAAA,EACjC;AAEA,SAAO,sBAAsB,WAAW;AAC1C;AAEO,SAAS,oBAAoB,QAA4C;AAC9E,QAAM,SAAS,OAAO,OAAO,KAAK;AAElC,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,0BAA0B,2BAA2B;AAAA,EACjE;AAEA,QAAM,YAAY,OAAO,aAAa;AACtC,MAAI,CAAC,OAAO,SAAS,SAAS,KAAK,aAAa,GAAG;AACjD,UAAM,IAAI,0BAA0B,sCAAsC;AAAA,EAC5E;AAEA,SAAO;AAAA,IACL,aAAa,OAAO;AAAA,IACpB;AAAA,IACA;AAAA,IACA,SAAS,eAAe,OAAO,aAAa,OAAO,OAAO;AAAA,IAC1D,OAAO,uBAAuB,OAAO,KAAK;AAAA,EAC5C;AACF;;;AClEA,SAAS,oBAAoB,WAG3B;AACA,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,UAAU,WAAW,MAAM,WAAW,MAAM,GAAG,SAAS;AAE9D,SAAO;AAAA,IACL,QAAQ,WAAW;AAAA,IACnB,SAAS,MAAM,aAAa,OAAO;AAAA,EACrC;AACF;AAEA,eAAe,UAAU,UAAsC;AAC7D,QAAM,OAAO,MAAM,SAAS,KAAK;AACjC,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,MAAI;AACF,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,SAAS,OAAO;AACd,UAAM,IAAI,uBAAuB,sCAAsC;AAAA,MACrE;AAAA,MACA,QAAQ,SAAS;AAAA,MACjB,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACF;AAEA,SAAS,gBAAgB,QAAgB,MAAuB;AAC9D,MAAI,QAAQ,OAAO,SAAS,UAAU;AACpC,UAAM,WAAW;AACjB,QAAI,OAAO,SAAS,UAAU,YAAY,SAAS,MAAM,KAAK,GAAG;AAC/D,aAAO,SAAS;AAAA,IAClB;AACA,QAAI,OAAO,SAAS,YAAY,YAAY,SAAS,QAAQ,KAAK,GAAG;AACnE,aAAO,SAAS;AAAA,IAClB;AAAA,EACF;AAEA,SAAO,8BAA8B,MAAM;AAC7C;AAEA,SAAS,YAAY,QAAgB,MAA0B;AAC7D,QAAM,UAAU,gBAAgB,QAAQ,IAAI;AAC5C,QAAM,UAAU,EAAE,QAAQ,SAAS,KAAK;AAExC,MAAI,WAAW,KAAK;AAClB,WAAO,IAAI,kBAAkB,SAAS,OAAO;AAAA,EAC/C;AACA,MAAI,WAAW,KAAK;AAClB,WAAO,IAAI,cAAc,SAAS,OAAO;AAAA,EAC3C;AACA,MAAI,UAAU,KAAK;AACjB,WAAO,IAAI,YAAY,SAAS,OAAO;AAAA,EACzC;AAEA,SAAO,IAAI,UAAU,SAAS,OAAO;AACvC;AAEA,eAAsB,YACpB,QACA,MACA,UACY;AACZ,QAAM,EAAE,QAAQ,QAAQ,IAAI,oBAAoB,OAAO,SAAS;AAEhE,MAAI;AACF,UAAM,WAAW,MAAM,OAAO,MAAM,GAAG,OAAO,OAAO,GAAG,IAAI,IAAI;AAAA,MAC9D,QAAQ;AAAA,MACR;AAAA,MACA,SAAS;AAAA,QACP,QAAQ;AAAA,QACR,aAAa,OAAO;AAAA,MACtB;AAAA,IACF,CAAC;AAED,UAAM,OAAO,MAAM,UAAU,QAAQ;AACrC,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,YAAY,SAAS,QAAQ,IAAI;AAAA,IACzC;AAEA,WAAO,SAAS,IAAI;AAAA,EACtB,SAAS,OAAO;AACd,QAAI,iBAAiB,aAAa,iBAAiB,wBAAwB;AACzE,YAAM;AAAA,IACR;AAEA,QAAI,iBAAiB,SAAS,MAAM,SAAS,cAAc;AACzD,YAAM,IAAI;AAAA,QACR,2BAA2B,OAAO,SAAS;AAAA,QAC3C,EAAE,OAAO,MAAM;AAAA,MACjB;AAAA,IACF;AAEA,UAAM;AAAA,EACR,UAAE;AACA,YAAQ;AAAA,EACV;AACF;;;ACnGA,SAAS,SAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU;AAChD;AAEA,SAAS,SAAS,OAAiC;AACjD,SAAO,OAAO,UAAU;AAC1B;AAEA,SAAS,iBAAiB,OAAwC;AAChE,SAAO,OAAO,UAAU,YAAY,UAAU;AAChD;AAEA,SAAS,eAAe,OAAiC;AACvD,SAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK;AAC3D;AAEA,SAAS,UAAU,OAAkC;AACnD,SAAO,OAAO,UAAU;AAC1B;AAEA,SAAS,aAAa,OAA6C;AACjE,SAAO,SAAS,KAAK,KAAK,SAAS,MAAM,IAAI,KAAK,SAAS,MAAM,GAAG;AACtE;AAEA,SAAS,eAAe,OAA0C;AAChE,SACE,SAAS,KAAK,KACd,SAAS,MAAM,YAAY,KAC3B,SAAS,MAAM,YAAY,KAC3B,SAAS,MAAM,YAAY;AAE/B;AAEA,SAAS,cAAc,OAAyC;AAC9D,SACE,SAAS,KAAK,KACd,SAAS,MAAM,YAAY,KAC3B,SAAS,MAAM,SAAS;AAE5B;AAEA,SAAS,oBAAoB,OAA+C;AAC1E,SACE,SAAS,KAAK,KACd,SAAS,MAAM,IAAI,KACnB,SAAS,MAAM,mBAAmB,KAClC,MAAM,QAAQ,MAAM,KAAK,KACxB,MAAM,MAAoB,MAAM,aAAa;AAElD;AAEA,SAAS,kBAAkB,OAA6C;AACtE,MAAI,CAAC,SAAS,KAAK,EAAG,QAAO;AAE7B,QAAM,qBACJ,SAAS,MAAM,aAAa,KAC5B,SAAS,MAAM,UAAU,KACzB,SAAS,MAAM,YAAY,KAC3B,SAAS,MAAM,aAAa,KAC5B,SAAS,MAAM,UAAU,KACzB,SAAS,MAAM,UAAU,KACzB,SAAS,MAAM,KAAK;AAEtB,MAAI,CAAC,mBAAoB,QAAO;AAEhC,MAAI,CAAC,iBAAiB,MAAM,QAAQ,EAAG,QAAO;AAC9C,MAAI,CAAC,iBAAiB,MAAM,UAAU,EAAG,QAAO;AAEhD,MAAI,MAAM,eAAe,QAAQ,MAAM,eAAe,QAAW;AAC/D,QAAI,CAAC,aAAa,MAAM,UAAU,EAAG,QAAO;AAAA,EAC9C;AAEA,MAAI,MAAM,aAAa,QAAQ,MAAM,aAAa,QAAW;AAC3D,QACE,CAAC,MAAM,QAAQ,MAAM,QAAQ,KAC7B,CAAE,MAAM,SAAuB,MAAM,cAAc;AAEnD,aAAO;AAAA,EACX;AAEA,MAAI,MAAM,gBAAgB,QAAQ,MAAM,gBAAgB,QAAW;AACjE,QAAI,CAAC,oBAAoB,MAAM,WAAW,EAAG,QAAO;AAAA,EACtD;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAA2C;AAClE,SACE,SAAS,KAAK,KACd,SAAS,MAAM,EAAE,KACjB,SAAS,MAAM,UAAU,KACzB,iBAAiB,MAAM,YAAY,KACnC,SAAS,MAAM,YAAY,KAC3B,iBAAiB,MAAM,OAAO,KAC9B,iBAAiB,MAAM,QAAQ;AAEnC;AAEA,SAAS,iBAAiB,OAAyC;AACjE,SACE,SAAS,KAAK,KACd,SAAS,MAAM,MAAM,KACrB,SAAS,MAAM,IAAI,KACnB,eAAe,MAAM,QAAQ;AAEjC;AAEA,SAAS,iBAAiB,OAAyC;AACjE,SACE,SAAS,KAAK,KACd,SAAS,MAAM,UAAU,KACzB,SAAS,MAAM,IAAI,KACnB,SAAS,MAAM,MAAM,MACpB,eAAe,MAAM,QAAQ,KAAK,MAAM,aAAa,SACtD,iBAAiB,MAAM,eAAe,KACtC,SAAS,MAAM,YAAY,KAC3B,MAAM,QAAQ,MAAM,aAAa,KAChC,MAAM,cAA4B,MAAM,QAAQ,KACjD,UAAU,MAAM,gBAAgB,KAChC,UAAU,MAAM,UAAU,KAC1B,UAAU,MAAM,YAAY;AAEhC;AAEA,SAAS,cAAc,OAAyC;AAC9D,SACE,SAAS,KAAK,KACd,SAAS,MAAM,EAAE,KACjB,SAAS,MAAM,kBAAkB,KACjC,SAAS,MAAM,MAAM,KACrB,SAAS,MAAM,UAAU,KACzB,eAAe,MAAM,kBAAkB,KACvC,eAAe,MAAM,gBAAgB,KACrC,SAAS,MAAM,mBAAmB;AAEtC;AAEA,SAAS,cAAc,OAAyC;AAC9D,SACE,SAAS,KAAK,KACd,kBAAkB,MAAM,QAAQ,KAChC,gBAAgB,MAAM,MAAM,KAC5B,MAAM,QAAQ,MAAM,KAAK,KACzB,MAAM,MAAM,MAAM,aAAa,KAC/B,iBAAiB,MAAM,OAAO;AAElC;AAEO,SAAS,0BAA0B,OAAmC;AAC3E,MACE,CAAC,SAAS,KAAK,KACf,CAAC,MAAM,QAAQ,MAAM,IAAI,KACzB,CAAC,eAAe,MAAM,KAAK,KAC3B,CAAC,MAAM,KAAK,MAAM,aAAa,GAC/B;AACA,UAAM,IAAI;AAAA,MACR;AAAA,MACA,EAAE,SAAS,MAAM;AAAA,IACnB;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,yBAAyB,OAAkC;AACzE,MAAI,CAAC,SAAS,KAAK,KAAK,CAAC,cAAc,MAAM,IAAI,GAAG;AAClD,UAAM,IAAI;AAAA,MACR;AAAA,MACA,EAAE,SAAS,MAAM;AAAA,IACnB;AAAA,EACF;AAEA,SAAO;AACT;;;AChLO,SAAS,aAAa,QAAuC;AAClE,QAAM,WAAW,oBAAoB,MAAM;AAE3C,SAAO;AAAA,IACL,YAAwC;AACtC,aAAO,YAAY,UAAU,eAAe,yBAAyB;AAAA,IACvE;AAAA,IAEA,uBAAuB,cAAiD;AACtE,YAAM,sBAAsB,aAAa,KAAK;AAC9C,UAAI,CAAC,qBAAqB;AACxB,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,QACL;AAAA,QACA,eAAe,mBAAmB,mBAAmB,CAAC;AAAA,QACtD;AAAA,MACF;AAAA,IACF;AAAA,IAEA,kBAAkB,UAA8C;AAC9D,YAAM,kBAAkB,SAAS,KAAK;AACtC,UAAI,CAAC,iBAAiB;AACpB,cAAM,IAAI,0BAA0B,6BAA6B;AAAA,MACnE;AAEA,aAAO;AAAA,QACL;AAAA,QACA,sBAAsB,mBAAmB,eAAe,CAAC;AAAA,QACzD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
package/dist/index.d.cts CHANGED
@@ -23,20 +23,46 @@ interface NetworkDetails {
23
23
  is_testnet: boolean;
24
24
  is_supported: boolean;
25
25
  }
26
- interface SdkSecuritySummary {
27
- id: string;
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 {
28
46
  token_address: string;
29
47
  token_name: string;
30
48
  token_symbol: string;
49
+ token_decimal: string;
31
50
  network_id: string;
32
51
  token_type: string;
33
- }
34
- interface SdkSellerOrganizationSummary {
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 {
35
60
  id: string;
36
61
  legal_name: string;
37
62
  display_name: string | null;
38
63
  jurisdiction: string;
39
64
  website: string | null;
65
+ logo_url: string | null;
40
66
  }
41
67
  interface SdkBookSummary {
42
68
  id: string;
@@ -48,8 +74,8 @@ interface SdkBookSummary {
48
74
  prospectus_file_url: string;
49
75
  }
50
76
  interface SdkAssetRecord {
51
- security: SdkSecuritySummary;
52
- seller_organization: SdkSellerOrganizationSummary;
77
+ security: SdkSecurityDetails;
78
+ issuer: SdkIssuerSummary;
53
79
  books: SdkBookSummary[];
54
80
  network: NetworkDetails;
55
81
  }
@@ -63,6 +89,7 @@ interface SdkAssetResponse {
63
89
  interface SereelSdkClient {
64
90
  getAssets(): Promise<SdkAssetsResponse>;
65
91
  getAssetByTokenAddress(tokenAddress: string): Promise<SdkAssetResponse>;
92
+ getAssetsByIssuer(issuerId: string): Promise<SdkAssetsResponse>;
66
93
  }
67
94
 
68
95
  declare function createClient(config: ClientConfig): SereelSdkClient;
@@ -97,4 +124,4 @@ declare class TimeoutError extends SereelSdkError {
97
124
  declare class MalformedResponseError extends SereelSdkError {
98
125
  }
99
126
 
100
- export { type ClientConfig, ENVIRONMENT_BASE_URLS, HttpError, InvalidConfigurationError, MalformedResponseError, type NativeCurrency, type NetworkDetails, NotFoundError, type SdkAssetRecord, type SdkAssetResponse, type SdkAssetsResponse, type SdkBookSummary, type SdkSecuritySummary, type SdkSellerOrganizationSummary, type SereelEnvironment, type SereelSdkClient, SereelSdkError, ServerError, TimeoutError, UnauthorizedError, createClient, resolveBaseUrl };
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
@@ -23,20 +23,46 @@ interface NetworkDetails {
23
23
  is_testnet: boolean;
24
24
  is_supported: boolean;
25
25
  }
26
- interface SdkSecuritySummary {
27
- id: string;
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 {
28
46
  token_address: string;
29
47
  token_name: string;
30
48
  token_symbol: string;
49
+ token_decimal: string;
31
50
  network_id: string;
32
51
  token_type: string;
33
- }
34
- interface SdkSellerOrganizationSummary {
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 {
35
60
  id: string;
36
61
  legal_name: string;
37
62
  display_name: string | null;
38
63
  jurisdiction: string;
39
64
  website: string | null;
65
+ logo_url: string | null;
40
66
  }
41
67
  interface SdkBookSummary {
42
68
  id: string;
@@ -48,8 +74,8 @@ interface SdkBookSummary {
48
74
  prospectus_file_url: string;
49
75
  }
50
76
  interface SdkAssetRecord {
51
- security: SdkSecuritySummary;
52
- seller_organization: SdkSellerOrganizationSummary;
77
+ security: SdkSecurityDetails;
78
+ issuer: SdkIssuerSummary;
53
79
  books: SdkBookSummary[];
54
80
  network: NetworkDetails;
55
81
  }
@@ -63,6 +89,7 @@ interface SdkAssetResponse {
63
89
  interface SereelSdkClient {
64
90
  getAssets(): Promise<SdkAssetsResponse>;
65
91
  getAssetByTokenAddress(tokenAddress: string): Promise<SdkAssetResponse>;
92
+ getAssetsByIssuer(issuerId: string): Promise<SdkAssetsResponse>;
66
93
  }
67
94
 
68
95
  declare function createClient(config: ClientConfig): SereelSdkClient;
@@ -97,4 +124,4 @@ declare class TimeoutError extends SereelSdkError {
97
124
  declare class MalformedResponseError extends SereelSdkError {
98
125
  }
99
126
 
100
- export { type ClientConfig, ENVIRONMENT_BASE_URLS, HttpError, InvalidConfigurationError, MalformedResponseError, type NativeCurrency, type NetworkDetails, NotFoundError, type SdkAssetRecord, type SdkAssetResponse, type SdkAssetsResponse, type SdkBookSummary, type SdkSecuritySummary, type SdkSellerOrganizationSummary, type SereelEnvironment, type SereelSdkClient, SereelSdkError, ServerError, TimeoutError, UnauthorizedError, createClient, resolveBaseUrl };
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
@@ -176,15 +176,42 @@ function isNullableString(value) {
176
176
  function isFiniteNumber(value) {
177
177
  return typeof value === "number" && Number.isFinite(value);
178
178
  }
179
- function isSecuritySummary(value) {
180
- return isRecord(value) && isString(value.id) && isString(value.token_address) && isString(value.token_name) && isString(value.token_symbol) && isString(value.network_id) && isString(value.token_type);
181
- }
182
- function isSellerOrganizationSummary(value) {
183
- return isRecord(value) && isString(value.id) && isString(value.legal_name) && isNullableString(value.display_name) && isString(value.jurisdiction) && isNullableString(value.website);
184
- }
185
179
  function isBoolean(value) {
186
180
  return typeof value === "boolean";
187
181
  }
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
+ }
188
215
  function isNativeCurrency(value) {
189
216
  return isRecord(value) && isString(value.symbol) && isString(value.name) && isFiniteNumber(value.decimals);
190
217
  }
@@ -195,7 +222,7 @@ function isBookSummary(value) {
195
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);
196
223
  }
197
224
  function isAssetRecord(value) {
198
- return isRecord(value) && isSecuritySummary(value.security) && isSellerOrganizationSummary(value.seller_organization) && Array.isArray(value.books) && value.books.every(isBookSummary) && isNetworkDetails(value.network);
225
+ return isRecord(value) && isSecurityDetails(value.security) && isIssuerSummary(value.issuer) && Array.isArray(value.books) && value.books.every(isBookSummary) && isNetworkDetails(value.network);
199
226
  }
200
227
  function validateSdkAssetsResponse(value) {
201
228
  if (!isRecord(value) || !Array.isArray(value.data) || !isFiniteNumber(value.count) || !value.data.every(isAssetRecord)) {
@@ -235,6 +262,17 @@ function createClient(config) {
235
262
  `/sdk/assets/${encodeURIComponent(trimmedTokenAddress)}`,
236
263
  validateSdkAssetResponse
237
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
+ );
238
276
  }
239
277
  };
240
278
  }
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 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 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 isBoolean(value: unknown): value is boolean {\n return typeof value === \"boolean\";\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 isSecuritySummary(value.security) &&\n isSellerOrganizationSummary(value.seller_organization) &&\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}\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,6 +1,6 @@
1
1
  {
2
2
  "name": "@sereel/sdk",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "TypeScript SDK for Sereel asset read endpoints",
5
5
  "license": "MIT",
6
6
  "type": "module",