@parity/product-sdk-host 0.12.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,49 @@
1
+ import { isCorrectEnvironment as isCorrectEnvironment$1, getClientSync as getClientSync$1 } from '@parity/truapi/sandbox';
2
+
3
+ // src/transport.ts
4
+ var clientOverride = null;
5
+ function isProductionBuild() {
6
+ try {
7
+ return process.env.NODE_ENV === "production";
8
+ } catch {
9
+ return false;
10
+ }
11
+ }
12
+ function setTruApiClient(client) {
13
+ if (client !== null && isProductionBuild()) {
14
+ console.warn(
15
+ "[product-sdk] setTruApiClient() was called in a production build. This is a test-only seam from @parity/product-sdk-host/testing; a leaked import will silently reroute all host access to the injected client."
16
+ );
17
+ }
18
+ clientOverride = client;
19
+ }
20
+ function getClientSync() {
21
+ return clientOverride ?? getClientSync$1();
22
+ }
23
+ function isCorrectEnvironment() {
24
+ return clientOverride !== null || isCorrectEnvironment$1();
25
+ }
26
+ async function getClient() {
27
+ return getClientSync();
28
+ }
29
+ function subscribeWithInterrupt(observable, onNext) {
30
+ let interruptCallback;
31
+ const sub = observable.subscribe({
32
+ next: onNext,
33
+ error: (reason) => interruptCallback?.(reason),
34
+ complete: () => interruptCallback?.()
35
+ });
36
+ return {
37
+ unsubscribe: () => sub.unsubscribe(),
38
+ onInterrupt: (callback) => {
39
+ interruptCallback = callback;
40
+ return () => {
41
+ if (interruptCallback === callback) interruptCallback = void 0;
42
+ };
43
+ }
44
+ };
45
+ }
46
+
47
+ export { getClient, isCorrectEnvironment, setTruApiClient, subscribeWithInterrupt };
48
+ //# sourceMappingURL=chunk-3SWF5CWC.js.map
49
+ //# sourceMappingURL=chunk-3SWF5CWC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/transport.ts"],"names":["sandboxGetClientSync","sandboxIsCorrectEnvironment"],"mappings":";;;AAyBA,IAAI,cAAA,GAAsC,IAAA;AAE1C,SAAS,iBAAA,GAA6B;AAClC,EAAA,IAAI;AAIA,IAAA,OAAO,OAAA,CAAQ,IAAI,QAAA,KAAa,YAAA;AAAA,EACpC,CAAA,CAAA,MAAQ;AAEJ,IAAA,OAAO,KAAA;AAAA,EACX;AACJ;AAYO,SAAS,gBAAgB,MAAA,EAAmC;AAC/D,EAAA,IAAI,MAAA,KAAW,IAAA,IAAQ,iBAAA,EAAkB,EAAG;AACxC,IAAA,OAAA,CAAQ,IAAA;AAAA,MACJ;AAAA,KACJ;AAAA,EACJ;AACA,EAAA,cAAA,GAAiB,MAAA;AACrB;AAMO,SAAS,aAAA,GAAqC;AACjD,EAAA,OAAO,kBAAkBA,eAAA,EAAqB;AAClD;AAMO,SAAS,oBAAA,GAAgC;AAC5C,EAAA,OAAO,cAAA,KAAmB,QAAQC,sBAAA,EAA4B;AAClE;AAMA,eAAsB,SAAA,GAA0C;AAC5D,EAAA,OAAO,aAAA,EAAc;AACzB;AAUO,SAAS,sBAAA,CACZ,YACA,MAAA,EACgB;AAChB,EAAA,IAAI,iBAAA;AACJ,EAAA,MAAM,GAAA,GAAM,WAAW,SAAA,CAAU;AAAA,IAC7B,IAAA,EAAM,MAAA;AAAA,IACN,KAAA,EAAO,CAAC,MAAA,KAAW,iBAAA,GAAoB,MAAM,CAAA;AAAA,IAC7C,QAAA,EAAU,MAAM,iBAAA;AAAoB,GACvC,CAAA;AACD,EAAA,OAAO;AAAA,IACH,WAAA,EAAa,MAAM,GAAA,CAAI,WAAA,EAAY;AAAA,IACnC,WAAA,EAAa,CAAC,QAAA,KAAa;AACvB,MAAA,iBAAA,GAAoB,QAAA;AACpB,MAAA,OAAO,MAAM;AACT,QAAA,IAAI,iBAAA,KAAsB,UAAU,iBAAA,GAAoB,MAAA;AAAA,MAC5D,CAAA;AAAA,IACJ;AAAA,GACJ;AACJ","file":"chunk-3SWF5CWC.js","sourcesContent":["// Copyright 2026 Parity Technologies (UK) Ltd.\n// SPDX-License-Identifier: Apache-2.0\n/**\n * Access to the in-house TruAPI client (`@parity/truapi`) for the host package.\n *\n * Environment detection and the lazily-built, cached client come from\n * `@parity/truapi/sandbox`; this module layers the product-sdk-specific glue on\n * top — an async {@link getClient} accessor and {@link subscribeWithInterrupt},\n * which adapts a truapi stream into the host's {@link HostSubscription} shape.\n *\n * @module\n */\n\nimport type { ObservableLike, TrUApiClient } from \"@parity/truapi\";\nimport {\n getClientSync as sandboxGetClientSync,\n isCorrectEnvironment as sandboxIsCorrectEnvironment,\n} from \"@parity/truapi/sandbox\";\n\nimport type { HostSubscription } from \"./types.js\";\n\n// Test-only override. When set — via `setTruApiClient`, exposed through\n// `@parity/product-sdk-host/testing` — every host accessor resolves this client\n// instead of the sandbox one. `null` in production, so the branches below are\n// no-ops there.\nlet clientOverride: TrUApiClient | null = null;\n\nfunction isProductionBuild(): boolean {\n try {\n // Must stay a plain `process.env.NODE_ENV` member expression: bundlers\n // (Vite, esbuild, webpack) substitute it textually, which is how this\n // check works in browser builds where `process` doesn't exist.\n return process.env.NODE_ENV === \"production\";\n } catch {\n // No `process` and no bundler define — can't tell, stay quiet.\n return false;\n }\n}\n\n/**\n * Test-only seam: force {@link getClient} / {@link getClientSync} to return\n * `client`, and {@link isCorrectEnvironment} to report `true`. Pass `null` to\n * restore normal detection. Exposed through `@parity/product-sdk-host/testing`,\n * not the package's main entry.\n *\n * Calling this in a production build silently reroutes every host accessor to\n * the injected client, so we warn — it almost always means a `/testing` import\n * leaked into a production path.\n */\nexport function setTruApiClient(client: TrUApiClient | null): void {\n if (client !== null && isProductionBuild()) {\n console.warn(\n \"[product-sdk] setTruApiClient() was called in a production build. This is a test-only seam from @parity/product-sdk-host/testing; a leaked import will silently reroute all host access to the injected client.\",\n );\n }\n clientOverride = client;\n}\n\n/**\n * Synchronous TruAPI client accessor. Returns the injected test client when one\n * is set, otherwise the sandbox client (`null` outside a host container).\n */\nexport function getClientSync(): TrUApiClient | null {\n return clientOverride ?? sandboxGetClientSync();\n}\n\n/**\n * Host-container detection. `true` when a test client is injected, otherwise the\n * sandbox heuristic (iframe / webview marker / injected message port).\n */\nexport function isCorrectEnvironment(): boolean {\n return clientOverride !== null || sandboxIsCorrectEnvironment();\n}\n\n/**\n * Get the TruAPI client. Returns `null` outside a host container. Async wrapper\n * over {@link getClientSync} for the host wrappers that already `await` it.\n */\nexport async function getClient(): Promise<TrUApiClient | null> {\n return getClientSync();\n}\n\n/**\n * Adapt a truapi `ObservableLike` stream into the host's callback-style\n * {@link HostSubscription} (`unsubscribe` + `onInterrupt`). `onNext` fires for\n * each item; the registered `onInterrupt` callback fires when the host ends the\n * subscription server-side — which the generated client surfaces as either\n * `complete` (a host interrupt frame) or `error` (transport close). Shared by\n * the statement-store and preimage adapters, which both expose this shape.\n */\nexport function subscribeWithInterrupt<Item, Reason = never>(\n observable: ObservableLike<Item, Reason>,\n onNext: (item: Item) => void,\n): HostSubscription {\n let interruptCallback: ((reason?: unknown) => void) | undefined;\n const sub = observable.subscribe({\n next: onNext,\n error: (reason) => interruptCallback?.(reason),\n complete: () => interruptCallback?.(),\n });\n return {\n unsubscribe: () => sub.unsubscribe(),\n onInterrupt: (callback) => {\n interruptCallback = callback;\n return () => {\n if (interruptCallback === callback) interruptCallback = undefined;\n };\n },\n };\n}\n\nif (import.meta.vitest) {\n const { test, expect, afterEach } = import.meta.vitest;\n\n afterEach(() => setTruApiClient(null));\n\n // Environment detection and client building are covered by `@parity/truapi`'s\n // own sandbox tests; here we only assert the local glue degrades outside a\n // host container.\n test(\"getClientSync returns null outside a container\", () => {\n expect(getClientSync()).toBeNull();\n });\n\n test(\"getClient resolves null outside a container\", async () => {\n expect(await getClient()).toBeNull();\n });\n\n test(\"setTruApiClient overrides the client and container detection\", async () => {\n const fake = {} as TrUApiClient;\n setTruApiClient(fake);\n expect(getClientSync()).toBe(fake);\n expect(await getClient()).toBe(fake);\n expect(isCorrectEnvironment()).toBe(true);\n\n setTruApiClient(null);\n expect(getClientSync()).toBeNull();\n expect(isCorrectEnvironment()).toBe(false);\n });\n\n test(\"setTruApiClient warns when injecting in a production build\", () => {\n const original = process.env.NODE_ENV;\n const warnings: string[] = [];\n const realWarn = console.warn;\n console.warn = (...args: unknown[]) => void warnings.push(String(args[0]));\n try {\n process.env.NODE_ENV = \"production\";\n setTruApiClient({} as TrUApiClient);\n expect(warnings).toHaveLength(1);\n expect(warnings[0]).toContain(\"production build\");\n\n // Clearing the override must not warn.\n setTruApiClient(null);\n expect(warnings).toHaveLength(1);\n } finally {\n console.warn = realWarn;\n process.env.NODE_ENV = original;\n }\n });\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -1,8 +1,12 @@
1
1
  import { JsonRpcProvider, PolkadotSigner } from 'polkadot-api';
