@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.
- package/CHANGELOG.md +261 -0
- package/package.cjs +8 -0
- package/package.js +4 -0
- package/package.json +9 -15
- package/src/index.cjs +14 -1
- package/src/index.d.ts +3 -2
- package/src/index.js +9 -0
- package/src/messageTransport/decorators/makeWaitForInitEvent/makeWaitForInitEvent.d.ts +4 -9
- package/src/messageTransport/decorators/makeWaitForUnblock/makeWaitForUnblock.cjs +21 -15
- package/src/messageTransport/decorators/makeWaitForUnblock/makeWaitForUnblock.d.ts +16 -8
- package/src/messageTransport/decorators/makeWaitForUnblock/makeWaitForUnblock.js +21 -15
- package/src/messageTypes/AccountAbstractionMessages.d.ts +15 -0
- package/src/messageTypes/AuthModuleMessages.cjs +14 -0
- package/src/messageTypes/AuthModuleMessages.d.ts +12 -1
- package/src/messageTypes/AuthModuleMessages.js +10 -0
- package/src/messageTypes/EmbeddedWalletsModuleMessages.cjs +10 -0
- package/src/messageTypes/EmbeddedWalletsModuleMessages.d.ts +5 -1
- package/src/messageTypes/EmbeddedWalletsModuleMessages.js +6 -0
- package/src/messageTypes/ExternalAuthMessages.d.ts +3 -2
- package/src/messageTypes/OtpMessages.cjs +14 -0
- package/src/messageTypes/OtpMessages.d.ts +10 -0
- package/src/messageTypes/OtpMessages.js +9 -0
- package/src/messageTypes/PasskeyMessages.d.ts +6 -0
- package/src/messageTypes/ProjectSettingsMessages.d.ts +6 -0
- package/src/messageTypes/SocialAuthModuleMessages.d.ts +13 -1
- package/src/messageTypes/StorageMessages.d.ts +19 -0
- package/src/messageTypes/TurnkeyIframeEventProxyMessages.d.ts +9 -0
- package/src/messageTypes/UserInterfaceModuleMessages.cjs +12 -0
- package/src/messageTypes/UserInterfaceModuleMessages.d.ts +4 -0
- package/src/messageTypes/UserInterfaceModuleMessages.js +8 -0
- package/src/messageTypes/WalletsModuleMessages.cjs +12 -0
- package/src/messageTypes/WalletsModuleMessages.d.ts +29 -0
- package/src/messageTypes/WalletsModuleMessages.js +8 -0
- package/src/messageTypes/ZeroDevExtensionMessages.d.ts +10 -0
- package/src/messageTypes/index.d.ts +5 -1
- package/src/requestChannel/createRequestChannelMessageSender/createRequestChannelMessageSender.cjs +45 -0
- package/src/requestChannel/createRequestChannelMessageSender/createRequestChannelMessageSender.d.ts +18 -0
- package/src/requestChannel/createRequestChannelMessageSender/createRequestChannelMessageSender.js +41 -0
- package/src/requestChannel/createRequestChannelMessageSender/index.d.ts +1 -0
- package/src/requestChannel/index.d.ts +1 -0
- package/src/requestChannel/requestChannel.cjs +46 -76
- package/src/requestChannel/requestChannel.d.ts +3 -69
- package/src/requestChannel/requestChannel.js +42 -68
- package/src/requestChannel/types.d.ts +55 -0
- package/src/requestChannel/utils/index.d.ts +1 -0
- package/src/requestChannel/utils/utils.cjs +33 -0
- package/src/requestChannel/utils/utils.d.ts +16 -0
- package/src/requestChannel/utils/utils.js +25 -0
- package/src/store/createEventEmitterForMessages/createEventEmitterForMessages.cjs +4 -5
- package/src/store/createEventEmitterForMessages/createEventEmitterForMessages.d.ts +5 -8
- package/src/store/createEventEmitterForMessages/createEventEmitterForMessages.js +4 -5
- package/src/store/store.cjs +1 -1
- package/src/store/store.js +1 -1
- package/src/store/types.d.ts +3 -11
- package/src/types.d.ts +5 -0
- package/src/utils/parseErrorFromTransport/parseErrorFromTransport.cjs +11 -0
- package/src/utils/parseErrorFromTransport/parseErrorFromTransport.d.ts +1 -1
- package/src/utils/parseErrorFromTransport/parseErrorFromTransport.js +11 -0
- package/src/utils/serializeErrorForTransport/serializeErrorForTransport.cjs +3 -0
- package/src/utils/serializeErrorForTransport/serializeErrorForTransport.js +3 -0
- package/src/messageTypes/SecureStorageMessages.d.ts +0 -5
|
@@ -1,71 +1,6 @@
|
|
|
1
|
+
import { WithBlock } from '../messageTransport';
|
|
1
2
|
import { MessageTransportWithDefaultOrigin } from '../messageTransport/decorators/applyDefaultMessageOrigin/applyDefaultMessageOrigin';
|
|
2
|
-
|
|
3
|
-
* An object that defines request types, and whether they expect a response
|
|
4
|
-
*/
|
|
5
|
-
export type RequestTypes = Record<string, (...params: any[]) => Promise<any> | void>;
|
|
6
|
-
/**
|
|
7
|
-
* Only the request types from T that return promises
|
|
8
|
-
* i.e. those that expect a response
|
|
9
|
-
*/
|
|
10
|
-
type TypesExpectingResponse<T extends RequestTypes> = Extract<{
|
|
11
|
-
[K in keyof T]: ReturnType<T[K]> extends Promise<any> ? K : never;
|
|
12
|
-
}[keyof T], string>;
|
|
13
|
-
export type RequestChannel<T extends RequestTypes> = {
|
|
14
|
-
/**
|
|
15
|
-
* Listens to incoming requests of this type, and calls the handler when they arrive.
|
|
16
|
-
* If the type of this request expects some response, the handler must return a promise
|
|
17
|
-
* that resolves to this response.
|
|
18
|
-
*
|
|
19
|
-
* @returns an unsubscribe function.
|
|
20
|
-
*/
|
|
21
|
-
handle: <K extends Extract<keyof T, string>>(requestType: K, handler: T[K]) => VoidFunction;
|
|
22
|
-
/**
|
|
23
|
-
* Triggers handlers for this request type, with the given params.
|
|
24
|
-
* Doesn't expect a response. Resolves as soon as the message is acknowledged by
|
|
25
|
-
* any handler.
|
|
26
|
-
*
|
|
27
|
-
* If no handlers emit an ack for this message, this will reject.
|
|
28
|
-
*
|
|
29
|
-
* Lifetime of an "emit" message:
|
|
30
|
-
* 1. "Emit" message is sent.
|
|
31
|
-
* 2. A handler receives the message.
|
|
32
|
-
* 3. The handler immediately emits an ack message for it, acknowledging it.
|
|
33
|
-
* 4. This method's promise resolves.
|
|
34
|
-
*/
|
|
35
|
-
emit: <K extends Extract<keyof T, string>>(requestName: K, ...params: Parameters<T[K]>) => Promise<void>;
|
|
36
|
-
/**
|
|
37
|
-
* Triggers handlers for this request type, with the given params.
|
|
38
|
-
* As opposed to emit, this expects a response message. A handler must still
|
|
39
|
-
* acknowledge this message, but the promise will only resolve when the handler
|
|
40
|
-
* emits back a response message. The promise resolves with whatever data was sent
|
|
41
|
-
* in the response.
|
|
42
|
-
*
|
|
43
|
-
* If no handlers emit an ack for this message, or if a handler responds
|
|
44
|
-
* with a failure, this will reject.
|
|
45
|
-
*
|
|
46
|
-
* Lifetime of a "request" message:
|
|
47
|
-
* 1. "Request" message is sent.
|
|
48
|
-
* 2. A handler receives the message.
|
|
49
|
-
* 3. The handler immediately emits an ack message for it, acknowledging it.
|
|
50
|
-
* 4. The handler performs the requested action.
|
|
51
|
-
* 5. The handler emits a response message.
|
|
52
|
-
* 6. This method's promise resolves with the response's data.
|
|
53
|
-
*/
|
|
54
|
-
request: <K extends TypesExpectingResponse<T>>(requestName: K, ...params: Parameters<T[K]>) => ReturnType<T[K]>;
|
|
55
|
-
};
|
|
56
|
-
/** Given a request event name, returns the event name for its resolve */
|
|
57
|
-
export declare const getResolveMessageType: (type: string) => string;
|
|
58
|
-
/** Given a request event name, returns the event name for its reject */
|
|
59
|
-
export declare const getRejectMessageType: (type: string) => string;
|
|
60
|
-
/** Given a request event name, returns the event name for its acknowledgement */
|
|
61
|
-
export declare const getAckMessageType: (type: string) => string;
|
|
62
|
-
/**
|
|
63
|
-
* When a request is sent, a timer will be started. If it times out before
|
|
64
|
-
* a corresponding ack message is received, we reject the request with NO_HANDLERS_REGISTERED.
|
|
65
|
-
*
|
|
66
|
-
* This controls how many ms we should wait before we time out.
|
|
67
|
-
*/
|
|
68
|
-
export declare const TIMEOUT_DURATION = 3000;
|
|
3
|
+
import { RequestChannel, RequestTypes } from './types';
|
|
69
4
|
/**
|
|
70
5
|
* Allows handling and submitting requests to and from a webview.
|
|
71
6
|
* Requests are messages that (can) expect some response.
|
|
@@ -84,5 +19,4 @@ export declare const TIMEOUT_DURATION = 3000;
|
|
|
84
19
|
*
|
|
85
20
|
* This is an abstraction built on top of the MessageTransport interface.
|
|
86
21
|
*/
|
|
87
|
-
export declare const createRequestChannel: <T extends RequestTypes = never>(messageTransport: MessageTransportWithDefaultOrigin) => RequestChannel<T>;
|
|
88
|
-
export {};
|
|
22
|
+
export declare const createRequestChannel: <T extends RequestTypes = never>(messageTransport: MessageTransportWithDefaultOrigin | WithBlock<MessageTransportWithDefaultOrigin>) => RequestChannel<T>;
|
|
@@ -1,31 +1,11 @@
|
|
|
1
1
|
'use client'
|
|
2
2
|
import { __awaiter } from '../../_virtual/_tslib.js';
|
|
3
|
-
import { RequestChannelNotHandledError } from '@dynamic-labs/utils';
|
|
4
3
|
import { isSerializedError } from '../utils/isSerializedError/isSerializedError.js';
|
|
5
|
-
import { logger } from '../utils/logger.js';
|
|
6
4
|
import { parseErrorFromTransport } from '../utils/parseErrorFromTransport/parseErrorFromTransport.js';
|
|
7
5
|
import { serializeErrorForTransport } from '../utils/serializeErrorForTransport/serializeErrorForTransport.js';
|
|
6
|
+
import { createRequestChannelMessageSender } from './createRequestChannelMessageSender/createRequestChannelMessageSender.js';
|
|
7
|
+
import { createNoHandlerError, getAckMessageType, getResolveMessageType, getRejectMessageType } from './utils/utils.js';
|
|
8
8
|
|
|
9
|
-
/** Given a request event name, returns the event name for its resolve */
|
|
10
|
-
const getResolveMessageType = (type) => `${type}__resolve`;
|
|
11
|
-
/** Given a request event name, returns the event name for its reject */
|
|
12
|
-
const getRejectMessageType = (type) => `${type}__reject`;
|
|
13
|
-
/** Given a request event name, returns the event name for its acknowledgement */
|
|
14
|
-
const getAckMessageType = (type) => `${type}__ack`;
|
|
15
|
-
/** Returns a "no handlers registered" error for a message type */
|
|
16
|
-
const createNoHandlerError = (type, cleanup) => {
|
|
17
|
-
const message = `No handlers were registered for message of type ${type}`;
|
|
18
|
-
logger.error(message);
|
|
19
|
-
cleanup();
|
|
20
|
-
return new RequestChannelNotHandledError(message);
|
|
21
|
-
};
|
|
22
|
-
/**
|
|
23
|
-
* When a request is sent, a timer will be started. If it times out before
|
|
24
|
-
* a corresponding ack message is received, we reject the request with NO_HANDLERS_REGISTERED.
|
|
25
|
-
*
|
|
26
|
-
* This controls how many ms we should wait before we time out.
|
|
27
|
-
*/
|
|
28
|
-
const TIMEOUT_DURATION = 3000;
|
|
29
9
|
/**
|
|
30
10
|
* Allows handling and submitting requests to and from a webview.
|
|
31
11
|
* Requests are messages that (can) expect some response.
|
|
@@ -59,31 +39,24 @@ const createRequestChannel = (messageTransport) => {
|
|
|
59
39
|
// Although we won't listen for a response, it must still be unique
|
|
60
40
|
// to avoid tangling with other requests.
|
|
61
41
|
const messageSessionId = getUniqueId();
|
|
62
|
-
const
|
|
63
|
-
// Before actually emitting the event, we start listening to the
|
|
64
|
-
// response events
|
|
65
|
-
const handleMessage = ({ messageSessionId: incomingSessionId, type: incomingType, }) => {
|
|
66
|
-
if (incomingSessionId !== messageSessionId ||
|
|
67
|
-
incomingType !== ackMessageType)
|
|
68
|
-
return;
|
|
69
|
-
clearTimeout(timeoutMap[messageSessionId]);
|
|
70
|
-
delete timeoutMap[messageSessionId];
|
|
71
|
-
resolve();
|
|
72
|
-
cleanup();
|
|
73
|
-
};
|
|
74
|
-
const cleanup = () => messageTransport.off(handleMessage);
|
|
75
|
-
messageTransport.on(handleMessage);
|
|
76
|
-
// Now we emit the event to set off the request
|
|
77
|
-
messageTransport.emit({
|
|
78
|
-
args: params,
|
|
42
|
+
const { handleAckMessage, sendMessage } = createRequestChannelMessageSender({
|
|
79
43
|
messageSessionId,
|
|
80
|
-
|
|
44
|
+
messageTransport,
|
|
45
|
+
onReceiveAck: () => {
|
|
46
|
+
cleanupMessageHandler();
|
|
47
|
+
resolve();
|
|
48
|
+
},
|
|
49
|
+
onTimeout: () => {
|
|
50
|
+
cleanupMessageHandler();
|
|
51
|
+
reject(createNoHandlerError(requestType));
|
|
52
|
+
},
|
|
53
|
+
params,
|
|
54
|
+
requestType,
|
|
55
|
+
timeoutMap,
|
|
81
56
|
});
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
}, TIMEOUT_DURATION);
|
|
86
|
-
timeoutMap[messageSessionId] = timeoutTimer;
|
|
57
|
+
const cleanupMessageHandler = () => messageTransport.off(handleAckMessage);
|
|
58
|
+
messageTransport.on(handleAckMessage);
|
|
59
|
+
sendMessage();
|
|
87
60
|
}),
|
|
88
61
|
handle: (requestType, handler) => {
|
|
89
62
|
const messageHandler = (_a) => __awaiter(void 0, [_a], void 0, function* ({ args, messageSessionId, type: incomingType, }) {
|
|
@@ -123,48 +96,49 @@ const createRequestChannel = (messageTransport) => {
|
|
|
123
96
|
},
|
|
124
97
|
request: (requestType, ...params) => new Promise((resolve, reject) => {
|
|
125
98
|
// Generate the unique id for this message exchange session
|
|
99
|
+
// Although we won't listen for a response, it must still be unique
|
|
100
|
+
// to avoid tangling with other requests.
|
|
126
101
|
const messageSessionId = getUniqueId();
|
|
127
102
|
const resolveMessageType = getResolveMessageType(requestType);
|
|
128
103
|
const rejectMessageType = getRejectMessageType(requestType);
|
|
129
|
-
const
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
104
|
+
const { handleAckMessage, sendMessage } = createRequestChannelMessageSender({
|
|
105
|
+
messageSessionId,
|
|
106
|
+
messageTransport,
|
|
107
|
+
onTimeout: () => {
|
|
108
|
+
cleanupMessageHandler();
|
|
109
|
+
reject(createNoHandlerError(requestType));
|
|
110
|
+
},
|
|
111
|
+
params,
|
|
112
|
+
requestType,
|
|
113
|
+
timeoutMap,
|
|
114
|
+
});
|
|
115
|
+
// We also need to listen to resolve and reject messages, besides acks
|
|
116
|
+
const handleMessage = (message) => {
|
|
117
|
+
if (message.messageSessionId !== messageSessionId)
|
|
138
118
|
return;
|
|
139
|
-
}
|
|
119
|
+
const { args: [result], type: incomingType, } = message;
|
|
140
120
|
if (incomingType === resolveMessageType) {
|
|
121
|
+
cleanupMessageHandler();
|
|
141
122
|
resolve(result);
|
|
142
|
-
cleanup();
|
|
143
123
|
return;
|
|
144
124
|
}
|
|
145
125
|
if (incomingType === rejectMessageType) {
|
|
126
|
+
cleanupMessageHandler();
|
|
146
127
|
if (isSerializedError(result)) {
|
|
147
128
|
reject(parseErrorFromTransport(result));
|
|
148
129
|
}
|
|
149
130
|
else {
|
|
150
131
|
reject(result);
|
|
151
132
|
}
|
|
152
|
-
|
|
133
|
+
return;
|
|
153
134
|
}
|
|
135
|
+
handleAckMessage(message);
|
|
154
136
|
};
|
|
155
|
-
const
|
|
137
|
+
const cleanupMessageHandler = () => messageTransport.off(handleMessage);
|
|
156
138
|
messageTransport.on(handleMessage);
|
|
157
|
-
|
|
158
|
-
const timeoutTimer = setTimeout(() => reject(createNoHandlerError(requestType, cleanup)), TIMEOUT_DURATION);
|
|
159
|
-
timeoutMap[messageSessionId] = timeoutTimer;
|
|
160
|
-
// Now we emit the event to set off the request
|
|
161
|
-
messageTransport.emit({
|
|
162
|
-
args: params,
|
|
163
|
-
messageSessionId,
|
|
164
|
-
type: requestType,
|
|
165
|
-
});
|
|
139
|
+
sendMessage();
|
|
166
140
|
}),
|
|
167
141
|
};
|
|
168
142
|
};
|
|
169
143
|
|
|
170
|
-
export {
|
|
144
|
+
export { createRequestChannel };
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An object that defines request types, and whether they expect a response
|
|
3
|
+
*/
|
|
4
|
+
export type RequestTypes = Record<string, (...params: any[]) => Promise<any> | void>;
|
|
5
|
+
/**
|
|
6
|
+
* Only the request types from T that return promises
|
|
7
|
+
* i.e. those that expect a response
|
|
8
|
+
*/
|
|
9
|
+
type TypesExpectingResponse<T extends RequestTypes> = Extract<{
|
|
10
|
+
[K in keyof T]: ReturnType<T[K]> extends Promise<any> ? K : never;
|
|
11
|
+
}[keyof T], string>;
|
|
12
|
+
export type RequestChannel<T extends RequestTypes> = {
|
|
13
|
+
/**
|
|
14
|
+
* Listens to incoming requests of this type, and calls the handler when they arrive.
|
|
15
|
+
* If the type of this request expects some response, the handler must return a promise
|
|
16
|
+
* that resolves to this response.
|
|
17
|
+
*
|
|
18
|
+
* @returns an unsubscribe function.
|
|
19
|
+
*/
|
|
20
|
+
handle: <K extends Extract<keyof T, string>>(requestType: K, handler: T[K]) => VoidFunction;
|
|
21
|
+
/**
|
|
22
|
+
* Triggers handlers for this request type, with the given params.
|
|
23
|
+
* Doesn't expect a response. Resolves as soon as the message is acknowledged by
|
|
24
|
+
* any handler.
|
|
25
|
+
*
|
|
26
|
+
* If no handlers emit an ack for this message, this will reject.
|
|
27
|
+
*
|
|
28
|
+
* Lifetime of an "emit" message:
|
|
29
|
+
* 1. "Emit" message is sent.
|
|
30
|
+
* 2. A handler receives the message.
|
|
31
|
+
* 3. The handler immediately emits an ack message for it, acknowledging it.
|
|
32
|
+
* 4. This method's promise resolves.
|
|
33
|
+
*/
|
|
34
|
+
emit: <K extends Extract<keyof T, string>>(requestName: K, ...params: Parameters<T[K]>) => Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Triggers handlers for this request type, with the given params.
|
|
37
|
+
* As opposed to emit, this expects a response message. A handler must still
|
|
38
|
+
* acknowledge this message, but the promise will only resolve when the handler
|
|
39
|
+
* emits back a response message. The promise resolves with whatever data was sent
|
|
40
|
+
* in the response.
|
|
41
|
+
*
|
|
42
|
+
* If no handlers emit an ack for this message, or if a handler responds
|
|
43
|
+
* with a failure, this will reject.
|
|
44
|
+
*
|
|
45
|
+
* Lifetime of a "request" message:
|
|
46
|
+
* 1. "Request" message is sent.
|
|
47
|
+
* 2. A handler receives the message.
|
|
48
|
+
* 3. The handler immediately emits an ack message for it, acknowledging it.
|
|
49
|
+
* 4. The handler performs the requested action.
|
|
50
|
+
* 5. The handler emits a response message.
|
|
51
|
+
* 6. This method's promise resolves with the response's data.
|
|
52
|
+
*/
|
|
53
|
+
request: <K extends TypesExpectingResponse<T>>(requestName: K, ...params: Parameters<T[K]>) => ReturnType<T[K]>;
|
|
54
|
+
};
|
|
55
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './utils';
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
5
|
+
|
|
6
|
+
var utils = require('@dynamic-labs/utils');
|
|
7
|
+
var logger = require('../../utils/logger.cjs');
|
|
8
|
+
|
|
9
|
+
/** Given a request event name, returns the event name for its resolve */
|
|
10
|
+
const getResolveMessageType = (type) => `${type}__resolve`;
|
|
11
|
+
/** Given a request event name, returns the event name for its reject */
|
|
12
|
+
const getRejectMessageType = (type) => `${type}__reject`;
|
|
13
|
+
/** Given a request event name, returns the event name for its acknowledgement */
|
|
14
|
+
const getAckMessageType = (type) => `${type}__ack`;
|
|
15
|
+
/** Returns a "no handlers registered" error for a message type */
|
|
16
|
+
const createNoHandlerError = (type) => {
|
|
17
|
+
const message = `No handlers were registered for message of type ${type}`;
|
|
18
|
+
logger.logger.error(message);
|
|
19
|
+
return new utils.RequestChannelNotHandledError(message);
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* When a request is sent, a timer will be started. If it times out before
|
|
23
|
+
* a corresponding ack message is received, we reject the request with NO_HANDLERS_REGISTERED.
|
|
24
|
+
*
|
|
25
|
+
* This controls how many ms we should wait before we time out.
|
|
26
|
+
*/
|
|
27
|
+
const TIMEOUT_DURATION = 3000;
|
|
28
|
+
|
|
29
|
+
exports.TIMEOUT_DURATION = TIMEOUT_DURATION;
|
|
30
|
+
exports.createNoHandlerError = createNoHandlerError;
|
|
31
|
+
exports.getAckMessageType = getAckMessageType;
|
|
32
|
+
exports.getRejectMessageType = getRejectMessageType;
|
|
33
|
+
exports.getResolveMessageType = getResolveMessageType;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { RequestChannelNotHandledError } from '@dynamic-labs/utils';
|
|
2
|
+
/** Given a request event name, returns the event name for its resolve */
|
|
3
|
+
export declare const getResolveMessageType: (type: string) => string;
|
|
4
|
+
/** Given a request event name, returns the event name for its reject */
|
|
5
|
+
export declare const getRejectMessageType: (type: string) => string;
|
|
6
|
+
/** Given a request event name, returns the event name for its acknowledgement */
|
|
7
|
+
export declare const getAckMessageType: (type: string) => string;
|
|
8
|
+
/** Returns a "no handlers registered" error for a message type */
|
|
9
|
+
export declare const createNoHandlerError: (type: string) => RequestChannelNotHandledError;
|
|
10
|
+
/**
|
|
11
|
+
* When a request is sent, a timer will be started. If it times out before
|
|
12
|
+
* a corresponding ack message is received, we reject the request with NO_HANDLERS_REGISTERED.
|
|
13
|
+
*
|
|
14
|
+
* This controls how many ms we should wait before we time out.
|
|
15
|
+
*/
|
|
16
|
+
export declare const TIMEOUT_DURATION = 3000;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
import { RequestChannelNotHandledError } from '@dynamic-labs/utils';
|
|
3
|
+
import { logger } from '../../utils/logger.js';
|
|
4
|
+
|
|
5
|
+
/** Given a request event name, returns the event name for its resolve */
|
|
6
|
+
const getResolveMessageType = (type) => `${type}__resolve`;
|
|
7
|
+
/** Given a request event name, returns the event name for its reject */
|
|
8
|
+
const getRejectMessageType = (type) => `${type}__reject`;
|
|
9
|
+
/** Given a request event name, returns the event name for its acknowledgement */
|
|
10
|
+
const getAckMessageType = (type) => `${type}__ack`;
|
|
11
|
+
/** Returns a "no handlers registered" error for a message type */
|
|
12
|
+
const createNoHandlerError = (type) => {
|
|
13
|
+
const message = `No handlers were registered for message of type ${type}`;
|
|
14
|
+
logger.error(message);
|
|
15
|
+
return new RequestChannelNotHandledError(message);
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* When a request is sent, a timer will be started. If it times out before
|
|
19
|
+
* a corresponding ack message is received, we reject the request with NO_HANDLERS_REGISTERED.
|
|
20
|
+
*
|
|
21
|
+
* This controls how many ms we should wait before we time out.
|
|
22
|
+
*/
|
|
23
|
+
const TIMEOUT_DURATION = 3000;
|
|
24
|
+
|
|
25
|
+
export { TIMEOUT_DURATION, createNoHandlerError, getAckMessageType, getRejectMessageType, getResolveMessageType };
|
|
@@ -11,13 +11,12 @@ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'defau
|
|
|
11
11
|
var EventEmitter__default = /*#__PURE__*/_interopDefaultLegacy(EventEmitter);
|
|
12
12
|
|
|
13
13
|
// There are way too many "any"s in this file. They are necessary because otherwise the generics won't work
|
|
14
|
-
function createEventEmitterForMessages({ messageTransport, initialEventEmitter,
|
|
14
|
+
function createEventEmitterForMessages({ messageTransport, initialEventEmitter, eventNames, }) {
|
|
15
15
|
const events = initialEventEmitter !== null && initialEventEmitter !== void 0 ? initialEventEmitter : new EventEmitter__default["default"]();
|
|
16
16
|
const requestChannel$1 = requestChannel.createRequestChannel(messageTransport);
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
});
|
|
17
|
+
for (const eventName of eventNames) {
|
|
18
|
+
requestChannel$1.handle(eventName, (...payload) => events.emit(eventName, ...payload));
|
|
19
|
+
}
|
|
21
20
|
return events;
|
|
22
21
|
}
|
|
23
22
|
|
|
@@ -1,22 +1,19 @@
|
|
|
1
1
|
import EventEmitter from 'eventemitter3';
|
|
2
2
|
import { MessageTransportWithDefaultOrigin } from '../../messageTransport';
|
|
3
|
-
export type MessagesForEventEmitter<T extends Record<string, (...args: any[]) => any>, U extends string> = {
|
|
4
|
-
eventEmitted: <E extends keyof T>(key: U, eventName: E, payload: Parameters<T[E]>) => void;
|
|
5
|
-
};
|
|
6
3
|
/**
|
|
7
4
|
* Use this function when you want to get an event emitter that will raise events for
|
|
8
|
-
* messages
|
|
5
|
+
* messages that have a name inside eventNames
|
|
9
6
|
*/
|
|
10
|
-
export declare function createEventEmitterForMessages<T extends Record<string, (...args: any[]) => any> = never
|
|
7
|
+
export declare function createEventEmitterForMessages<T extends Record<string, (...args: any[]) => any> = never>(params: {
|
|
11
8
|
messageTransport: MessageTransportWithDefaultOrigin;
|
|
12
|
-
|
|
9
|
+
eventNames: string[];
|
|
13
10
|
}): EventEmitter<T>;
|
|
14
11
|
/**
|
|
15
12
|
* Use this function when you want to get an event emitter that will raise events for
|
|
16
13
|
* messages of type MessagesForEventEmitter
|
|
17
14
|
*/
|
|
18
|
-
export declare function createEventEmitterForMessages<T extends Record<string, (...args: any[]) => any> = never,
|
|
15
|
+
export declare function createEventEmitterForMessages<T extends Record<string, (...args: any[]) => any> = never, E extends EventEmitter<any> = never>(params: {
|
|
19
16
|
messageTransport: MessageTransportWithDefaultOrigin;
|
|
20
17
|
initialEventEmitter: E;
|
|
21
|
-
|
|
18
|
+
eventNames: string[];
|
|
22
19
|
}): E extends EventEmitter<infer V> ? EventEmitter<T & V> : never;
|
|
@@ -3,13 +3,12 @@ import EventEmitter from 'eventemitter3';
|
|
|
3
3
|
import { createRequestChannel } from '../../requestChannel/requestChannel.js';
|
|
4
4
|
|
|
5
5
|
// There are way too many "any"s in this file. They are necessary because otherwise the generics won't work
|
|
6
|
-
function createEventEmitterForMessages({ messageTransport, initialEventEmitter,
|
|
6
|
+
function createEventEmitterForMessages({ messageTransport, initialEventEmitter, eventNames, }) {
|
|
7
7
|
const events = initialEventEmitter !== null && initialEventEmitter !== void 0 ? initialEventEmitter : new EventEmitter();
|
|
8
8
|
const requestChannel = createRequestChannel(messageTransport);
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
});
|
|
9
|
+
for (const eventName of eventNames) {
|
|
10
|
+
requestChannel.handle(eventName, (...payload) => events.emit(eventName, ...payload));
|
|
11
|
+
}
|
|
13
12
|
return events;
|
|
14
13
|
}
|
|
15
14
|
|
package/src/store/store.cjs
CHANGED
|
@@ -38,6 +38,7 @@ const createStore = ({ initialState, key, messageTransport, }) => {
|
|
|
38
38
|
const messageName = `${key}__${variable}Changed`;
|
|
39
39
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
40
40
|
requestChannel$1.handle(messageName, (newValue) => {
|
|
41
|
+
state[variable] = newValue;
|
|
41
42
|
const eventName = `${variable}Changed`;
|
|
42
43
|
// We emit with the same event name for simplicity, but keep in mind
|
|
43
44
|
// the eventEmitter events are different from the messageTransport message we are handling.
|
|
@@ -47,7 +48,6 @@ const createStore = ({ initialState, key, messageTransport, }) => {
|
|
|
47
48
|
// but all this is encapsulated in this function and it works like a charm for whoever calls it.
|
|
48
49
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
49
50
|
eventEmitter.emit(eventName, newValue);
|
|
50
|
-
state[variable] = newValue;
|
|
51
51
|
});
|
|
52
52
|
}
|
|
53
53
|
return {
|
package/src/store/store.js
CHANGED
|
@@ -30,6 +30,7 @@ const createStore = ({ initialState, key, messageTransport, }) => {
|
|
|
30
30
|
const messageName = `${key}__${variable}Changed`;
|
|
31
31
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
32
32
|
requestChannel.handle(messageName, (newValue) => {
|
|
33
|
+
state[variable] = newValue;
|
|
33
34
|
const eventName = `${variable}Changed`;
|
|
34
35
|
// We emit with the same event name for simplicity, but keep in mind
|
|
35
36
|
// the eventEmitter events are different from the messageTransport message we are handling.
|
|
@@ -39,7 +40,6 @@ const createStore = ({ initialState, key, messageTransport, }) => {
|
|
|
39
40
|
// but all this is encapsulated in this function and it works like a charm for whoever calls it.
|
|
40
41
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
41
42
|
eventEmitter.emit(eventName, newValue);
|
|
42
|
-
state[variable] = newValue;
|
|
43
43
|
});
|
|
44
44
|
}
|
|
45
45
|
return {
|
package/src/store/types.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import EventEmitter from 'eventemitter3';
|
|
2
|
-
|
|
2
|
+
import { PickedEventListeners } from '../types';
|
|
3
|
+
export type StoreKeys = 'auth' | 'sdk' | 'wallets' | 'embeddedWallets' | 'platform' | 'userInterface' | 'otp' | 'networks';
|
|
3
4
|
/**
|
|
4
5
|
* Readonly getters for the store values
|
|
5
6
|
*/
|
|
@@ -38,16 +39,7 @@ export type StoreStateChangeEvent<T extends Record<string, unknown>, K extends E
|
|
|
38
39
|
export type StoreStateEvents<T extends Record<string, unknown>> = {
|
|
39
40
|
[K in Extract<keyof T, string> as StoreStateChangeEvent<T, K>]: (value: T[K]) => void;
|
|
40
41
|
};
|
|
41
|
-
/**
|
|
42
|
-
* Generates the event listener methods for a StoreState.
|
|
43
|
-
* The methods still return the original type of the eventemitter3 class.
|
|
44
|
-
* Use StoreEventListeners instead, which hides these return types.
|
|
45
|
-
*/
|
|
46
|
-
type RawStoreEventListeners<T extends Record<string, unknown>> = Pick<EventEmitter<StoreStateEvents<T>>, 'on' | 'off' | 'once'>;
|
|
47
42
|
/**
|
|
48
43
|
* The event listener methods for a StoreState
|
|
49
44
|
*/
|
|
50
|
-
export type StoreEventListeners<T extends Record<string, unknown>> =
|
|
51
|
-
[M in keyof RawStoreEventListeners<T>]: (...args: Parameters<RawStoreEventListeners<T>[M]>) => void;
|
|
52
|
-
};
|
|
53
|
-
export {};
|
|
45
|
+
export type StoreEventListeners<T extends Record<string, unknown>> = PickedEventListeners<StoreStateEvents<T>>;
|
package/src/types.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export type PickedEventListeners<T extends Record<string, unknown>> = {
|
|
2
|
+
on: <K extends keyof T>(eventName: K, listener: T[K]) => void;
|
|
3
|
+
once: <K extends keyof T>(eventName: K, listener: T[K]) => void;
|
|
4
|
+
off: <K extends keyof T>(eventName: K, listener: T[K]) => void;
|
|
5
|
+
};
|
|
@@ -17,6 +17,17 @@ var _tslib = require('../../../_virtual/_tslib.cjs');
|
|
|
17
17
|
const parseErrorFromTransport = (serializedError) => {
|
|
18
18
|
const { message, name, stack } = serializedError, otherProps = _tslib.__rest(serializedError, ["message", "name", "stack"]);
|
|
19
19
|
let error;
|
|
20
|
+
// If we have passed in a array of values, we just use it directly
|
|
21
|
+
if (message) {
|
|
22
|
+
try {
|
|
23
|
+
const data = JSON.parse(message);
|
|
24
|
+
if (Array.isArray(data))
|
|
25
|
+
return data;
|
|
26
|
+
}
|
|
27
|
+
catch (_a) {
|
|
28
|
+
/* empty */
|
|
29
|
+
}
|
|
30
|
+
}
|
|
20
31
|
// Determine the type of the error based on the 'name' property and instantiate accordingly
|
|
21
32
|
switch (name) {
|
|
22
33
|
case 'TypeError':
|
|
@@ -8,4 +8,4 @@ import { SerializedError } from '../serializeErrorForTransport';
|
|
|
8
8
|
* @param {SerializedError} serializedError - The serialized error object to parse.
|
|
9
9
|
* @returns {Error} - The reconstructed Error instance.
|
|
10
10
|
*/
|
|
11
|
-
export declare const parseErrorFromTransport: (serializedError: SerializedError) => Error;
|
|
11
|
+
export declare const parseErrorFromTransport: (serializedError: SerializedError) => Error | unknown[];
|
|
@@ -13,6 +13,17 @@ import { __rest } from '../../../_virtual/_tslib.js';
|
|
|
13
13
|
const parseErrorFromTransport = (serializedError) => {
|
|
14
14
|
const { message, name, stack } = serializedError, otherProps = __rest(serializedError, ["message", "name", "stack"]);
|
|
15
15
|
let error;
|
|
16
|
+
// If we have passed in a array of values, we just use it directly
|
|
17
|
+
if (message) {
|
|
18
|
+
try {
|
|
19
|
+
const data = JSON.parse(message);
|
|
20
|
+
if (Array.isArray(data))
|
|
21
|
+
return data;
|
|
22
|
+
}
|
|
23
|
+
catch (_a) {
|
|
24
|
+
/* empty */
|
|
25
|
+
}
|
|
26
|
+
}
|
|
16
27
|
// Determine the type of the error based on the 'name' property and instantiate accordingly
|
|
17
28
|
switch (name) {
|
|
18
29
|
case 'TypeError':
|
|
@@ -20,6 +20,9 @@ const serializeErrorForTransport = (err) => {
|
|
|
20
20
|
// @ts-expect-error name is a standard property of Error
|
|
21
21
|
name: err.name, stack: err.stack }, err);
|
|
22
22
|
}
|
|
23
|
+
else if (Array.isArray(err)) {
|
|
24
|
+
return { message: JSON.stringify(err) };
|
|
25
|
+
}
|
|
23
26
|
else if (typeof err === 'object' && err !== null) {
|
|
24
27
|
const plainObject = {};
|
|
25
28
|
for (const [key, value] of Object.entries(err)) {
|
|
@@ -16,6 +16,9 @@ const serializeErrorForTransport = (err) => {
|
|
|
16
16
|
// @ts-expect-error name is a standard property of Error
|
|
17
17
|
name: err.name, stack: err.stack }, err);
|
|
18
18
|
}
|
|
19
|
+
else if (Array.isArray(err)) {
|
|
20
|
+
return { message: JSON.stringify(err) };
|
|
21
|
+
}
|
|
19
22
|
else if (typeof err === 'object' && err !== null) {
|
|
20
23
|
const plainObject = {};
|
|
21
24
|
for (const [key, value] of Object.entries(err)) {
|