@novasamatech/host-papp 0.8.7 → 0.8.9

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.d.ts CHANGED
@@ -9,6 +9,6 @@ export { AllowanceError } from './sso/allowance/index.js';
9
9
  export type { UserSession } from './sso/sessionManager/userSession.js';
10
10
  export type { StoredUserSession } from './sso/userSessionRepository.js';
11
11
  export type { Identity } from './identity/types.js';
12
- export type { SigningPayloadRequest, SigningPayloadResponse, SigningRawRequest, SigningRequest, } from './sso/sessionManager/scale/signing.js';
12
+ export type { SignRawLegacyRequest, SignRawLegacyResponse, SigningPayloadRequest, SigningPayloadResponse, SigningRawRequest, SigningRequest, } from './sso/sessionManager/scale/signing.js';
13
13
  export type { RingVrfAliasRequest, RingVrfAliasResponse } from './sso/sessionManager/scale/ringVrf.js';
14
- export type { CreateTransactionRequest, CreateTransactionResponse, } from './sso/sessionManager/scale/createTransaction.js';
14
+ export type { CreateTransactionLegacyRequest, CreateTransactionRequest, CreateTransactionResponse, } from './sso/sessionManager/scale/createTransaction.js';
@@ -16,6 +16,23 @@ export declare const CreateTransactionRequestCodec: import("scale-ts").Codec<{
16
16
  };
17
17
  };
18
18
  }>;
19
+ export type CreateTransactionLegacyRequest = CodecType<typeof CreateTransactionLegacyRequestCodec>;
20
+ export declare const CreateTransactionLegacyRequestCodec: import("scale-ts").Codec<{
21
+ payload: {
22
+ tag: "v1";
23
+ value: {
24
+ signer: Uint8Array<ArrayBufferLike>;
25
+ genesisHash: Uint8Array<ArrayBufferLike>;
26
+ callData: Uint8Array<ArrayBufferLike>;
27
+ extensions: {
28
+ id: string;
29
+ extra: Uint8Array<ArrayBufferLike>;
30
+ additionalSigned: Uint8Array<ArrayBufferLike>;
31
+ }[];
32
+ txExtVersion: number;
33
+ };
34
+ };
35
+ }>;
19
36
  export type CreateTransactionResponse = CodecType<typeof CreateTransactionResponseCodec>;
20
37
  export declare const CreateTransactionResponseCodec: import("scale-ts").Codec<{
21
38
  respondingTo: string;
@@ -1,4 +1,4 @@
1
- import { ProductAccountTransaction } from '@novasamatech/host-api';
1
+ import { LegacyTransaction, ProductAccountTransaction } from '@novasamatech/host-api';
2
2
  import { Enum } from '@novasamatech/scale';
3
3
  import { Bytes, Result, Struct, str } from 'scale-ts';
4
4
  export const CreateTransactionRequestCodec = Struct({
@@ -6,6 +6,11 @@ export const CreateTransactionRequestCodec = Struct({
6
6
  v1: ProductAccountTransaction,
7
7
  }),
8
8
  });
9
+ export const CreateTransactionLegacyRequestCodec = Struct({
10
+ payload: Enum({
11
+ v1: LegacyTransaction,
12
+ }),
13
+ });
9
14
  export const CreateTransactionResponseCodec = Struct({
10
15
  // referencing to RemoteMessage.messageId
11
16
  respondingTo: str,
@@ -143,6 +143,42 @@ export declare const RemoteMessageCodec: import("scale-ts").Codec<{
143
143
  respondingTo: string;
144
144
  signedTransaction: import("scale-ts").ResultPayload<Uint8Array<ArrayBufferLike>, string>;
145
145
  };
146
+ } | {
147
+ tag: "CreateTransactionLegacyRequest";
148
+ value: {
149
+ payload: {
150
+ tag: "v1";
151
+ value: {
152
+ signer: Uint8Array<ArrayBufferLike>;
153
+ genesisHash: Uint8Array<ArrayBufferLike>;
154
+ callData: Uint8Array<ArrayBufferLike>;
155
+ extensions: {
156
+ id: string;
157
+ extra: Uint8Array<ArrayBufferLike>;
158
+ additionalSigned: Uint8Array<ArrayBufferLike>;
159
+ }[];
160
+ txExtVersion: number;
161
+ };
162
+ };
163
+ };
164
+ } | {
165
+ tag: "SignRawLegacyRequest";
166
+ value: {
167
+ account: Uint8Array<ArrayBufferLike>;
168
+ data: {
169
+ tag: "Bytes";
170
+ value: Uint8Array<ArrayBufferLike>;
171
+ } | {
172
+ tag: "Payload";
173
+ value: string;
174
+ };
175
+ };
176
+ } | {
177
+ tag: "SignRawLegacyResponse";
178
+ value: {
179
+ respondingTo: string;
180
+ signature: import("scale-ts").ResultPayload<Uint8Array<ArrayBufferLike>, string>;
181
+ };
146
182
  };
147
183
  };
148
184
  }>;