2
- import { Topic, RemoteStatementStoreSubscribeItem, Statement, StatementProof, SignedStatement, HexString, GenericError, TrUApiClient, AllocatableResource, AllocationOutcome, HostGetUserIdError, HostRequestLoginResponse, HostRequestLoginError, ProductAccountId, ProductAccount as ProductAccount$1, HostAccountGetError, HostAccountGetAliasResponse, LegacyAccount, RingLocation, HostAccountCreateProofError, HostAccountConnectionStatusSubscribeItem, HostDevicePermissionRequest, RemotePermission, HostThemeSubscribeItem, ChatBotRegistrationStatus, HostChatCreateRoomRequest, ChatRoomRegistrationStatus, HostChatRegisterBotRequest, ChatMessageContent, ChatRoom, HostChatActionSubscribeItem, HostPaymentBalanceSubscribeItem, PaymentPurseId, Balance, PaymentTopUpSource, HostPaymentStatusSubscribeItem, HostPushNotificationRequest, NotificationId } from '@parity/truapi';
3
- export { AllocatableResource, AllocationOutcome, ChatMessageContent, ChatRoom, HexString, HostPaymentBalanceSubscribeItem, HostPaymentStatusSubscribeItem, NotificationId, PaymentTopUpSource, ProductAccountId, HostPushNotificationError as PushNotificationError, RemotePermission, RingLocation, SignedStatement, Statement, StatementProof, ThemeName, ThemeVariant, Topic } from '@parity/truapi';
2
+ import { Topic, RemoteStatementStoreSubscribeItem, Statement, StatementProof, SignedStatement, HexString, scale, TrUApiClient, AllocatableResource, AllocationOutcome, VersionedHostGetUserIdError, HostRequestLoginResponse, VersionedHostRequestLoginError, ProductAccountId, ProductAccount as ProductAccount$1, VersionedHostAccountGetError, ProductProofContext, RingLocation, ContextualAlias as ContextualAlias$1, VersionedHostAccountGetAliasError, LegacyAccount, VersionedHostGetLegacyAccountsError, HostAccountCreateProofResponse, VersionedHostAccountCreateProofError, HostAccountConnectionStatusSubscribeItem, HostDevicePermissionRequest, RemotePermission, HostThemeSubscribeItem, ChatBotRegistrationStatus, HostChatCreateRoomRequest, ChatRoomRegistrationStatus, HostChatRegisterBotRequest, ChatMessageContent, ChatRoom, HostChatActionSubscribeItem, HostPaymentBalanceSubscribeItem, CoinPaymentPurseId, Balance, PaymentTopUpSource, HostPaymentStatusSubscribeItem, HostPushNotificationRequest, NotificationId } from '@parity/truapi';
3
+ export { AllocatableResource, AllocationOutcome, ChatMessageContent, ChatRoom, HexString, HostPaymentBalanceSubscribeItem, HostPaymentStatusSubscribeItem, NotificationId, PaymentTopUpSource, ProductAccountId, ProductProofContext, HostPushNotificationError as PushNotificationError, RemotePermission, RingLocation, SignedStatement, Statement, StatementProof, ThemeName, ThemeVariant, Topic } from '@parity/truapi';
4
+ import { SdkError } from '@parity/product-sdk-errors';
5
+ export { SdkError, isSdkError } from '@parity/product-sdk-errors';
6
+ import { Result } from '@parity/result';
7
+ export { Result, err, ok } from '@parity/result';
4
8
  import { ResultAsync as ResultAsync$1 } from 'neverthrow';
