@novasamatech/host-papp 0.5.0-17 → 0.5.0-19

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.
Files changed (144) hide show
  1. package/.papi/descriptors/generated.json +1 -0
  2. package/dist/crypto.d.ts +2 -2
  3. package/dist/crypto.js +8 -7
  4. package/dist/helpers/abortError.d.ts +0 -1
  5. package/dist/helpers/abortError.js +0 -3
  6. package/dist/index.d.ts +1 -1
  7. package/dist/papp.js +2 -2
  8. package/dist/sso/auth/attestationService.js +1 -1
  9. package/dist/sso/auth/impl.d.ts +29 -3
  10. package/dist/sso/auth/impl.js +60 -35
  11. package/dist/sso/auth/types.d.ts +13 -2
  12. package/dist/sso/userSecretRepository.d.ts +1 -1
  13. package/dist/sso/userSecretRepository.js +2 -2
  14. package/package.json +5 -5
  15. package/dist/adapters/identity/rpc.d.ts +0 -6
  16. package/dist/adapters/identity/rpc.js +0 -101
  17. package/dist/adapters/identity/types.d.ts +0 -10
  18. package/dist/adapters/identity/types.js +0 -1
  19. package/dist/adapters/lazyClient/papi.d.ts +0 -3
  20. package/dist/adapters/lazyClient/papi.js +0 -17
  21. package/dist/adapters/lazyClient/types.d.ts +0 -5
  22. package/dist/adapters/lazyClient/types.js +0 -1
  23. package/dist/adapters/statement/rpc.d.ts +0 -3
  24. package/dist/adapters/statement/rpc.js +0 -93
  25. package/dist/adapters/statement/types.d.ts +0 -9
  26. package/dist/adapters/statement/types.js +0 -1
  27. package/dist/adapters/storage/localStorage.d.ts +0 -2
  28. package/dist/adapters/storage/localStorage.js +0 -34
  29. package/dist/adapters/storage/memory.d.ts +0 -2
  30. package/dist/adapters/storage/memory.js +0 -22
  31. package/dist/adapters/storage/types.d.ts +0 -7
  32. package/dist/adapters/storage/types.js +0 -1
  33. package/dist/adapters/transport/rpc.d.ts +0 -3
  34. package/dist/adapters/transport/rpc.js +0 -51
  35. package/dist/adapters/transport/types.d.ts +0 -6
  36. package/dist/adapters/transport/types.js +0 -1
  37. package/dist/components/auth/codec.d.ts +0 -9
  38. package/dist/components/auth/codec.js +0 -10
  39. package/dist/components/auth/codecs.d.ts +0 -9
  40. package/dist/components/auth/codecs.js +0 -10
  41. package/dist/components/auth/index.d.ts +0 -36
  42. package/dist/components/auth/index.js +0 -150
  43. package/dist/components/auth/types.d.ts +0 -15
  44. package/dist/components/auth/types.js +0 -1
  45. package/dist/components/session.d.ts +0 -34
  46. package/dist/components/session.js +0 -54
  47. package/dist/components/sso/index.d.ts +0 -36
  48. package/dist/components/sso/index.js +0 -150
  49. package/dist/components/sso/scale/handshake.d.ts +0 -9
  50. package/dist/components/sso/scale/handshake.js +0 -10
  51. package/dist/components/sso/types.d.ts +0 -15
  52. package/dist/components/sso/types.js +0 -1
  53. package/dist/components/transport.d.ts +0 -27
  54. package/dist/components/transport.js +0 -57
  55. package/dist/components/user/codec.d.ts +0 -16
  56. package/dist/components/user/codec.js +0 -13
  57. package/dist/components/user/index.d.ts +0 -22
  58. package/dist/components/user/index.js +0 -58
  59. package/dist/components/user/ssoMessageStream.d.ts +0 -10
  60. package/dist/components/user/ssoMessageStream.js +0 -8
  61. package/dist/components/user/ssoSession.d.ts +0 -5
  62. package/dist/components/user/ssoSession.js +0 -5
  63. package/dist/components/user/storage.d.ts +0 -27
  64. package/dist/components/user/storage.js +0 -143
  65. package/dist/components/user/types.d.ts +0 -6
  66. package/dist/components/user/types.js +0 -1
  67. package/dist/components/user/userSessionStorage.d.ts +0 -20
  68. package/dist/components/user/userSessionStorage.js +0 -24
  69. package/dist/components/user.d.ts +0 -74
  70. package/dist/components/user.js +0 -188
  71. package/dist/helpers/result.d.ts +0 -12
  72. package/dist/helpers/result.js +0 -15
  73. package/dist/helpers/result.spec.d.ts +0 -1
  74. package/dist/helpers/result.spec.js +0 -23
  75. package/dist/helpers.d.ts +0 -1
  76. package/dist/helpers.js +0 -3
  77. package/dist/modules/accounts.d.ts +0 -1
  78. package/dist/modules/accounts.js +0 -2
  79. package/dist/modules/crypto.d.ts +0 -23
  80. package/dist/modules/crypto.js +0 -51
  81. package/dist/modules/secretStorage.d.ts +0 -15
  82. package/dist/modules/secretStorage.js +0 -44
  83. package/dist/modules/session/helpers.d.ts +0 -5
  84. package/dist/modules/session/helpers.js +0 -29
  85. package/dist/modules/session/session.d.ts +0 -12
  86. package/dist/modules/session/session.js +0 -50
  87. package/dist/modules/session/types.d.ts +0 -12
  88. package/dist/modules/session/types.js +0 -1
  89. package/dist/modules/signIn.d.ts +0 -67
  90. package/dist/modules/signIn.js +0 -188
  91. package/dist/modules/state.d.ts +0 -16
  92. package/dist/modules/state.js +0 -50
  93. package/dist/modules/statementStore.d.ts +0 -12
  94. package/dist/modules/statementStore.js +0 -22
  95. package/dist/modules/statementTopic.d.ts +0 -34
  96. package/dist/modules/statementTopic.js +0 -46
  97. package/dist/modules/storageView.d.ts +0 -25
  98. package/dist/modules/storageView.js +0 -51
  99. package/dist/modules/syncStorage.d.ts +0 -25
  100. package/dist/modules/syncStorage.js +0 -76
  101. package/dist/modules/transport/codec.d.ts +0 -24
  102. package/dist/modules/transport/codec.js +0 -36
  103. package/dist/modules/transport/crypto.d.ts +0 -2
  104. package/dist/modules/transport/crypto.js +0 -20
  105. package/dist/modules/transport/transport.d.ts +0 -42
  106. package/dist/modules/transport/transport.js +0 -66
  107. package/dist/modules/user.d.ts +0 -67
  108. package/dist/modules/user.js +0 -188
  109. package/dist/modules/userManager.d.ts +0 -15
  110. package/dist/modules/userManager.js +0 -105
  111. package/dist/modules/userStorage.d.ts +0 -19
  112. package/dist/modules/userStorage.js +0 -108
  113. package/dist/modules/userStore.d.ts +0 -15
  114. package/dist/modules/userStore.js +0 -105
  115. package/dist/sso/session/impl.d.ts +0 -23
  116. package/dist/sso/session/impl.js +0 -57
  117. package/dist/sso/session/scale/remoteMessage.d.ts +0 -10
  118. package/dist/sso/session/scale/remoteMessage.js +0 -13
  119. package/dist/sso/session/sessionManager.d.ts +0 -23
  120. package/dist/sso/session/sessionManager.js +0 -58
  121. package/dist/sso/session/ssoSession.d.ts +0 -8
  122. package/dist/sso/session/ssoSession.js +0 -5
  123. package/dist/sso/session/ssoSessionStorage.d.ts +0 -21
  124. package/dist/sso/session/ssoSessionStorage.js +0 -20
  125. package/dist/sso/session/types.d.ts +0 -6
  126. package/dist/sso/session/types.js +0 -1
  127. package/dist/sso/session/userSessionStorage.d.ts +0 -21
  128. package/dist/sso/session/userSessionStorage.js +0 -20
  129. package/dist/sso/sessionManager/attestationService.d.ts +0 -5
  130. package/dist/sso/sessionManager/attestationService.js +0 -15
  131. package/dist/sso/sessionManager/repository/ssoSessionRepository.d.ts +0 -22
  132. package/dist/sso/sessionManager/repository/ssoSessionRepository.js +0 -27
  133. package/dist/sso/sessionManager/scale/signRequest.d.ts +0 -19
  134. package/dist/sso/sessionManager/scale/signRequest.js +0 -19
  135. package/dist/sso/sessionManager/scale/signResponse.d.ts +0 -6
  136. package/dist/sso/sessionManager/scale/signResponse.js +0 -5
  137. package/dist/sso/sessionManager/ssoSession.d.ts +0 -23
  138. package/dist/sso/sessionManager/ssoSession.js +0 -69
  139. package/dist/sso/sessionManager/ssoSessionProver.d.ts +0 -4
  140. package/dist/sso/sessionManager/ssoSessionProver.js +0 -35
  141. package/dist/sso/ssoSessionRepository.d.ts +0 -18
  142. package/dist/sso/ssoSessionRepository.js +0 -27
  143. package/dist/structs.d.ts +0 -24
  144. package/dist/structs.js +0 -36