@@ -1,8 +1,8 @@
1
1
  import { Enum, Struct, _void, str } from 'scale-ts';
2
- import { CreateTransactionRequestCodec, CreateTransactionResponseCodec } from './createTransaction.js';
2
+ import { CreateTransactionLegacyRequestCodec, CreateTransactionRequestCodec, CreateTransactionResponseCodec, } from './createTransaction.js';
3
3
  import { ResourceAllocationRequestCodec, ResourceAllocationResponseCodec } from './resourceAllocation.js';
4
4
  import { RingVrfAliasRequestCodec, RingVrfAliasResponseCodec } from './ringVrf.js';
5
- import { SigningRequestCodec, SigningResponseCodec } from './signing.js';
5
+ import { SignRawLegacyRequestCodec, SignRawLegacyResponseCodec, SigningRequestCodec, SigningResponseCodec, } from './signing.js';
6
6
  export const RemoteMessageCodec = Struct({
7
7
  messageId: str,
8
8
  data: Enum({
@@ -16,6 +16,9 @@ export const RemoteMessageCodec = Struct({
16
16
  ResourceAllocationResponse: ResourceAllocationResponseCodec,
17
17
  CreateTransactionRequest: CreateTransactionRequestCodec,
18
18
  CreateTransactionResponse: CreateTransactionResponseCodec,
19
+ CreateTransactionLegacyRequest: CreateTransactionLegacyRequestCodec,
20
+ SignRawLegacyRequest: SignRawLegacyRequestCodec,
21
+ SignRawLegacyResponse: SignRawLegacyResponseCodec,
19
22
  }),
20
23
  }),
21
24
  });
@@ -29,6 +29,22 @@ export declare const SigningRawRequestCodec: import("scale-ts").Codec<{
29
29
  value: string;
30
30
  };
31
31
  }>;
32
+ export type SignRawLegacyRequest = CodecType<typeof SignRawLegacyRequestCodec>;
33
+ export declare const SignRawLegacyRequestCodec: import("scale-ts").Codec<{
34
+ account: Uint8Array<ArrayBufferLike>;
35
+ data: {
36
+ tag: "Bytes";
37
+ value: Uint8Array<ArrayBufferLike>;
38
+ } | {
39
+ tag: "Payload";
40
+ value: string;
41
+ };
42
+ }>;
43
+ export type SignRawLegacyResponse = CodecType<typeof SignRawLegacyResponseCodec>;
44
+ export declare const SignRawLegacyResponseCodec: import("scale-ts").Codec<{
45
+ respondingTo: string;
46
+ signature: import("scale-ts").ResultPayload<Uint8Array<ArrayBufferLike>, string>;
47
+ }>;
32
48
  export type SigningRequest = CodecType<typeof SigningRequestCodec>;