5
- export { isCorrectEnvironment as isInsideContainerSync } from '@parity/truapi/sandbox';
9
+ export { i as isInsideContainerSync } from './transport-B0cdhwrp.js';
6
10
 
7
11
  /**
8
12
  * Public types for the host wrappers.
@@ -152,13 +156,13 @@ declare function getStatementStore(): Promise<HostStatementStore | null>;
152
156
  * chain-specific endpoints used by multiple packages.
153
157
  */
154
158
  /**
155
- * Bulletin Chain RPC endpoints per network environment. `paseo` and `summit`
156
- * are populated today; `polkadot` and `kusama` are reserved for when those
157
- * Bulletin deployments go live.
159
+ * Bulletin Chain RPC endpoints per network environment. `paseo` (Paseo Next v2)
160
+ * and `devnet` (public Paseo testnet) are populated today; `polkadot` and
161
+ * `kusama` are reserved for when those Bulletin deployments go live.
158
162
  */
159
163
  declare const BULLETIN_RPCS: {
160
164
  readonly paseo: readonly ["wss://paseo-bulletin-next-rpc.polkadot.io"];
161
- readonly summit: readonly ["wss://summit-bulletin-rpc.polkadot.io"];
165
+ readonly devnet: readonly ["wss://bulletin-paseo.tservices.es:8443"];
162
166
  readonly polkadot: string[];
163
167
  readonly kusama: string[];
164
168
  };
