@dynamic-labs/message-transport 4.0.0-alpha.4 → 4.0.0-alpha.40

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 +349 -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
@@ -10,40 +10,46 @@
10
10
  const makeWaitForUnblock = ({ messageTransport, bypassBlockIf = () => false, }) => {
11
11
  /** Whether to block any new messages */
12
12
  let blocked = true;
13
- /** Messages pending to be sent once unblocked */
13
+ /**
14
+ * Messages pending to be sent once unblocked, along with their onEmit callbacks
15
+ */
14
16
  let pendingMessages = [];
15
17
  /**
16
18
  * Ids of incoming message sessions.
17
19
  * We don't want to block responses to these messages.
18
20
  */
19
21
  const bypassedMessageSessionIds = new Set();
20
- const extendedTransport = {
21
- emit: (message) => {
22
+ return {
23
+ emit: (message, options) => {
24
+ const { onEmit } = options !== null && options !== void 0 ? options : {};
22
25
  if (bypassBlockIf(message) && blocked) {
23
26
  bypassedMessageSessionIds.add(message.messageSessionId);
24
27
  }
25
28
  // Even if blocking, we still want to let through ids of messages that
26
29
  // can bypass the block (this includes any responses, since they share the same id)
27
30
  if (blocked && !bypassedMessageSessionIds.has(message.messageSessionId)) {
28
- pendingMessages.push(message);
31
+ pendingMessages.push({ message, onEmit });
29
32
  return;
30
33
  }
31
34
  messageTransport.emit(message);
35
+ onEmit === null || onEmit === void 0 ? void 0 : onEmit();
32
36
  },
37
+ isBlocked: () => blocked,
33
38
  off: (callback) => messageTransport.off(callback),
34
39
  on: (callback) => messageTransport.on(callback),
40
+ unblock: () => {
41
+ if (!blocked)
42
+ return;
43
+ blocked = false;
44
+ // Emit all stored messages
45
+ for (const { message, onEmit } of pendingMessages) {
46
+ messageTransport.emit(message);
47
+ onEmit === null || onEmit === void 0 ? void 0 : onEmit();
48
+ }
49
+ pendingMessages = [];
50
+ bypassedMessageSessionIds.clear();
51
+ },
35
52
  };
36
- const unblock = () => {
37
- if (!blocked)
38
- return;
39
- blocked = false;
40
- // Emit all stored messages
41
- for (const message of pendingMessages)
42
- messageTransport.emit(message);
43
- pendingMessages = [];
44
- bypassedMessageSessionIds.clear();
45
- };
46
- return Object.assign(Object.assign({}, extendedTransport), { unblock });
47
53
  };
48
54
 
49
55
  export { makeWaitForUnblock };
@@ -0,0 +1,15 @@
1
+ import { BaseWallet } from '@dynamic-labs/types';
2
+ export type AccountAbstractionIsSmartWalletArgs = {
3
+ wallet: BaseWallet;
4
+ };
5
+ export type AccountAbstractionGetEOAWalletArgs = {
6
+ wallet: BaseWallet;
7
+ };
8
+ export type AccountAbstractionGetSmartWalletArgs = {
9
+ wallet: BaseWallet;
10
+ };
11
+ export type AccountAbstractionMessages = {
12
+ isSmartWallet: (args: AccountAbstractionIsSmartWalletArgs) => Promise<boolean>;
13
+ getEOAWallet: (args: AccountAbstractionGetEOAWalletArgs) => Promise<BaseWallet | null>;
14
+ getSmartWallet: (args: AccountAbstractionGetSmartWalletArgs) => Promise<BaseWallet | null>;
15
+ };
@@ -0,0 +1,14 @@
1
+ 'use client'
2
+ 'use strict';
3
+
4
+ Object.defineProperty(exports, '__esModule', { value: true });
5
+
6
+ const authEventNames = [
7
+ 'authSuccess',
8
+ 'authFailed',
9
+ 'authInit',
10
+ 'loggedOut',
11
+ 'userProfileUpdated',
12
+ ];
13
+
14
+ exports.authEventNames = authEventNames;
@@ -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' | 'tiktok' | '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';