33
49
  export declare const SigningRequestCodec: import("scale-ts").Codec<{
34
50
  tag: "Payload";
@@ -1,4 +1,4 @@
1
- import { ProductAccountId } from '@novasamatech/host-api';
1
+ import { AccountId, ProductAccountId } from '@novasamatech/host-api';
2
2
  import { Enum, Hex, OptionBool } from '@novasamatech/scale';
3
3
  import { Bytes, Option, Result, Struct, Vector, str, u32 } from 'scale-ts';
4
4
  export const SigningPayloadRequestCodec = Struct({
@@ -26,6 +26,18 @@ export const SigningRawRequestCodec = Struct({
26
26
  Payload: str,
27
27
  }),
28
28
  });
29
+ export const SignRawLegacyRequestCodec = Struct({
30
+ account: AccountId,
31
+ data: Enum({
32
+ Bytes: Bytes(),
33
+ Payload: str,
34
+ }),
35
+ });
36
+ export const SignRawLegacyResponseCodec = Struct({
37
+ // referencing to RemoteMessage.messageId
38
+ respondingTo: str,
39
+ signature: Result(Bytes(), str),
40
+ });
29
41
  export const SigningRequestCodec = Enum({
30
42
  Payload: SigningPayloadRequestCodec,
31
43
  Raw: SigningRawRequestCodec,
@@ -5,16 +5,18 @@ import { ResultAsync } from 'neverthrow';
5
5
  import type { CodecType } from 'scale-ts';
6
6
  import type { Callback } from '../../types.js';
7
7
  import type { StoredUserSession } from '../userSessionRepository.js';
8
- import type { CreateTransactionRequest } from './scale/createTransaction.js';
8
+ import type { CreateTransactionLegacyRequest, CreateTransactionRequest } from './scale/createTransaction.js';
9
9
  import { RemoteMessageCodec } from './scale/remoteMessage.js';
10
10
  import type { ApAllocationOutcome, ResourceAllocationRequest } from './scale/resourceAllocation.js';
11
- import type { SigningPayloadRequest, SigningPayloadResponseData, SigningRawRequest } from './scale/signing.js';
11
+ import type { SignRawLegacyRequest, SigningPayloadRequest, SigningPayloadResponseData, SigningRawRequest } from './scale/signing.js';
12
12
  export type UserSession = StoredUserSession & {
13
13
  sendDisconnectMessage(): ResultAsync<void, Error>;
14
14
  abortPendingRequests(): ResultAsync<void, Error>;
15
15
  signPayload(payload: SigningPayloadRequest): ResultAsync<SigningPayloadResponseData, Error>;
16
16
  signRaw(payload: SigningRawRequest): ResultAsync<SigningPayloadResponseData, Error>;
17
+ signRawLegacy(payload: SignRawLegacyRequest): ResultAsync<Uint8Array, Error>;
17
18
  createTransaction(payload: CreateTransactionRequest): ResultAsync<Uint8Array, Error>;
19
+ createTransactionLegacy(payload: CreateTransactionLegacyRequest): ResultAsync<Uint8Array, Error>;
18
20
  getRingVrfAlias(productAccountId: CodecType<typeof ProductAccountId>, productId: string): ResultAsync<CodecType<typeof ContextualAlias>, Error>;
19
21
  requestResourceAllocation(request: ResourceAllocationRequest): ResultAsync<ApAllocationOutcome[], Error>;
20
22
  subscribe(callback: Callback<CodecType<typeof RemoteMessageCodec>, ResultAsync<boolean, Error>>): VoidFunction;
@@ -12,7 +12,7 @@ import { RemoteMessageCodec } from './scale/remoteMessage.js';
12
12
  // the remote signer doesn't respond — e.g. the request
13
13
  // payload is for an SDK version the mobile app doesn't support yet. After
14
14
  // this timeout the queue task fails, freeing the pool for the next request.
15
- const QUEUE_TASK_TIMEOUT_MS = 180_000;
15
+ const QUEUE_TASK_TIMEOUT_MS = 240_000;
16
16
  // Mobile SSO statements allow 500 KiB total; keep headroom for statement/session overhead.
17
17
  const MAX_SSO_REQUEST_SIZE = 498 * 1024;
18
18
  function withQueueTimeout(resultAsync, label) {
@@ -162,10 +162,61 @@ export function createUserSession({ userSession, statementStore, encryption, sto
162
162
  return withHostActionTrace(withQueueTimeout(inner, 'signRaw'), messageId, userSession.id);
163
163
  });
164
164
  },
165
+ signRawLegacy(payload) {
166
+ return enqueue(() => {
167
+ const messageId = nanoid();
168
+ const data = enumValue('v1', enumValue('SignRawLegacyRequest', payload));
169
+ emitHostAction(messageId, actionKindFromMessageData(data), userSession.id);
170
+ const responseFilter = (message) => {
171
+ if (message.data.tag === 'v1' &&
172
+ message.data.value.tag === 'SignRawLegacyResponse' &&
173
+ message.data.value.value.respondingTo === messageId) {
174
+ return message.data.value.value.signature;
175
+ }
176
+ };
177
+ const request = session.request(RemoteMessageCodec, { messageId, data });
178
+ const reply = session.waitForRequestMessage(RemoteMessageCodec, responseFilter);
179
+ const inner = awaitReplyOrAckFailure(request, reply).andThen(message => {
180
+ if (message.success) {
181
+ return ok(message.value);
182
+ }
183
+ else {
184
+ return err(new Error(message.value));
185
+ }
186
+ });
187
+ return withHostActionTrace(withQueueTimeout(inner, 'signRawLegacy'), messageId, userSession.id);
188
+ });
189
+ },
165
190
  createTransaction(payload) {
166
191
  return enqueue(() => {
167
192
  const messageId = nanoid();
168
193
  const data = enumValue('v1', enumValue('CreateTransactionRequest', payload));
194
+ emitHostAction(messageId, actionKindFromMessageData(data), userSession.id);
195
+ const responseFilter = (message) => {
196
+ if (message.data.tag === 'v1' &&
197
+ message.data.value.tag === 'CreateTransactionResponse' &&
198
+ message.data.value.value.respondingTo === messageId) {
199
+ return message.data.value.value.signedTransaction;
200
+ }
201
+ };
202
+ const request = session.request(RemoteMessageCodec, { messageId, data });
203
+ const reply = session.waitForRequestMessage(RemoteMessageCodec, responseFilter);
204
+ const inner = awaitReplyOrAckFailure(request, reply).andThen(message => {
205
+ if (message.success) {
206
+ return ok(message.value);
207
+ }
208
+ else {
209
+ return err(new Error(message.value));
210
+ }
211
+ });
212
+ return withHostActionTrace(withQueueTimeout(inner, 'createTransaction'), messageId, userSession.id);
213
+ });
214
+ },
215
+ createTransactionLegacy(payload) {
216
+ return enqueue(() => {
217
+ const messageId = nanoid();
218
+ const data = enumValue('v1', enumValue('CreateTransactionLegacyRequest', payload));
219
+ emitHostAction(messageId, actionKindFromMessageData(data), userSession.id);
169
220
  const responseFilter = (message) => {
170
221
  if (message.data.tag === 'v1' &&
171
222
  message.data.value.tag === 'CreateTransactionResponse' &&
@@ -183,7 +234,7 @@ export function createUserSession({ userSession, statementStore, encryption, sto
183
234
  return err(new Error(message.value));
184
235
  }
185
236
  });
186
- return withQueueTimeout(inner, 'createTransaction');
237
+ return withHostActionTrace(withQueueTimeout(inner, 'createTransactionLegacy'), messageId, userSession.id);
187
238
  });
188
239
  },
189
240
  getRingVrfAlias(productAccountId, productId) {
@@ -210,6 +261,7 @@ export function createUserSession({ userSession, statementStore, encryption, sto
210
261
  return enqueue(() => {
211
262
  const messageId = nanoid();
212
263
  const data = enumValue('v1', enumValue('ResourceAllocationRequest', payload));
264
+ emitHostAction(messageId, actionKindFromMessageData(data), userSession.id);
213
265
  const responseFilter = (message) => {
214
266
  if (message.data.tag === 'v1' &&
215
267
  message.data.value.tag === 'ResourceAllocationResponse' &&
@@ -220,7 +272,7 @@ export function createUserSession({ userSession, statementStore, encryption, sto
220
272
  const request = session.request(RemoteMessageCodec, { messageId, data });
221
273
  const reply = session.waitForRequestMessage(RemoteMessageCodec, responseFilter);
222
274
  const inner = awaitReplyOrAckFailure(request, reply).andThen(result => result.success ? ok(result.value) : err(new Error(result.value)));
223
- return withQueueTimeout(inner, 'requestResourceAllocation');
275
+ return withHostActionTrace(withQueueTimeout(inner, 'requestResourceAllocation'), messageId, userSession.id);
224
276
  });
225
277
  },
226
278
  sendDisconnectMessage() {
@@ -296,7 +348,7 @@ export function createUserSession({ userSession, statementStore, encryption, sto
296
348
  abortPendingRequests() {
297
349
  // Drop the whole request queue: aborting the shared signal rejects the
298
350
  // in-flight task and every request queued behind it, freeing the single
299
- // slot immediately instead of waiting out the per-task 180s timeout. Swap
351
+ // slot immediately instead of waiting out the per-task timeout. Swap
300
352
  // in a fresh controller so subsequent requests aren't pre-aborted.
301
353
  requestAbort.abort(new Error('Session request aborted'));
302
354
  requestAbort = new AbortController();
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@novasamatech/host-papp",
3
3
  "type": "module",
4
- "version": "0.8.7",
4
+ "version": "0.8.9",
5
5
  "description": "Polkadot app integration",
6
6
  "license": "Apache-2.0",
7
7
  "repository": {
@@ -34,10 +34,10 @@
34
34
  "@noble/ciphers": "2.2.0",
35
35
  "@noble/curves": "2.2.0",
36
36
  "@noble/hashes": "2.2.0",
37
- "@novasamatech/host-api": "0.8.7",
38
- "@novasamatech/scale": "0.8.7",
39
- "@novasamatech/statement-store": "0.8.7",
40
- "@novasamatech/storage-adapter": "0.8.7",
37
+ "@novasamatech/host-api": "0.8.9",
38
+ "@novasamatech/scale": "0.8.9",
39
+ "@novasamatech/statement-store": "0.8.9",
40
+ "@novasamatech/storage-adapter": "0.8.9",
41
41
  "@polkadot-api/utils": "^0.4.0",
42
42
  "@polkadot-labs/hdkd-helpers": "^0.0.30",
43
43
  "nanoevents": "9.1.0",