@dynamic-labs/message-transport 4.0.0-alpha.3 → 4.0.0-alpha.31

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 (61) hide show
  1. package/CHANGELOG.md +261 -0
  2. package/package.cjs +8 -0
  3. package/package.js +4 -0
  4. package/package.json +9 -15
  5. package/src/index.cjs +14 -1
  6. package/src/index.d.ts +3 -2
  7. package/src/index.js +9 -0
  8. package/src/messageTransport/decorators/makeWaitForInitEvent/makeWaitForInitEvent.d.ts +4 -9
  9. package/src/messageTransport/decorators/makeWaitForUnblock/makeWaitForUnblock.cjs +21 -15
  10. package/src/messageTransport/decorators/makeWaitForUnblock/makeWaitForUnblock.d.ts +16 -8
  11. package/src/messageTransport/decorators/makeWaitForUnblock/makeWaitForUnblock.js +21 -15
  12. package/src/messageTypes/AccountAbstractionMessages.d.ts +15 -0
  13. package/src/messageTypes/AuthModuleMessages.cjs +14 -0
  14. package/src/messageTypes/AuthModuleMessages.d.ts +12 -1
  15. package/src/messageTypes/AuthModuleMessages.js +10 -0
  16. package/src/messageTypes/EmbeddedWalletsModuleMessages.cjs +10 -0
  17. package/src/messageTypes/EmbeddedWalletsModuleMessages.d.ts +5 -1
  18. package/src/messageTypes/EmbeddedWalletsModuleMessages.js +6 -0
  19. package/src/messageTypes/ExternalAuthMessages.d.ts +3 -2
  20. package/src/messageTypes/OtpMessages.cjs +14 -0
  21. package/src/messageTypes/OtpMessages.d.ts +10 -0
  22. package/src/messageTypes/OtpMessages.js +9 -0
  23. package/src/messageTypes/PasskeyMessages.d.ts +6 -0
  24. package/src/messageTypes/ProjectSettingsMessages.d.ts +6 -0
  25. package/src/messageTypes/SocialAuthModuleMessages.d.ts +13 -1
  26. package/src/messageTypes/StorageMessages.d.ts +19 -0
  27. package/src/messageTypes/TurnkeyIframeEventProxyMessages.d.ts +9 -0
  28. package/src/messageTypes/UserInterfaceModuleMessages.cjs +12 -0
  29. package/src/messageTypes/UserInterfaceModuleMessages.d.ts +4 -0
  30. package/src/messageTypes/UserInterfaceModuleMessages.js +8 -0
  31. package/src/messageTypes/WalletsModuleMessages.cjs +12 -0
  32. package/src/messageTypes/WalletsModuleMessages.d.ts +29 -0
  33. package/src/messageTypes/WalletsModuleMessages.js +8 -0
  34. package/src/messageTypes/ZeroDevExtensionMessages.d.ts +10 -0
  35. package/src/messageTypes/index.d.ts +5 -1
  36. package/src/requestChannel/createRequestChannelMessageSender/createRequestChannelMessageSender.cjs +45 -0
  37. package/src/requestChannel/createRequestChannelMessageSender/createRequestChannelMessageSender.d.ts +18 -0
  38. package/src/requestChannel/createRequestChannelMessageSender/createRequestChannelMessageSender.js +41 -0
  39. package/src/requestChannel/createRequestChannelMessageSender/index.d.ts +1 -0
  40. package/src/requestChannel/index.d.ts +1 -0
  41. package/src/requestChannel/requestChannel.cjs +46 -76
  42. package/src/requestChannel/requestChannel.d.ts +3 -69
  43. package/src/requestChannel/requestChannel.js +42 -68
  44. package/src/requestChannel/types.d.ts +55 -0
  45. package/src/requestChannel/utils/index.d.ts +1 -0
  46. package/src/requestChannel/utils/utils.cjs +33 -0
  47. package/src/requestChannel/utils/utils.d.ts +16 -0
  48. package/src/requestChannel/utils/utils.js +25 -0
  49. package/src/store/createEventEmitterForMessages/createEventEmitterForMessages.cjs +4 -5
  50. package/src/store/createEventEmitterForMessages/createEventEmitterForMessages.d.ts +5 -8
  51. package/src/store/createEventEmitterForMessages/createEventEmitterForMessages.js +4 -5
  52. package/src/store/store.cjs +1 -1
  53. package/src/store/store.js +1 -1
  54. package/src/store/types.d.ts +3 -11
  55. package/src/types.d.ts +5 -0
  56. package/src/utils/parseErrorFromTransport/parseErrorFromTransport.cjs +11 -0
  57. package/src/utils/parseErrorFromTransport/parseErrorFromTransport.d.ts +1 -1
  58. package/src/utils/parseErrorFromTransport/parseErrorFromTransport.js +11 -0
  59. package/src/utils/serializeErrorForTransport/serializeErrorForTransport.cjs +3 -0
  60. package/src/utils/serializeErrorForTransport/serializeErrorForTransport.js +3 -0
  61. package/src/messageTypes/SecureStorageMessages.d.ts +0 -5