@@ -1,150 +0,0 @@
1
- import { createAccountId, createLocalSessionAccount } from '@novasamatech/statement-store';
2
- import { toHex } from '@polkadot-api/utils';
3
- import { err, errAsync, fromPromise, fromThrowable, ok } from 'neverthrow';
4
- import { AbortError } from '../../helpers/abortError.js';
5
- import { toError } from '../../helpers/utils.js';
6
- import { ENCR_SECRET_SEED_SIZE, SS_SECRET_SEED_SIZE, createEncrSecret, createRandomSeed, createSharedSecret, createSsHardDerivation, createSsSecret, decrypt, getEncrPub, getSsPub, khash, mergeBytes, stringToBytes, } from '../../modules/crypto.js';
7
- import { createState, readonly } from '../../modules/state.js';
8
- import { createUserSession } from '../../modules/statementStore.js';
9
- import { HandshakeData, HandshakeResponsePayload, HandshakeResponseSensitiveData } from './scale/handshake.js';
10
- export function createAuthComponent({ appId, metadata, transport, userSessionStorage }) {
11
- const authStatus = createState({ step: 'none' });
12
- let authResults = null;
13
- let abort = null;
14
- function handshake(signal) {
15
- try {
16
- authStatus.write({ step: 'initial' });
17
- const { encrSecret, encrPublicKey, ssPublicKey } = getSecretKeys(appId);
18
- const localAccount = createLocalSessionAccount(createAccountId(ssPublicKey));
19
- const handshakePayload = createHandshakePayloadV1({ ssPublicKey, encrPublicKey, metadata }).andTee(payload => authStatus.write({ step: 'pairing', payload: createDeeplink(payload) }));
20
- const handshakeTopic = createHandshakeTopic(localAccount, encrPublicKey);
21
- const pappResponse = handshakePayload
22
- .andThen(() => handshakeTopic)
23
- .asyncAndThen(topic => waitForStatements(callback => transport.subscribeSession(topic, callback), signal, (statements, resolve) => {
24
- for (const statement of [...statements].reverse()) {
25
- if (!statement.data)
26
- continue;
27
- const session = retrieveSession({
28
- hostAccount: localAccount,
29
- encrSecret,
30
- payload: statement.data.asBytes(),
31
- });
32
- resolve(session);
33
- break;
34
- }
35
- }));
36
- const userCreated = pappResponse.andThen(userSessionStorage.add);
37
- return userCreated
38
- .orElse(e => (AbortError.isAbortError(e) ? ok(null) : err(toError(e))))
39
- .andTee(session => {
40
- if (session) {
41
- authStatus.write({ step: 'finished', session });
42
- }
43
- else {
44
- authStatus.write({ step: 'none' });
45
- }
46
- })
47
- .orTee(e => authStatus.write({ step: 'error', message: e.message }));
48
- }
49
- catch (e) {
50
- return errAsync(toError(e));
51
- }
52
- }
53
- const authModule = {
54
- status: readonly(authStatus),
55
- authenticate() {
56
- if (authResults) {
57
- return authResults;
58
- }
59
- abort = new AbortController();
60
- authResults = handshake(abort.signal);
61
- return authResults;
62
- },
63
- abortAuthentication() {
64
- if (abort) {
65
- authResults = null;
66
- authStatus.reset();
67
- abort.abort(new AbortError('Aborted by user.'));
68
- }
69
- },
70
- };
71
- return authModule;
72
- }
73
- const createHandshakeTopic = fromThrowable((account, encrPublicKey) => khash(account.accountId, mergeBytes(encrPublicKey, stringToBytes('topic'))), toError);
74
- const createHandshakePayloadV1 = fromThrowable(({ encrPublicKey, ssPublicKey, metadata, }) => HandshakeData.enc({
75
- tag: 'V1',
76
- value: [ssPublicKey, encrPublicKey, metadata],
77
- }), toError);
78
- function parseHandshakePayload(payload) {
79
- const decoded = HandshakeResponsePayload.dec(payload);
80
- switch (decoded.tag) {
81
- case 'V1':
82
- return {
83
- encrypted: decoded.value[0],
84
- tmpKey: decoded.value[1],
85
- };
86
- default:
87
- throw new Error('Unsupported handshake payload version');
88
- }
89
- }
90
- function retrieveSession({ payload, encrSecret, hostAccount, }) {
91
- const { encrypted, tmpKey } = parseHandshakePayload(payload);
92
- const symmetricKey = createSharedSecret(encrSecret, tmpKey);
93
- const decrypted = decrypt(symmetricKey, encrypted);
94
- const [pappEncrPublicKey, pappAccountId] = HandshakeResponseSensitiveData.dec(decrypted);
95
- const sharedSecret = createSharedSecret(encrSecret, pappEncrPublicKey);
96
- const peerAccount = createAccount(pappAccountId, sharedSecret);
97
- return createUserSession(hostAccount, peerAccount);
98
- }
99
- function getSsKeys(appId) {
100
- const seed = createRandomSeed(appId, SS_SECRET_SEED_SIZE);
101
- const ssSecret = createSsHardDerivation(createSsSecret(seed), '//wallet');
102
- return {
103
- ssSecret: ssSecret,
104
- ssPublicKey: getSsPub(ssSecret),
105
- };
106
- }
107
- function getEncrKeys(appId) {
108
- const seed = createRandomSeed(appId, ENCR_SECRET_SEED_SIZE);
109
- const encrSecret = createEncrSecret(seed);
110
- return {
111
- encrSecret,
112
- encrPublicKey: getEncrPub(encrSecret),
113
- };
114
- }
115
- function getSecretKeys(appId) {
116
- const ss = getSsKeys(appId);
117
- const encr = getEncrKeys(appId);
118
- return {
119
- ...ss,
120
- ...encr,
121
- };
122
- }
123
- function createDeeplink(payload) {
124
- return `polkadotapp://pair?handshake=${toHex(payload)}`;
125
- }
126
- function waitForStatements(subscribe, abortSignal, callback) {
127
- return fromPromise(new Promise((resolve, reject) => {
128
- const unsubscribe = subscribe(statements => {
129
- if (abortSignal?.aborted) {
130
- unsubscribe();
131
- try {
132
- abortSignal.throwIfAborted();
133
- }
134
- catch (e) {
135
- reject(e);
136
- }
137
- }
138
- try {
139
- callback(statements, value => {
140
- unsubscribe();
141
- resolve(value);
142
- });
143
- }
144
- catch (e) {
145
- unsubscribe();
146
- reject(e);
147
- }
148
- });
149
- }), toError);
150
- }
@@ -1,9 +0,0 @@
1
- export declare const HandshakeData: import("scale-ts").Codec<{
2
- tag: "V1";
3
- value: [import("../../../modules/crypto.js").SsPublicKey, import("../../../modules/crypto.js").EncrPublicKey, string];
4
- }>;
5
- export declare const HandshakeResponsePayload: import("scale-ts").Codec<{
6
- tag: "V1";
7
- value: [Uint8Array<ArrayBufferLike>, Uint8Array<ArrayBufferLike>];
8
- }>;
9
- export declare const HandshakeResponseSensitiveData: import("scale-ts").Codec<[Uint8Array<ArrayBufferLike>, Uint8Array<ArrayBufferLike>]>;
@@ -1,10 +0,0 @@
1
- import { Bytes, Enum, Tuple, str } from 'scale-ts';
2
- import { EncrPubKey, SsPubKey } from '../../../modules/crypto.js';
3
- export const HandshakeData = Enum({
4
- V1: Tuple(SsPubKey, EncrPubKey, str),
5
- });
6
- export const HandshakeResponsePayload = Enum({
7
- // [encrypted, tmp_key]
8
- V1: Tuple(Bytes(), Bytes(65)),
9
- });
10
- export const HandshakeResponseSensitiveData = Tuple(Bytes(65), Bytes(32));
@@ -1,15 +0,0 @@
1
- import type { UserSession } from '../user/userSessionStorage.js';
2
- export type AuthentificationStatus = {
3
- step: 'none';
4
- } | {
5
- step: 'initial';
6
- } | {
7
- step: 'pairing';
8
- payload: string;
9
- } | {
10
- step: 'error';
11
- message: string;
12
- } | {
13
- step: 'finished';
14
- session: UserSession;
15
- };
@@ -1 +0,0 @@
1
- export {};
@@ -1,27 +0,0 @@
1
- import type { Statement } from '@polkadot-api/sdk-statement';
2
- import type { Codec } from 'scale-ts';
3
- import type { StatementAdapter } from '../adapters/statement/types.js';
4
- import type { Account } from '../modules/statementStore.js';
5
- import type { TransportError } from '../structs.js';
6
- import type { Callback } from '../types.js';
7
- export type Transport = ReturnType<typeof createTransport>;
8
- type RequestMessage<T> = {
9
- type: 'request';
10
- requestId: string;
11
- data: T;
12
- };
13
- type ResponseMessage = {
14
- type: 'response';
15
- requestId: string;
16
- code: TransportError;
17
- };
18
- type Message<T> = RequestMessage<T> | ResponseMessage;
19
- type Params = {
20
- adapter: StatementAdapter;
21
- };
22
- export declare function createTransport({ adapter }: Params): {
23
- subscribe<T>(ownAccount: Account, peerAccount: Account, codec: Codec<T>, callback: Callback<Message<T>[]>): VoidFunction;
24
- subscribeSession(sessionId: Uint8Array, callback: Callback<Statement[]>): VoidFunction;
25
- handleRequest<T>(ownAccount: Account, peerAccount: Account, codec: Codec<T>, callback: Callback<RequestMessage<T>>): VoidFunction;
26
- };
27
- export {};
@@ -1,57 +0,0 @@
1
- import { fromThrowable, ok } from 'neverthrow';
2
- import { seq } from '../helpers/result.js';
3
- import { nonNullable, toError } from '../helpers/utils.js';
4
- import { decrypt } from '../modules/crypto.js';
5
- import { createSessionId } from '../modules/statementStore.js';
6
- import { StatementData } from '../structs.js';
7
- const decryptResults = fromThrowable(decrypt, toError);
8
- export function createTransport({ adapter }) {
9
- function mapMessage(statementData) {
10
- switch (statementData.tag) {
11
- case 'request':
12
- return statementData.value.data.map((data, index) => ({
13
- type: 'request',
14
- requestId: `${statementData.value.requestId}-${index.toString()}`,
15
- data,
16
- }));
17
- case 'response':
18
- return [
19
- {
20
- type: 'response',
21
- requestId: statementData.value.requestId,
22
- code: statementData.value.responseCode,
23
- },
24
- ];
25
- }
26
- }
27
- const transport = {
28
- subscribe(ownAccount, peerAccount, codec, callback) {
29
- const sessionId = createSessionId(peerAccount, ownAccount);
30
- const statementDataCodec = StatementData(codec);
31
- return adapter.subscribeStatements([sessionId], statements => {
32
- seq(...statements.map(statement => {
33
- if (!statement.data)
34
- return ok(null);
35
- return decryptResults(peerAccount.publicKey, statement.data.asBytes())
36
- .map(statementDataCodec.dec)
37
- .orElse(() => ok(null));
38
- }))
39
- .map(messages => messages.filter(nonNullable).flatMap(mapMessage))
40
- .andTee(messages => {
41
- if (messages.length > 0) {
42
- callback(messages);
43
- }
44
- });
45
- });
46
- },
47
- subscribeSession(sessionId, callback) {
48
- return adapter.subscribeStatements([sessionId], callback);
49
- },
50
- handleRequest(ownAccount, peerAccount, codec, callback) {
51
- return transport.subscribe(ownAccount, peerAccount, codec, messages => {
52
- messages.filter(m => m.type === 'request').forEach(callback);
53
- });
54
- },
55
- };
56
- return transport;
57
- }
@@ -1,16 +0,0 @@
1
- export declare const HostRemoteMessageCodec: import("scale-ts").Codec<{
2
- messageId: string;
3
- data: {
4
- tag: "v1";
5
- value: {
6
- tag: "Disconnected";
7
- value: undefined;
8
- } | {
9
- tag: "SigningRequest";
10
- value: Uint8Array<ArrayBufferLike>;
11
- } | {
12
- tag: "SigningResponse";
13
- value: Uint8Array<ArrayBufferLike>;
14
- };
15
- };
16
- }>;
@@ -1,13 +0,0 @@
1
- import { Bytes, Enum, Struct, _void, str } from 'scale-ts';
2
- export const HostRemoteMessageCodec = Struct({
3
- messageId: str,
4
- data: Enum({
5
- v1: Enum({
6
- Disconnected: _void,
7
- // TODO implement
8
- SigningRequest: Bytes(),
9
- // TODO implement
10
- SigningResponse: Bytes(),
11
- }),
12
- }),
13
- });
@@ -1,22 +0,0 @@
1
- import type { StorageAdapter } from '../../adapters/storage/types.js';
2
- import type { Transport } from '../../modules/transport/transport.js';
3
- import type { UserSession, UserSessionStorage } from './userSessionStorage.js';
4
- export type UserSessionsComponent = ReturnType<typeof createUserSessionsComponent>;
5
- type Params = {
6
- transport: Transport;
7
- storage: StorageAdapter;
8
- userSessionStorage: UserSessionStorage;
9
- };
10
- export declare function createUserSessionsComponent({ userSessionStorage, storage, transport }: Params): {
11
- sessions: {
12
- add(value: UserSession): import("neverthrow").ResultAsync<UserSession, Error>;
13
- mutate(fn: (value: UserSession[]) => UserSession[]): import("neverthrow").ResultAsync<UserSession[], Error>;
14
- read(): any;
15
- write(value: UserSession[]): any;
16
- clear(): any;
17
- subscribe(fn: (value: UserSession[]) => void): () => void;
18
- };
19
- disconnect: (session: UserSession) => import("neverthrow").ResultAsync<undefined, Error>;
20
- destroy(): void;
21
- };
22
- export {};
@@ -1,58 +0,0 @@
1
- import { okAsync } from 'neverthrow';
2
- import { createSSOSession } from './ssoSession.js';
3
- export function createUserSessionsComponent({ userSessionStorage, storage, transport }) {
4
- let unsubStatements = null;
5
- const disconnect = (session) => {
6
- return userSessionStorage.mutate(sessions => sessions.filter(s => s.id !== session.id)).map(() => undefined);
7
- };
8
- const unsubSessions = userSessionStorage.subscribe(userSessions => {
9
- if (unsubStatements) {
10
- unsubStatements();
11
- unsubStatements = null;
12
- }
13
- const ssoSessions = [];
14
- for (const userSession of userSessions) {
15
- const session = createSSOSession({
16
- ownAccount: userSession.host,
17
- peerAccount: userSession.peer,
18
- storage,
19
- transport,
20
- });
21
- session.subscribe(message => {
22
- switch (message.data.tag) {
23
- case 'v1': {
24
- switch (message.data.value.tag) {
25
- case 'Disconnected':
26
- return disconnect(userSession).map(() => true);
27
- }
28
- }
29
- }
30
- return okAsync(false);
31
- });
32
- ssoSessions.push(session);
33
- }
34
- unsubStatements = () => {
35
- for (const session of ssoSessions) {
36
- session.dispose();
37
- }
38
- };
39
- });
40
- return {
41
- sessions: userSessionStorage,
42
- disconnect,
43
- destroy() {
44
- unsubSessions();
45
- },
46
- };
47
- }
48
- // function createDisconnectMessage(ssSecret: SsSecret, topic: Uint8Array) {
49
- // const statement = createStatement(ssSecret, {
50
- // priority: 0,
51
- // channel: createRequestChannel(topic),
52
- // topics: [topic],
53
- // data: SSOMessage.enc({
54
- // tag: 'Disconnected',
55
- // value: undefined,
56
- // }),
57
- // });
58
- // }
@@ -1,10 +0,0 @@
1
- export declare const SSOMessage: import("scale-ts").Codec<{
2
- tag: "Disconnected";
3
- value: undefined;
4
- } | {
5
- tag: "SigningRequest";
6
- value: Uint8Array<ArrayBufferLike>;
7
- } | {
8
- tag: "SigningResponse";
9
- value: Uint8Array<ArrayBufferLike>;
10
- }>;
@@ -1,8 +0,0 @@
1
- import { Bytes, Enum, _void } from 'scale-ts';
2
- export const SSOMessage = Enum({
3
- Disconnected: _void,
4
- // TODO implement
5
- SigningRequest: Bytes(),
6
- // TODO implement
7
- SigningResponse: Bytes(),
8
- });
@@ -1,5 +0,0 @@
1
- import type { SessionParams } from '../../modules/session/session.js';
2
- import type { Session } from '../../modules/session/types.js';
3
- import { HostRemoteMessageCodec } from './codec.js';
4
- export type SsoSession = Session<typeof HostRemoteMessageCodec>;
5
- export declare function createSSOSession({ ownAccount, peerAccount, transport, storage, }: Omit<SessionParams<any>, 'codec'>): SsoSession;
@@ -1,5 +0,0 @@
1
- import { createSession } from '../../modules/session/session.js';
2
- import { HostRemoteMessageCodec } from './codec.js';
3
- export function createSSOSession({ ownAccount, peerAccount, transport, storage, }) {
4
- return createSession({ ownAccount, peerAccount, transport, storage, codec: HostRemoteMessageCodec });
5
- }
@@ -1,27 +0,0 @@
1
- import type { ResultAsync } from 'neverthrow';
2
- import type { StorageAdapter } from '../../adapters/storage/types.js';
3
- import type { Callback } from '../../types.js';
4
- import type { UserSecrets, UserSession } from './types.js';
5
- export type UserStorage = ReturnType<typeof createUserStorage>;
6
- type Params = {
7
- appId: string;
8
- storage: StorageAdapter;
9
- };
10
- export declare const createUserStorage: ({ appId, storage }: Params) => {
11
- sessions: {
12
- read(accountId: string): ResultAsync<UserSession | null, Error>;
13
- readSelectedUser(): ResultAsync<UserSession | null, Error>;
14
- subscribeSessions(callback: Callback<UserSession[]>): () => void;
15
- create(user: UserSession, secrets: UserSecrets): ResultAsync<UserSession, Error>;
16
- remove(accountId: string): ResultAsync<void, Error>;
17
- readSecrets(accountId: string): ResultAsync<UserSecrets | null, Error>;
18
- };
19
- accounts: {
20
- read(): ResultAsync<string[], Error>;
21
- subscribe(callback: (accounts: string[]) => void): () => void;
22
- readSelectedUser(): ResultAsync<string | null, Error>;
23
- subscribeSelectedAccount(callback: (accountId: string | null) => void): VoidFunction;
24
- select(accountId: string): ResultAsync<undefined, Error>;
25
- };
26
- };
27
- export {};
@@ -1,143 +0,0 @@
1
- import { okAsync } from 'neverthrow';
2
- import { callbackRaceResolver } from '../../helpers/callbackRaceResolver.js';
3
- import { seq, seqAsync } from '../../helpers/result.js';
4
- import { nonNullable } from '../../helpers/utils.js';
5
- import { createSecretStorage } from '../../modules/secretStorage.js';
6
- import { storageListView, storageView } from '../../modules/storageView.js';
7
- export const createUserStorage = ({ appId, storage }) => {
8
- const secretStorage = createSecretStorage(appId, storage);
9
- const usersStorage = createSessionsStorage(storage);
10
- const selectedUserStorage = createSelectedUserStorage(storage);
11
- const store = {
12
- sessions: {
13
- read(accountId) {
14
- const sessions = seqAsync(secretStorage.readSessionId(accountId, 'A'), secretStorage.readSessionId(accountId, 'B'));
15
- return sessions.map(([sessionIdA, sessionIdB]) => {
16
- if (nonNullable(sessionIdA) && nonNullable(sessionIdB)) {
17
- return { accountId, sessionIdA, sessionIdB };
18
- }
19
- return null;
20
- });
21
- },
22
- readSelectedUser() {
23
- return store.accounts.readSelectedUser().andThen(selectedUser => {
24
- if (selectedUser === null) {
25
- return okAsync(null);
26
- }
27
- return store.sessions.read(selectedUser).andThen(user => {
28
- if (user === null) {
29
- return selectedUserStorage.clear().map(() => user);
30
- }
31
- return okAsync(user);
32
- });
33
- });
34
- },
35
- subscribeSessions(callback) {
36
- const resolver = callbackRaceResolver(callback, async (accounts) => {
37
- if (accounts.length === 0) {
38
- return [];
39
- }
40
- return seq(...(await Promise.all(accounts.map(store.sessions.read))))
41
- .map(sessions => sessions.filter(nonNullable))
42
- .unwrapOr([]);
43
- });
44
- return store.accounts.subscribe(resolver);
45
- },
46
- create(user, secrets) {
47
- return usersStorage
48
- .add(user.accountId)
49
- .andThen(() => seqAsync(secretStorage.writeSsSecret(user.accountId, secrets.ss), secretStorage.writeEncrSecret(user.accountId, secrets.encr), secretStorage.writeSharedSecret(user.accountId, secrets.sharedSecret), secretStorage.writeSessionId(user.accountId, 'A', user.sessionIdA), secretStorage.writeSessionId(user.accountId, 'B', user.sessionIdB), selectedUserStorage.write(user.accountId)).map(() => user));
50
- },
51
- remove(accountId) {
52
- const op = seqAsync(secretStorage.clearSsSecret(accountId), secretStorage.clearEncrSecret(accountId), secretStorage.clearSharedSecret(accountId), secretStorage.clearSessionId(accountId, 'A'), secretStorage.clearSessionId(accountId, 'B'), usersStorage.remove(accountId), selectedUserStorage.read());
53
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
54
- return op.andThen(([_1, _2, _3, _4, _5, users, selectedUser]) => {
55
- if (selectedUser === accountId) {
56
- const nextSelectedUser = users.at(0);
57
- if (nextSelectedUser) {
58
- return selectedUserStorage.write(nextSelectedUser).map(() => undefined);
59
- }
60
- else {
61
- return selectedUserStorage.clear();
62
- }
63
- }
64
- return okAsync(undefined);
65
- });
66
- },
67
- readSecrets(accountId) {
68
- const op = seqAsync(secretStorage.readSsSecret(accountId), secretStorage.readEncrSecret(accountId), secretStorage.readSharedSecret(accountId));
69
- return op.map(([ss, encr, sharedSecret]) => {
70
- if (nonNullable(ss) && nonNullable(encr) && nonNullable(sharedSecret)) {
71
- return { ss, encr, sharedSecret };
72
- }
73
- return null;
74
- });
75
- },
76
- },
77
- accounts: {
78
- read() {
79
- return usersStorage.read();
80
- },
81
- subscribe(callback) {
82
- return usersStorage.subscribe(callback);
83
- },
84
- readSelectedUser() {
85
- return selectedUserStorage.read();
86
- },
87
- subscribeSelectedAccount(callback) {
88
- return selectedUserStorage.subscribe(callback);
89
- },
90
- select(accountId) {
91
- return selectedUserStorage.write(accountId).map(() => undefined);
92
- },
93
- },
94
- };
95
- return store;
96
- };
97
- const createSessionsStorage = (storage) => {
98
- const view = storageListView({
99
- storage,
100
- key: 'Users',
101
- autosync: true,
102
- initial: [],
103
- from: x => JSON.parse(x),
104
- to: x => JSON.stringify(x),
105
- });
106
- return {
107
- read() {
108
- return view.read();
109
- },
110
- add(user) {
111
- return view.mutate(users => {
112
- if (users.some(x => x === user)) {
113
- throw new Error(`User ${user} already exists.`);
114
- }
115
- return users.concat(user);
116
- });
117
- },
118
- remove(user) {
119
- return view.mutate(users => {
120
- const newUsers = users.filter(x => x !== user);
121
- if (newUsers.length !== users.length) {
122
- return newUsers;
123
- }
124
- return users;
125
- });
126
- },
127
- subscribe(callback) {
128
- return view.subscribe(v => {
129
- callback(v ?? []);
130
- });
131
- },
132
- };
133
- };
134
- const createSelectedUserStorage = (storage) => {
135
- return storageView({
136
- storage,
137
- key: 'SelectedUser',
138
- autosync: true,
139
- initial: null,
140
- from: x => x,
141
- to: x => x,
142
- });
143
- };
@@ -1,6 +0,0 @@
1
- import type { EncrSecret, SharedSecret, SsSecret } from '../../modules/crypto.js';
2
- export type UserSecrets = {
3
- sharedSecret: SharedSecret;
4
- encr: EncrSecret;
5
- ss: SsSecret;
6
- };
@@ -1 +0,0 @@
1
- export {};
@@ -1,20 +0,0 @@
1
- import type { StorageAdapter } from '../../adapters/storage/types.js';
2
- import type { Account } from '../../modules/session/types.js';
3
- export type UserSessionStorage = ReturnType<typeof createUserSessionStorage>;
4
- export type UserSession = {
5
- id: string;
6
- host: Account;
7
- peer: Account;
8
- };
9
- type Params = {
10
- storage: StorageAdapter;
11
- };
12
- export declare const createUserSessionStorage: ({ storage }: Params) => {
13
- add(value: UserSession): import("neverthrow").ResultAsync<UserSession, Error>;
14
- mutate(fn: (value: UserSession[]) => UserSession[]): import("neverthrow").ResultAsync<UserSession[], Error>;
15
- read(): any;
16
- write(value: UserSession[]): any;
17
- clear(): any;
18
- subscribe(fn: (value: UserSession[]) => void): () => void;
19
- };
20
- export {};
@@ -1,24 +0,0 @@
1
- import { fromHex, toHex } from '@polkadot-api/utils';
2
- import { Bytes, Option, Struct, Vector, str } from 'scale-ts';
3
- import { storageListView } from '../../modules/storageView.js';
4
- const accountCodec = Struct({
5
- accountId: Bytes(),
6
- publicKey: Bytes(),
7
- pin: Option(str),
8
- });
9
- const userSessionCodec = Struct({
10
- id: str,
11
- host: accountCodec,
12
- peer: accountCodec,
13
- });
14
- const userSessionsCodec = Vector(userSessionCodec);
15
- export const createUserSessionStorage = ({ storage }) => {
16
- return storageListView({
17
- storage,
18
- key: 'Sessions',
19
- autosync: true,
20
- initial: [],
21
- from: x => userSessionsCodec.dec(fromHex(x)),
22
- to: x => toHex(userSessionsCodec.enc(x)),
23
- });
24
- };