@@ -184,34 +188,25 @@ declare const DEFAULT_BULLETIN_ENDPOINT: string;
184
188
  */
185
189
 
186
190
  /**
187
- * The structured error payload `@parity/truapi` surfaces on the `Err` channel of
188
- * a host call, once unwrapped from the versioned wire envelope. Every host error
189
- * union is built from these:
190
- *
191
- * - the catch-all {@link GenericError} (`{ reason }`),
192
- * - a unit tagged variant (`{ tag }`), or
193
- * - a tagged variant carrying a reason (`{ tag, value: { reason } }`).
194
- *
195
- * `GenericError` is imported from `@parity/truapi`; the `{ tag }` members are a
196
- * deliberate widening of truapi's per-domain named variants (the formatter is
197
- * tag-agnostic). truapi has no umbrella error union to import today — once it
198
- * exports a canonical tagged-error union from codegen, replace these local
199
- * members with that import so the type is protocol-sourced rather than
200
- * hand-widened.
201
- *
202
- * This is the *payload* the host public API carries inside a
203
- * {@link HostCallFailedError} on the `err` channel of its `Result` returns — not
204
- * the error type consumers branch on.
191
+ * What a `Domain`-tagged call error carries. Widened from truapi's per-domain
192
+ * `Versioned*Error` types (all `{ tag: "V1", value: <domain error> }` today)
193
+ * so one payload type covers every call.
205
194
  */