@@ -1,8 +1,19 @@
1
- import type { UserProfile } from '@dynamic-labs/types';
1
+ import type { AuthEventPayload, UserProfile } from '@dynamic-labs/types';
2
2
  export type AuthModuleState = {
3
3
  token: string | null;
4
4
  authenticatedUser: UserProfile | null;
5
5
  };
6
6
  export type AuthModuleMessages = {
7
7
  logout: () => Promise<void>;
8
+ handleAuthenticatedUser: (params: {
9
+ user: UserProfile;
10
+ }) => Promise<void>;
11
+ authSuccess: (user: UserProfile) => void;
12
+ authFailed: (data: AuthEventPayload, reason: 'user-cancelled' | {
13
+ error: unknown;
14
+ }) => void;
15
+ authInit: (data: AuthEventPayload) => void;
16
+ loggedOut: (user: UserProfile | null) => void;
17
+ userProfileUpdated: (user: UserProfile) => void;
8
18
  };
19
+ export declare const authEventNames: ("authSuccess" | "authFailed" | "authInit" | "loggedOut" | "userProfileUpdated")[];
@@ -0,0 +1,10 @@
1
+ 'use client'
2
+ const authEventNames = [
3
+ 'authSuccess',
4
+ 'authFailed',
5
+ 'authInit',
6
+ 'loggedOut',
7
+ 'userProfileUpdated',
8
+ ];
9
+
10
+ export { authEventNames };
@@ -0,0 +1,10 @@
1
+ 'use client'
2
+ 'use strict';
3
+
4
+ Object.defineProperty(exports, '__esModule', { value: true });
5
+
6
+ const embeddedWalletsEventNames = [
7
+ 'embeddedWalletCreated',
8
+ ];
9
+
10
+ exports.embeddedWalletsEventNames = embeddedWalletsEventNames;
@@ -1,4 +1,4 @@
1
- import { EmbeddedWalletChainEnum } from '@dynamic-labs/sdk-api-core';
1
+ import { EmbeddedWalletChainEnum, JwtVerifiedCredential } from '@dynamic-labs/sdk-api-core';
2
2
  import { BaseWallet } from '@dynamic-labs/types';
3
3
  export type CreateEmbeddedWalletArgs = {
4
4
  chain?: keyof typeof EmbeddedWalletChainEnum;
@@ -9,4 +9,8 @@ export type EmbeddedWalletsModuleState = {
9
9
  export type EmbeddedWalletsModuleMessages = {
10
10
  getWallet: () => Promise<BaseWallet | null>;
11
11
  createWallet: (args?: CreateEmbeddedWalletArgs) => Promise<BaseWallet>;
12
+ embeddedWalletCreated: (verifiedCredential: JwtVerifiedCredential | null) => void;
12
13
  };
14
+ type EmbeddedWalletsEventNames = 'embeddedWalletCreated';
15
+ export declare const embeddedWalletsEventNames: EmbeddedWalletsEventNames[];
16
+ export {};
@@ -0,0 +1,6 @@
1
+ 'use client'
2
+ const embeddedWalletsEventNames = [
3
+ 'embeddedWalletCreated',
4
+ ];
5
+
6
+ export { embeddedWalletsEventNames };
@@ -1,3 +1,4 @@
1
+ import { UserProfile } from '@dynamic-labs/types';
1
2
  export type SignInWithExternalJwtParams = {
2
3
  externalUserId: string;
3
4
  externalJwt: string;
@@ -10,9 +11,9 @@ export type ExternalAuthMessages = {
10
11
  /**
11
12
  * Initiates sign in with an externally provided JWT
12
13
  */
13
- signInWithExternalJwt: (props: SignInWithExternalJwtParams) => Promise<void>;
14
+ signInWithExternalJwt: (props: SignInWithExternalJwtParams) => Promise<UserProfile | null>;
14
15
  /**
15
16
  * Initiates verification with an externally provided JWT
16
17
  */
17
- verifyWithExternalJwt: (props: VerifyWithExternalJwtParams) => Promise<void>;
18
+ verifyWithExternalJwt: (props: VerifyWithExternalJwtParams) => Promise<UserProfile | null>;
18
19
  };
@@ -0,0 +1,14 @@
1
+ 'use client'
2
+ 'use strict';
3
+
4
+ Object.defineProperty(exports, '__esModule', { value: true });
5
+
6
+ const emailEventNames = [
7
+ 'emailVerificationFinished',
8
+ ];
9
+ const smsEventNames = [
10
+ 'smsVerificationFinished',
11
+ ];
12
+
13
+ exports.emailEventNames = emailEventNames;
14
+ exports.smsEventNames = smsEventNames;
@@ -15,4 +15,14 @@ export type OtpMessages = {
15
15
  verifyOTP: (token: string) => Promise<void>;
16
16
  /** Re-sends the OTP for verification */
17
17
  resendOTP: () => Promise<void>;
18
+ emailVerificationFinished: (params: {
19
+ isSuccess: boolean;
20
+ destination: string;
21
+ }) => void;
22
+ smsVerificationFinished: (params: {
23
+ isSuccess: boolean;
24
+ destination: PhoneData;
25
+ }) => void;
18
26
  };
27
+ export declare const emailEventNames: "emailVerificationFinished"[];
28
+ export declare const smsEventNames: "smsVerificationFinished"[];
@@ -0,0 +1,9 @@
1
+ 'use client'
2
+ const emailEventNames = [
3
+ 'emailVerificationFinished',
4
+ ];
5
+ const smsEventNames = [
6
+ 'smsVerificationFinished',
7
+ ];
8
+
9
+ export { emailEventNames, smsEventNames };
@@ -1,3 +1,4 @@
1
+ import { CreateWebauthnCredentialOptions, convertAttestationResultToTurnkey } from '@dynamic-labs/webauthn';
1
2
  type CustomPublicKeyCredentialUserEntity = Omit<PublicKeyCredentialUserEntity, 'id'> & {
2
3
  id: string;
3
4
  };
@@ -24,6 +25,11 @@ export type PasskeyMessages = {
24
25
  transports: ('AUTHENTICATOR_TRANSPORT_BLE' | 'AUTHENTICATOR_TRANSPORT_INTERNAL' | 'AUTHENTICATOR_TRANSPORT_NFC' | 'AUTHENTICATOR_TRANSPORT_USB' | 'AUTHENTICATOR_TRANSPORT_HYBRID')[];
25
26
  };
26
27
  }>;
28
+ createPasskeyOnBrowser: (params: {
29
+ publicKey: CreateWebauthnCredentialOptions;
30
+ }) => Promise<{
31
+ attestation: ReturnType<typeof convertAttestationResultToTurnkey>;
32
+ }>;
27
33
  passkeyStamp: (rdId: string, payload: string) => Promise<{
28
34
  stampHeaderName: string;
29
35
  stampHeaderValue: string;
@@ -0,0 +1,6 @@
1
+ import { ProjectSettings } from '@dynamic-labs/sdk-api-core';
2
+ export type ProjectSettingsMessages = {
3
+ getProjectSettings: () => Promise<{
4
+ projectSettings: ProjectSettings;
5
+ }>;
6
+ };
@@ -1,4 +1,11 @@
1
- export type SocialProvider = 'apple' | 'coinbaseSocial' | 'discord' | 'facebook' | 'farcaster' | 'github' | 'google' | 'telegram' | 'twitch' | 'twitter';
1
+ import { ProviderEnum } from '@dynamic-labs/sdk-api-core';
2
+ export type SocialProvider = 'apple' | 'coinbaseSocial' | 'discord' | 'epicgames' | 'facebook' | 'farcaster' | 'github' | 'google' | 'line' | 'telegram' | 'twitch' | 'twitter' | 'spotify';
3
+ type ConnectWithSocialOnHostArgs = {
4
+ clientId?: string;
5
+ oauthLoginUrl: string;
6
+ provider: ProviderEnum;
7
+ state: string;
8
+ };
2
9
  export type SocialAuthModuleMessages = {
3
10
  connectWithSocial: (args: {
4
11
  /**
@@ -14,4 +21,9 @@ export type SocialAuthModuleMessages = {
14
21
  */
15
22
  redirectPathname?: string;
16
23
  }) => Promise<void>;
24
+ /**
25
+ * Trigger a social auth connection on the host/native side
26
+ */
27
+ connectWithSocialOnHost: (args: ConnectWithSocialOnHostArgs) => Promise<void>;
17
28
  };
29
+ export {};
@@ -0,0 +1,19 @@
1
+ export type StorageMessageSource = 'localStorage' | 'sessionStorage' | 'secureStorage';
2
+ export type GetStorageItemArgs = {
3
+ source: StorageMessageSource;
4
+ key: string;
5
+ };
6
+ export type SetStorageItemArgs = {
7
+ source: StorageMessageSource;
8
+ key: string;
9
+ data: string;
10
+ };
11
+ export type DeleteStorageItemArgs = {
12
+ source: StorageMessageSource;
13
+ key: string;
14
+ };
15
+ export type StorageMessages = {
16
+ getItem: (args: GetStorageItemArgs) => Promise<string | null>;
17
+ setItem: (args: SetStorageItemArgs) => Promise<void>;
18
+ deleteItem: (args: DeleteStorageItemArgs) => Promise<void>;
19
+ };
@@ -0,0 +1,9 @@
1
+ export type TurnkeyIframeEventProxyMessages = {
2
+ initializeTurnkeyIframeEventProxy: (args: {
3
+ origins: string[];
4
+ }) => Promise<void>;
5
+ proxyEmitterTurnkeyIframeEvent: (args: {
6
+ origin: string;
7
+ data: any;
8
+ }) => Promise<void>;
9
+ };
@@ -0,0 +1,12 @@
1
+ 'use client'
2
+ 'use strict';
3
+
4
+ Object.defineProperty(exports, '__esModule', { value: true });
5
+
6
+ const userInterfaceEventNames = [
7
+ 'authFlowCancelled',
8
+ 'authFlowClosed',
9
+ 'authFlowOpened',
10
+ ];
11
+
12
+ exports.userInterfaceEventNames = userInterfaceEventNames;
@@ -7,4 +7,8 @@ export type UserInterfaceModuleMessages = {
7
7
  revealEmbeddedWalletKey: (params: {
8
8
  type: 'recovery-phrase' | 'private-key';
9
9
  }) => void;
10
+ authFlowCancelled: () => void;
11
+ authFlowClosed: () => void;
12
+ authFlowOpened: () => void;
10
13
  };
14
+ export declare const userInterfaceEventNames: ("authFlowCancelled" | "authFlowClosed" | "authFlowOpened")[];
@@ -0,0 +1,8 @@
1
+ 'use client'
2
+ const userInterfaceEventNames = [
3
+ 'authFlowCancelled',
4
+ 'authFlowClosed',
5
+ 'authFlowOpened',
6
+ ];
7
+
8
+ export { userInterfaceEventNames };
@@ -0,0 +1,12 @@
1
+ 'use client'
2
+ 'use strict';
3
+
4
+ Object.defineProperty(exports, '__esModule', { value: true });
5
+
6
+ const userWalletsEventNames = [
7
+ 'messageSigned',
8
+ 'walletAdded',
9
+ 'walletRemoved',
10
+ ];
11
+
12
+ exports.userWalletsEventNames = userWalletsEventNames;
@@ -27,4 +27,33 @@ export type WalletsModuleMessages = {
27
27
  setPrimary: (params: {
28
28
  walletId: string;
29
29
  }) => Promise<void>;
30
+ onWalletEvent: (params: WalletEventArguments & {
31
+ walletId: string;
32
+ }) => void;
33
+ handleConnectedWallet: (wallet: Partial<BaseWallet>) => Promise<boolean>;
34
+ messageSigned: (params: {
35
+ messageToSign: string;
36
+ signedMessage: string;
37
+ }) => void;
38
+ walletAdded: (params: {
39
+ wallet: BaseWallet;
40
+ userWallets: BaseWallet[];
41
+ }) => void;
42
+ walletRemoved: (params: {
43
+ wallet: BaseWallet;
44
+ userWallets: BaseWallet[];
45
+ }) => void;
46
+ };
47
+ export type WalletEvents = {
48
+ chainChange: (props: {
49
+ chain: string;
50
+ }) => void;
30
51
  };
52
+ type WalletEventArguments = {
53
+ [E in keyof WalletEvents]: {
54
+ event: E;
55
+ eventParams: Parameters<WalletEvents[E]>;
56
+ };
57
+ }[keyof WalletEvents];
58
+ export declare const userWalletsEventNames: ("messageSigned" | "walletAdded" | "walletRemoved")[];
59
+ export {};
@@ -0,0 +1,8 @@
1
+ 'use client'
2
+ const userWalletsEventNames = [
3
+ 'messageSigned',
4
+ 'walletAdded',
5
+ 'walletRemoved',
6
+ ];
7
+
8
+ export { userWalletsEventNames };
@@ -0,0 +1,10 @@
1
+ export type KernelAccountSettings = {
2
+ entryPointAddress: string;
3
+ chainId: number;
4
+ ecdsaProviderType: string | null;
5
+ kernelVersion: string;
6
+ projectId: string;
7
+ };
8
+ export type ZeroDevExtensionMessages = {
9
+ getKernelAccountSettings: () => Promise<KernelAccountSettings>;
10
+ };
@@ -1,3 +1,4 @@
1
+ export * from './AccountAbstractionMessages';
1
2
  export * from './AuthModuleMessages';
2
3
  export * from './ConsoleMessages';
3
4
  export * from './EmbeddedWalletsModuleMessages';
@@ -8,10 +9,13 @@ export * from './NetworksModuleMessages';
8
9
  export * from './OtpMessages';
9
10
  export * from './PasskeyMessages';
10
11
  export * from './PlatformServiceMessages';
12
+ export * from './ProjectSettingsMessages';
11
13
  export * from './SdkModuleMessages';
12
- export * from './SecureStorageMessages';
13
14
  export * from './SocialAuthModuleMessages';
14
15
  export * from './SolanaMessages';
16
+ export * from './StorageMessages';
17
+ export * from './TurnkeyIframeEventProxyMessages';
15
18
  export * from './UserInterfaceModuleMessages';
16
19
  export * from './WalletsModuleMessages';
17
20
  export * from './WebViewVisibilityMessages';
21
+ export * from './ZeroDevExtensionMessages';
@@ -0,0 +1,45 @@
1
+ 'use client'
2
+ 'use strict';
3
+
4
+ Object.defineProperty(exports, '__esModule', { value: true });
5
+
6
+ var utils = require('../utils/utils.cjs');
7
+
8
+ const createRequestChannelMessageSender = ({ requestType, messageSessionId, timeoutMap, onReceiveAck, messageTransport, onTimeout, params, }) => {
9
+ const ackMessageType = utils.getAckMessageType(requestType);
10
+ const message = {
11
+ args: params,
12
+ messageSessionId,
13
+ type: requestType,
14
+ };
15
+ // We must listen for acks
16
+ const handleAckMessage = ({ messageSessionId: incomingSessionId, type: incomingType, }) => {
17
+ if (incomingSessionId !== messageSessionId ||
18
+ incomingType !== ackMessageType)
19
+ return;
20
+ clearTimeout(timeoutMap[messageSessionId]);
21
+ delete timeoutMap[messageSessionId];
22
+ onReceiveAck === null || onReceiveAck === void 0 ? void 0 : onReceiveAck();
23
+ };
24
+ const sendMessage = () => {
25
+ const startTimer = () => {
26
+ const timeoutTimer = setTimeout(onTimeout, utils.TIMEOUT_DURATION);
27
+ timeoutMap[messageSessionId] = timeoutTimer;
28
+ };
29
+ // If this message transport is currently blocked, we must only start
30
+ // the timeout once the message is actually emitted
31
+ // We don't just default to this because the onEmit option is only
32
+ // present in the message transport if has the block decorator
33
+ if ('isBlocked' in messageTransport && messageTransport.isBlocked()) {
34
+ messageTransport.emit(message, { onEmit: startTimer });
35
+ return;
36
+ }
37
+ // Now we emit the event to set off the request
38
+ messageTransport.emit(message);
39
+ // We start the timer immediately since the message was not blocked
40
+ startTimer();
41
+ };
42
+ return { handleAckMessage, sendMessage };
43
+ };
44
+
45
+ exports.createRequestChannelMessageSender = createRequestChannelMessageSender;
@@ -0,0 +1,18 @@
1
+ /// <reference types="node" />
2
+ import { MessageTransportData, WithBlock } from '../../messageTransport';
3
+ import { MessageTransportWithDefaultOrigin } from '../../messageTransport/decorators/applyDefaultMessageOrigin/applyDefaultMessageOrigin';
4
+ import { RequestTypes } from '../types';
5
+ type RequestChannelMessageSenderParams<T extends RequestTypes, K extends Extract<keyof T, string>> = {
6
+ requestType: K;
7
+ messageSessionId: string;
8
+ timeoutMap: Record<string, NodeJS.Timer>;
9
+ onReceiveAck?: VoidFunction;
10
+ onTimeout: VoidFunction;
11
+ messageTransport: MessageTransportWithDefaultOrigin | WithBlock<MessageTransportWithDefaultOrigin>;
12
+ params: Parameters<T[K]>;
13
+ };
14
+ export declare const createRequestChannelMessageSender: <T extends RequestTypes, K extends Extract<keyof T, string>>({ requestType, messageSessionId, timeoutMap, onReceiveAck, messageTransport, onTimeout, params, }: RequestChannelMessageSenderParams<T, K>) => {
15
+ handleAckMessage: ({ messageSessionId: incomingSessionId, type: incomingType, }: MessageTransportData) => void;
16
+ sendMessage: () => void;
17
+ };
18
+ export {};
@@ -0,0 +1,41 @@
1
+ 'use client'
2
+ import { getAckMessageType, TIMEOUT_DURATION } from '../utils/utils.js';
3
+
4
+ const createRequestChannelMessageSender = ({ requestType, messageSessionId, timeoutMap, onReceiveAck, messageTransport, onTimeout, params, }) => {
5
+ const ackMessageType = getAckMessageType(requestType);
6
+ const message = {
7
+ args: params,
8
+ messageSessionId,
9
+ type: requestType,
10
+ };
11
+ // We must listen for acks
12
+ const handleAckMessage = ({ messageSessionId: incomingSessionId, type: incomingType, }) => {
13
+ if (incomingSessionId !== messageSessionId ||
14
+ incomingType !== ackMessageType)
15
+ return;
16
+ clearTimeout(timeoutMap[messageSessionId]);
17
+ delete timeoutMap[messageSessionId];
18
+ onReceiveAck === null || onReceiveAck === void 0 ? void 0 : onReceiveAck();
19
+ };
20
+ const sendMessage = () => {
21
+ const startTimer = () => {
22
+ const timeoutTimer = setTimeout(onTimeout, TIMEOUT_DURATION);
23
+ timeoutMap[messageSessionId] = timeoutTimer;
24
+ };
25
+ // If this message transport is currently blocked, we must only start
26
+ // the timeout once the message is actually emitted
27
+ // We don't just default to this because the onEmit option is only
28
+ // present in the message transport if has the block decorator
29
+ if ('isBlocked' in messageTransport && messageTransport.isBlocked()) {
30
+ messageTransport.emit(message, { onEmit: startTimer });
31
+ return;
32
+ }
33
+ // Now we emit the event to set off the request
34
+ messageTransport.emit(message);
35
+ // We start the timer immediately since the message was not blocked
36
+ startTimer();
37
+ };
38
+ return { handleAckMessage, sendMessage };
39
+ };
40
+
41
+ export { createRequestChannelMessageSender };
@@ -0,0 +1 @@
1
+ export * from './createRequestChannelMessageSender';
@@ -1 +1,2 @@
1
1
  export * from './requestChannel';
2
+ export * from './types';
@@ -4,32 +4,12 @@
4
4
  Object.defineProperty(exports, '__esModule', { value: true });
5
5
 
6
6
  var _tslib = require('../../_virtual/_tslib.cjs');
7
- var utils = require('@dynamic-labs/utils');
8
7
  var isSerializedError = require('../utils/isSerializedError/isSerializedError.cjs');
9
- var logger = require('../utils/logger.cjs');
10
8
  var parseErrorFromTransport = require('../utils/parseErrorFromTransport/parseErrorFromTransport.cjs');
11
9
  var serializeErrorForTransport = require('../utils/serializeErrorForTransport/serializeErrorForTransport.cjs');
10
+ var createRequestChannelMessageSender = require('./createRequestChannelMessageSender/createRequestChannelMessageSender.cjs');
11
+ var utils = require('./utils/utils.cjs');
12
12
 
13
- /** Given a request event name, returns the event name for its resolve */
14
- const getResolveMessageType = (type) => `${type}__resolve`;
15
- /** Given a request event name, returns the event name for its reject */
16
- const getRejectMessageType = (type) => `${type}__reject`;
17
- /** Given a request event name, returns the event name for its acknowledgement */
18
- const getAckMessageType = (type) => `${type}__ack`;
19
- /** Returns a "no handlers registered" error for a message type */
20
- const createNoHandlerError = (type, cleanup) => {
21
- const message = `No handlers were registered for message of type ${type}`;
22
- logger.logger.error(message);
23
- cleanup();
24
- return new utils.RequestChannelNotHandledError(message);
25
- };
26
- /**
27
- * When a request is sent, a timer will be started. If it times out before
28
- * a corresponding ack message is received, we reject the request with NO_HANDLERS_REGISTERED.
29
- *
30
- * This controls how many ms we should wait before we time out.
31
- */
32
- const TIMEOUT_DURATION = 3000;
33
13
  /**
34
14
  * Allows handling and submitting requests to and from a webview.
35
15
  * Requests are messages that (can) expect some response.
@@ -63,31 +43,24 @@ const createRequestChannel = (messageTransport) => {
63
43
  // Although we won't listen for a response, it must still be unique
64
44
  // to avoid tangling with other requests.
65
45
  const messageSessionId = getUniqueId();
66
- const ackMessageType = getAckMessageType(requestType);
67
- // Before actually emitting the event, we start listening to the
68
- // response events
69
- const handleMessage = ({ messageSessionId: incomingSessionId, type: incomingType, }) => {
70
- if (incomingSessionId !== messageSessionId ||
71
- incomingType !== ackMessageType)
72
- return;
73
- clearTimeout(timeoutMap[messageSessionId]);
74
- delete timeoutMap[messageSessionId];
75
- resolve();
76
- cleanup();
77
- };
78
- const cleanup = () => messageTransport.off(handleMessage);
79
- messageTransport.on(handleMessage);
80
- // Now we emit the event to set off the request
81
- messageTransport.emit({
82
- args: params,
46
+ const { handleAckMessage, sendMessage } = createRequestChannelMessageSender.createRequestChannelMessageSender({
83
47
  messageSessionId,
84
- type: requestType,
48
+ messageTransport,
49
+ onReceiveAck: () => {
50
+ cleanupMessageHandler();
51
+ resolve();
52
+ },
53
+ onTimeout: () => {
54
+ cleanupMessageHandler();
55
+ reject(utils.createNoHandlerError(requestType));
56
+ },
57
+ params,
58
+ requestType,
59
+ timeoutMap,
85
60
  });
86
- // And start the time out timer
87
- const timeoutTimer = setTimeout(() => {
88
- reject(createNoHandlerError(requestType, cleanup));
89
- }, TIMEOUT_DURATION);
90
- timeoutMap[messageSessionId] = timeoutTimer;
61
+ const cleanupMessageHandler = () => messageTransport.off(handleAckMessage);
62
+ messageTransport.on(handleAckMessage);
63
+ sendMessage();
91
64
  }),
92
65
  handle: (requestType, handler) => {
93
66
  const messageHandler = (_a) => _tslib.__awaiter(void 0, [_a], void 0, function* ({ args, messageSessionId, type: incomingType, }) {
@@ -97,7 +70,7 @@ const createRequestChannel = (messageTransport) => {
97
70
  messageTransport.emit({
98
71
  args: [],
99
72
  messageSessionId,
100
- type: getAckMessageType(requestType),
73
+ type: utils.getAckMessageType(requestType),
101
74
  });
102
75
  const result = handler(...args);
103
76
  // If the handler doesn't return a promise,
@@ -109,14 +82,14 @@ const createRequestChannel = (messageTransport) => {
109
82
  messageTransport.emit({
110
83
  args: [response],
111
84
  messageSessionId,
112
- type: getResolveMessageType(requestType),
85
+ type: utils.getResolveMessageType(requestType),
113
86
  });
114
87
  }
115
88
  catch (error) {
116
89
  messageTransport.emit({
117
90
  args: [serializeErrorForTransport.serializeErrorForTransport(error)],
118
91
  messageSessionId,
119
- type: getRejectMessageType(requestType),
92
+ type: utils.getRejectMessageType(requestType),
120
93
  });
121
94
  }
122
95
  });
@@ -127,52 +100,49 @@ const createRequestChannel = (messageTransport) => {
127
100
  },
128
101
  request: (requestType, ...params) => new Promise((resolve, reject) => {
129
102
  // Generate the unique id for this message exchange session
103
+ // Although we won't listen for a response, it must still be unique
104
+ // to avoid tangling with other requests.
130
105
  const messageSessionId = getUniqueId();
131
- const resolveMessageType = getResolveMessageType(requestType);
132
- const rejectMessageType = getRejectMessageType(requestType);
133
- const ackMessageType = getAckMessageType(requestType);
134
- // Before actually emitting the event, we start listening to the
135
- // response events
136
- const handleMessage = ({ args: [result], messageSessionId: incomingSessionId, type: incomingType, }) => {
137
- if (incomingSessionId !== messageSessionId)
138
- return;
139
- if (incomingType === ackMessageType) {
140
- clearTimeout(timeoutMap[messageSessionId]);
141
- delete timeoutMap[messageSessionId];
106
+ const resolveMessageType = utils.getResolveMessageType(requestType);
107
+ const rejectMessageType = utils.getRejectMessageType(requestType);
108
+ const { handleAckMessage, sendMessage } = createRequestChannelMessageSender.createRequestChannelMessageSender({
109
+ messageSessionId,
110
+ messageTransport,
111
+ onTimeout: () => {
112
+ cleanupMessageHandler();
113
+ reject(utils.createNoHandlerError(requestType));
114
+ },
115
+ params,
116
+ requestType,
117
+ timeoutMap,
118
+ });
119
+ // We also need to listen to resolve and reject messages, besides acks
120
+ const handleMessage = (message) => {
121
+ if (message.messageSessionId !== messageSessionId)
142
122
  return;
143
- }
123
+ const { args: [result], type: incomingType, } = message;
144
124
  if (incomingType === resolveMessageType) {
125
+ cleanupMessageHandler();
145
126
  resolve(result);
146
- cleanup();
147
127
  return;
148
128
  }
149
129
  if (incomingType === rejectMessageType) {
130
+ cleanupMessageHandler();
150
131
  if (isSerializedError.isSerializedError(result)) {
151
132
  reject(parseErrorFromTransport.parseErrorFromTransport(result));
152
133
  }
153
134
  else {
154
135
  reject(result);
155
136
  }
156
- cleanup();
137
+ return;
157
138
  }
139
+ handleAckMessage(message);
158
140
  };
159
- const cleanup = () => messageTransport.off(handleMessage);
141
+ const cleanupMessageHandler = () => messageTransport.off(handleMessage);
160
142
  messageTransport.on(handleMessage);
161
- // And start the time out timer
162
- const timeoutTimer = setTimeout(() => reject(createNoHandlerError(requestType, cleanup)), TIMEOUT_DURATION);
163
- timeoutMap[messageSessionId] = timeoutTimer;
164
- // Now we emit the event to set off the request
165
- messageTransport.emit({
166
- args: params,
167
- messageSessionId,
168
- type: requestType,
169
- });
143
+ sendMessage();
170
144
  }),
171
145
  };
172
146
  };
173
147
 
174
- exports.TIMEOUT_DURATION = TIMEOUT_DURATION;
175
148
  exports.createRequestChannel = createRequestChannel;
176
- exports.getAckMessageType = getAckMessageType;
177
- exports.getRejectMessageType = getRejectMessageType;
178
- exports.getResolveMessageType = getResolveMessageType;