206
- type HostErrorPayload = GenericError | {
195
+ type VersionedDomainError = {
207
196
  tag: string;
208
- value?: undefined;
209
- } | {
210
- tag: string;
211
- value: {
212
- reason: string;
213
- };
197
+ value?: unknown;
214
198
  };
199
+ /**
200
+ * The error a host call puts on its `Err` channel — truapi's canonical
201
+ * {@link scale.CallErrorValue} envelope. `Denied` / `Unsupported` /
202
+ * `MalformedFrame` / `HostFailure` are transport-level failures; `Domain`
203
+ * wraps the actual per-domain error in a versioned envelope, which
204
+ * {@link formatHostError} digs through when rendering.
205
+ *
206
+ * This is the payload {@link HostCallFailedError} carries — not the error
207
+ * type consumers branch on.
208
+ */
209
+ type HostErrorPayload = scale.CallErrorValue<VersionedDomainError>;
215
210
  /**
216
211
  * Extract a human-readable message from a host-side error.
217
212
  *
@@ -226,9 +221,12 @@ type HostErrorPayload = GenericError | {
226
221
  declare function formatHostError(error: unknown): string;
227
222
  /**
228
223
  * Base class for all host errors. Use `instanceof HostError` (or {@link isHostError})
229
- * to catch any host-related failure.
224
+ * to catch any host-related failure. Implements the cross-package
225
+ * {@link SdkError} marker so `isSdkError(e)` also recognizes it.
230
226
  */
231
- declare class HostError extends Error {
227
+ declare class HostError extends Error implements SdkError {
228
+ readonly isSdkError: true;
229
+ readonly source = "host";
232
230
  constructor(message: string, options?: ErrorOptions);
233
231
  }
234
232
  /**
@@ -252,36 +250,6 @@ declare class HostCallFailedError extends HostError {
252
250
  /** Check whether a value is any {@link HostError}. */
253
251
  declare function isHostError(error: unknown): error is HostError;
254
252
 
255
- /**
256
- * A lightweight tagged `Result` type for the host public API.
257
- *
258
- * Host functions return `Promise<Result<T, HostError>>` rather than throwing, so
259
- * consumers get typed errors on the `err` channel instead of opaque thrown
260
- * `Error`s. The shape is intentionally identical to the one
261
- * `@parity/product-sdk-signer` exposes (`{ ok: true; value } | { ok: false; error }`),
262
- * so the two layers compose with no adapter — host's `Result` flows straight into
263
- * the signer's pattern matching.
264
- *
265
- * NOTE: host owns its own copy because the dependency edge runs `signer → host`,
266
- * so host cannot import the signer's definition. If a third package ever needs
267
- * this shape, extract it into a shared `@parity/product-sdk-result` package and
268
- * have both depend on that instead of duplicating.
269
- *
270
- * @module
271
- */
272
- /** A value that is either a success (`ok`) carrying `T`, or a failure (`err`) carrying `E`. */
273
- type Result<T, E> = {
274
- ok: true;
275
- value: T;
276
- } | {
277
- ok: false;
278
- error: E;
279
- };
280
- /** Create a successful {@link Result}. */
281
- declare function ok<T>(value: T): Result<T, never>;
282
- /** Create a failed {@link Result}. */
283
- declare function err<E>(error: E): Result<never, E>;
284
-
285
253
  /**
286
254
  * TruAPI - the protocol for communicating between apps and the Polkadot host container.
287
255
  *
@@ -448,10 +416,24 @@ type ProductAccount = ProductAccountId & Omit<ProductAccount$1, "publicKey"> & {
448
416
  *
449
417
  * Proves account membership in a ring without revealing which account.
450
418
  *
451
- * Derived from `@parity/truapi`'s alias response, with both fields decoded to bytes.
419
+ * Derived from `@parity/truapi`'s `ContextualAlias`, with both fields decoded to bytes.
452
420
  */
453
421
  type ContextualAlias = {
454
- [K in keyof HostAccountGetAliasResponse]: Uint8Array;
422
+ [K in keyof ContextualAlias$1]: Uint8Array;
423
+ };
424
+ /**
425
+ * A Ring VRF proof plus the values needed to verify it downstream (e.g.
426
+ * against a precompile): the alias it commits to, and the ring member index /
427
+ * revision the proof was generated against.
428
+ *
429
+ * Derived from `@parity/truapi`'s `HostAccountCreateProofResponse`, with the
430
+ * byte fields decoded.
431
+ */
432
+ type RingVRFProof = Omit<HostAccountCreateProofResponse, "proof" | "contextualAlias"> & {
433
+ /** Raw ring VRF proof bytes. */
434
+ proof: Uint8Array;
435
+ /** Alias derived for the request's context. */
436
+ contextualAlias: ContextualAlias;
455
437
  };
456
438
  /**
457
439
  * Accounts provider handle, backed by `truApi.account.*` / `truApi.signing.*`.
@@ -459,17 +441,28 @@ type ContextualAlias = {
459
441
  * user identity, connection status, and `PolkadotSigner` factories.
460
442
  *
461
443
  * Lookup methods return a neverthrow `ResultAsync` (use `.match(ok, err)`);
462
- * the signer factories return a synchronous PAPI `PolkadotSigner`.
444
+ * the signer factories return a synchronous PAPI `PolkadotSigner`. The `err`
445
+ * channel carries truapi's canonical `CallErrorValue` envelope around the
446
+ * per-call versioned domain error, exactly as the generated client returns it.
463
447
  */
464
448
  interface AccountsProvider {
465
449
  getUserId(): ResultAsync$1<{
466
450
  primaryUsername: string;
467
- }, HostGetUserIdError>;
468
- requestLogin(reason?: string): ResultAsync$1<HostRequestLoginResponse, HostRequestLoginError>;
469
- getProductAccount(dotNsIdentifier: string, derivationIndex?: number): ResultAsync$1<ProductAccount, HostAccountGetError>;
470
- getProductAccountAlias(dotNsIdentifier: string, derivationIndex?: number): ResultAsync$1<ContextualAlias, HostAccountGetError>;
471
- getLegacyAccounts(): ResultAsync$1<HostAccount[], HostAccountGetError>;
472
- createRingVRFProof(dotNsIdentifier: string, derivationIndex: number, location: RingLocation, message: Uint8Array): ResultAsync$1<Uint8Array, HostAccountCreateProofError>;
451
+ }, scale.CallErrorValue<VersionedHostGetUserIdError>>;
452
+ requestLogin(reason?: string): ResultAsync$1<HostRequestLoginResponse, scale.CallErrorValue<VersionedHostRequestLoginError>>;
453
+ getProductAccount(dotNsIdentifier: string, derivationIndex?: number): ResultAsync$1<ProductAccount, scale.CallErrorValue<VersionedHostAccountGetError>>;
454
+ /**
455
+ * Derive the contextual alias for a proof context and ring. The host
456
+ * selects the member key within the ring no per-account addressing.
457
+ */
458
+ getProductAccountAlias(context: ProductProofContext, location: RingLocation): ResultAsync$1<ContextualAlias, scale.CallErrorValue<VersionedHostAccountGetAliasError>>;
459
+ getLegacyAccounts(): ResultAsync$1<HostAccount[], scale.CallErrorValue<VersionedHostGetLegacyAccountsError>>;
460
+ /**
461
+ * Generate a Ring VRF proof binding `message` to the product-scoped
462
+ * `context`. The host selects the member key within the ring; the result
463
+ * carries the proof plus its verification values ({@link RingVRFProof}).
464
+ */
465
+ createRingVRFProof(context: ProductProofContext, location: RingLocation, message: Uint8Array): ResultAsync$1<RingVRFProof, scale.CallErrorValue<VersionedHostAccountCreateProofError>>;
473
466
  /**
474
467
  * Build a `PolkadotSigner` for a product account. Signing routes through the
475
468
  * host's `createTransaction` path: the host decodes the metadata and forwards
@@ -691,9 +684,10 @@ declare function getChatManager(): Promise<ChatManager | null>;
691
684
  * `truApi.payment.*`.
692
685
  *
693
686
  * Exposes balance subscription, top-up, payment requests, and payment-status
694
- * subscription. Distinct from the CoinPayment / merchant-payments surface
695
- * (RFC-0017): RFC-0006 is the user-initiated balance / top-up / payment-request
696
- * flow.
687
+ * subscription. The flow is distinct from the CoinPayment / merchant-payments
688
+ * surface (RFC-0017) RFC-0006 is the user-initiated balance / top-up /
689
+ * payment-request flow — but both operate on the same CoinPayment purses,
690
+ * hence the shared `CoinPaymentPurseId` (omitted = the main purse).
697
691
  *
698
692
  * @module
699
693
  */
@@ -707,9 +701,9 @@ declare function getChatManager(): Promise<ChatManager | null>;
707
701
  * `PaymentTopUpSource` — used directly rather than re-aliased.
708
702
  */
709
703
  interface PaymentManager {
710
- subscribeBalance(callback: (balance: HostPaymentBalanceSubscribeItem) => void, purse?: PaymentPurseId): HostSubscription;
711
- topUp(amount: Balance, source: PaymentTopUpSource, into?: PaymentPurseId): Promise<void>;
712
- requestPayment(amount: Balance, destination: HexString, from?: PaymentPurseId): Promise<{
704
+ subscribeBalance(callback: (balance: HostPaymentBalanceSubscribeItem) => void, purse?: CoinPaymentPurseId): HostSubscription;
705
+ topUp(amount: Balance, source: PaymentTopUpSource, into?: CoinPaymentPurseId): Promise<void>;
706
+ requestPayment(amount: Balance, destination: HexString, from?: CoinPaymentPurseId): Promise<{
713
707
  id: string;
714
708
  }>;
715
709
  subscribePaymentStatus(paymentId: string, callback: (status: HostPaymentStatusSubscribeItem) => void): HostSubscription;
@@ -1020,4 +1014,4 @@ declare function broadcastTransaction(genesisHash: HexString, transaction: HexSt
1020
1014
  */
1021
1015
  declare function stopTransaction(genesisHash: HexString, operationId: string): Promise<Result<void, HostError>>;
1022
1016
 
1023
- export { type AccountsProvider, BULLETIN_RPCS, ChainNotSupportedError, type ChainProperties, type ChainSpec, type ChatBotRegistrationResult, type ChatManager, type ChatReceivedAction, type ChatRoomRegistrationResult, type ContextualAlias, DEFAULT_BULLETIN_ENDPOINT, type DevicePermissionKind, type Feature, type HostAccount, HostCallFailedError, HostError, type HostErrorPayload, type HostLocalStorage, type HostStatementStore, type HostSubscription, HostUnavailableError, type NotificationManager, type PaymentManager, type PreimageManager, type ProductAccount, type PushNotificationInput, type RemotePermissionItem, type Result, type ResultAsync, type StatementTopicFilter, type StatementsPage, type ThemeMode, type ThemeProvider, type TruApi, broadcastTransaction, createHostLocalStorage, createHostPreimageManager, createProofAuthorized, deriveEntropy, err, featureSupported, formatHostError, fromHex, getAccountsProvider, getChainSpec, getChatManager, getHostLocalStorage, getHostProvider, getNotificationManager, getPaymentManager, getPreimageManager, getStatementStore, getThemeProvider, getTruApi, isChainSupported, isHostError, isInsideContainer, navigateTo, ok, requestDevicePermission, requestPermission, requestResourceAllocation, stopTransaction, toHex };
1017
+ export { type AccountsProvider, BULLETIN_RPCS, ChainNotSupportedError, type ChainProperties, type ChainSpec, type ChatBotRegistrationResult, type ChatManager, type ChatReceivedAction, type ChatRoomRegistrationResult, type ContextualAlias, DEFAULT_BULLETIN_ENDPOINT, type DevicePermissionKind, type Feature, type HostAccount, HostCallFailedError, HostError, type HostErrorPayload, type HostLocalStorage, type HostStatementStore, type HostSubscription, HostUnavailableError, type NotificationManager, type PaymentManager, type PreimageManager, type ProductAccount, type PushNotificationInput, type RemotePermissionItem, type ResultAsync, type RingVRFProof, type StatementTopicFilter, type StatementsPage, type ThemeMode, type ThemeProvider, type TruApi, broadcastTransaction, createHostLocalStorage, createHostPreimageManager, createProofAuthorized, deriveEntropy, featureSupported, formatHostError, fromHex, getAccountsProvider, getChainSpec, getChatManager, getHostLocalStorage, getHostProvider, getNotificationManager, getPaymentManager, getPreimageManager, getStatementStore, getThemeProvider, getTruApi, isChainSupported, isHostError, isInsideContainer, navigateTo, requestDevicePermission, requestPermission, requestResourceAllocation, stopTransaction, toHex };
package/dist/index.js CHANGED
@@ -1,26 +1,33 @@
1
+ import { getClient, isCorrectEnvironment, subscribeWithInterrupt } from './chunk-3SWF5CWC.js';
2
+ export { isCorrectEnvironment as isInsideContainerSync } from './chunk-3SWF5CWC.js';
1
3
  import { createLogger } from '@parity/product-sdk-logger';
2
- import { isCorrectEnvironment, getClientSync } from '@parity/truapi/sandbox';
3
- export { isCorrectEnvironment as isInsideContainerSync } from '@parity/truapi/sandbox';
4
4
  import { scale } from '@parity/truapi';
5
+ import { err, ok } from '@parity/result';
6
+ export { err, ok } from '@parity/result';
7
+ export { isSdkError } from '@parity/product-sdk-errors';
5
8
  import { unifyMetadata, decAnyMetadata } from '@polkadot-api/substrate-bindings';
6
9
  import { AccountId } from 'polkadot-api';
7
10
 
8
11
  // src/errors.ts
9
- function isHostErrorPayload(error) {
10
- if (error == null || typeof error !== "object") return false;
11
- const obj = error;
12
- return typeof obj.reason === "string" || typeof obj.tag === "string";
12
+ function isTagged(value) {
13
+ return value != null && typeof value === "object" && typeof value.tag === "string";
14
+ }
15
+ function hasReason(value) {
16
+ return value != null && typeof value === "object" && typeof value.reason === "string";
13
17
  }
14
18
  function formatHostError(error) {
15
19
  if (error instanceof Error) return error.message;
16
20
  if (typeof error === "string") return error;
17
- if (isHostErrorPayload(error)) {
18
- if ("tag" in error) {
19
- if (error.value != null && typeof error.value.reason === "string") {
20
- return `${error.tag}: ${error.value.reason}`;
21
- }
22
- return error.tag;
21
+ if (isTagged(error)) {
22
+ if (error.tag === "Domain" && isTagged(error.value) && error.value.value !== void 0) {
23
+ return formatHostError(error.value.value);
24
+ }
25
+ if (hasReason(error.value)) {
26
+ return `${error.tag}: ${error.value.reason}`;
23
27
  }
28
+ return error.tag;
29
+ }
30
+ if (hasReason(error)) {
24
31
  return error.reason;
25
32
  }
26
33
  if (error != null && typeof error === "object" && "message" in error) {
@@ -34,6 +41,8 @@ function formatHostError(error) {
34
41
  }
35
42
  }
36
43
  var HostError = class extends Error {
44
+ isSdkError = true;
45
+ source = "host";
37
46
  constructor(message, options) {
38
47
  super(message, options);
39
48
  this.name = "HostError";
@@ -56,28 +65,6 @@ var HostCallFailedError = class extends HostError {
56
65
  function isHostError(error) {
57
66
  return error instanceof HostError;
58
67
  }
59
- async function getClient() {
60
- return getClientSync();
61
- }
62
- function subscribeWithInterrupt(observable, onNext) {
63
- let interruptCallback;
64
- const sub = observable.subscribe({
65
- next: onNext,
66
- error: (reason) => interruptCallback?.(reason),
67
- complete: () => interruptCallback?.()
68
- });
69
- return {
70
- unsubscribe: () => sub.unsubscribe(),
71
- onInterrupt: (callback) => {
72
- interruptCallback = callback;
73
- return () => {
74
- if (interruptCallback === callback) interruptCallback = void 0;
75
- };
76
- }
77
- };
78
- }
79
-
80
- // src/papi-provider.ts
81
68
  var log = createLogger("host:papi");
82
69
  var JSON_RPC_INTERNAL_ERROR = -32603;
83
70
  var JSON_RPC_METHOD_NOT_FOUND = -32601;
@@ -395,14 +382,6 @@ function createHostPapiProvider(client, genesisHash) {
395
382
  };
396
383
  }
397
384
 
398
- // src/result.ts
399
- function ok(value) {
400
- return { ok: true, value };
401
- }
402
- function err(error) {
403
- return { ok: false, error };
404
- }
405
-
406
385
  // src/truapi.ts
407
386
  var log2 = createLogger("host");
408
387
  function unwrapHostResult(result, label) {
@@ -577,7 +556,7 @@ async function getStatementStore() {
577
556
  // src/chains.ts
578
557
  var BULLETIN_RPCS = {
579
558
  paseo: ["wss://paseo-bulletin-next-rpc.polkadot.io"],
580
- summit: ["wss://summit-bulletin-rpc.polkadot.io"],
559
+ devnet: ["wss://bulletin-paseo.tservices.es:8443"],
581
560
  polkadot: [],
582
561
  kusama: []
583
562
  };
@@ -617,8 +596,8 @@ function adaptAccountsProvider(client) {
617
596
  derivationIndex
618
597
  }));
619
598
  },
620
- getProductAccountAlias(dotNsIdentifier, derivationIndex = 0) {
621
- return account.getAccountAlias({ productAccountId: { dotNsIdentifier, derivationIndex } }).map((response) => ({
599
+ getProductAccountAlias(context, location) {
600
+ return account.getAccountAlias({ context, ringLocation: location }).map((response) => ({
622
601
  context: fromHex(response.context),
623
602
  alias: fromHex(response.alias)
624
603
  }));
@@ -631,12 +610,20 @@ function adaptAccountsProvider(client) {
631
610
  }))
632
611
  );
633
612
  },
634
- createRingVRFProof(dotNsIdentifier, derivationIndex, location, message) {
613
+ createRingVRFProof(context, location, message) {
635
614
  return account.createAccountProof({
636
- productAccountId: { dotNsIdentifier, derivationIndex },
615
+ context,
637
616
  ringLocation: location,
638
- context: toHex(message)
639
- }).map((response) => fromHex(response.proof));
617
+ message: toHex(message)
618
+ }).map((response) => ({
619
+ proof: fromHex(response.proof),
620
+ contextualAlias: {
621
+ context: fromHex(response.contextualAlias.context),
622
+ alias: fromHex(response.contextualAlias.alias)
623
+ },
624
+ ringIndex: response.ringIndex,
625
+ ringRevision: response.ringRevision
626
+ }));
640
627
  },
641
628
  getProductAccountSigner(account_) {
642
629
  const productAccountId = {
@@ -968,6 +955,6 @@ async function stopTransaction(genesisHash, operationId) {
968
955
  );
969
956
  }
970
957
 
971
- export { BULLETIN_RPCS, ChainNotSupportedError, DEFAULT_BULLETIN_ENDPOINT, HostCallFailedError, HostError, HostUnavailableError, broadcastTransaction, createHostLocalStorage, createHostPreimageManager, createProofAuthorized, deriveEntropy, err, featureSupported, formatHostError, fromHex, getAccountsProvider, getChainSpec, getChatManager, getHostLocalStorage, getHostProvider, getNotificationManager, getPaymentManager, getPreimageManager, getStatementStore, getThemeProvider, getTruApi, isChainSupported, isHostError, isInsideContainer, navigateTo, ok, requestDevicePermission, requestPermission, requestResourceAllocation, stopTransaction, toHex };
958
+ export { BULLETIN_RPCS, ChainNotSupportedError, DEFAULT_BULLETIN_ENDPOINT, HostCallFailedError, HostError, HostUnavailableError, broadcastTransaction, createHostLocalStorage, createHostPreimageManager, createProofAuthorized, deriveEntropy, featureSupported, formatHostError, fromHex, getAccountsProvider, getChainSpec, getChatManager, getHostLocalStorage, getHostProvider, getNotificationManager, getPaymentManager, getPreimageManager, getStatementStore, getThemeProvider, getTruApi, isChainSupported, isHostError, isInsideContainer, navigateTo, requestDevicePermission, requestPermission, requestResourceAllocation, stopTransaction, toHex };
972
959
  //# sourceMappingURL=index.js.map
973
960
  //# sourceMappingURL=index.js.map