@dynamic-labs/message-transport 4.20.13 → 4.20.14
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 +8 -0
- package/package.cjs +1 -1
- package/package.js +1 -1
- package/package.json +7 -7
- package/src/debug/debug.cjs +17 -0
- package/src/debug/debug.d.ts +2 -0
- package/src/debug/debug.js +12 -0
- package/src/debug/index.d.ts +1 -0
- package/src/index.cjs +3 -0
- package/src/index.d.ts +1 -0
- package/src/index.js +1 -0
- package/src/messageTransport/messageTransport.d.ts +6 -0
- package/src/messageTypes/SdkModuleMessages.d.ts +6 -1
- package/src/requestChannel/createRequestChannelMessageSender/createRequestChannelMessageSender.cjs +35 -7
- package/src/requestChannel/createRequestChannelMessageSender/createRequestChannelMessageSender.d.ts +4 -2
- package/src/requestChannel/createRequestChannelMessageSender/createRequestChannelMessageSender.js +35 -7
- package/src/requestChannel/requestChannel.cjs +33 -9
- package/src/requestChannel/requestChannel.d.ts +16 -1
- package/src/requestChannel/requestChannel.js +33 -9
- package/src/utils/parseMessageTransportData/parseMessageTransportData.cjs +1 -0
- package/src/utils/parseMessageTransportData/parseMessageTransportData.js +1 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,4 +1,12 @@
|
|
|
1
1
|
|
|
2
|
+
### [4.20.14](https://github.com/dynamic-labs/dynamic-auth/compare/v4.20.13...v4.20.14) (2025-07-03)
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
### Bug Fixes
|
|
6
|
+
|
|
7
|
+
* refresh function user state for sessionId ([#9073](https://github.com/dynamic-labs/dynamic-auth/issues/9073)) ([080e923](https://github.com/dynamic-labs/dynamic-auth/commit/080e92356e3920f1d240b5025db9c831aa2abc5a))
|
|
8
|
+
* remove default commonjs setups for @dynamic-labs-wallet/browser-wallet-client ([#9079](https://github.com/dynamic-labs/dynamic-auth/issues/9079)) ([27507ab](https://github.com/dynamic-labs/dynamic-auth/commit/27507abedfd223209cad15d5c1e12b37fa421071))
|
|
9
|
+
|
|
2
10
|
### [4.20.13](https://github.com/dynamic-labs/dynamic-auth/compare/v4.20.12...v4.20.13) (2025-07-02)
|
|
3
11
|
|
|
4
12
|
|
package/package.cjs
CHANGED
package/package.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dynamic-labs/message-transport",
|
|
3
|
-
"version": "4.20.
|
|
3
|
+
"version": "4.20.14",
|
|
4
4
|
"description": "Defines the interface to communicate with dynamic's webview",
|
|
5
5
|
"author": "Dynamic Labs, Inc.",
|
|
6
6
|
"license": "MIT",
|
|
@@ -18,14 +18,14 @@
|
|
|
18
18
|
},
|
|
19
19
|
"homepage": "https://www.dynamic.xyz/",
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@dynamic-labs/sdk-api-core": "0.0.
|
|
21
|
+
"@dynamic-labs/sdk-api-core": "0.0.704",
|
|
22
22
|
"@vue/reactivity": "^3.4.21",
|
|
23
|
-
"@dynamic-labs/types": "4.20.
|
|
23
|
+
"@dynamic-labs/types": "4.20.14",
|
|
24
24
|
"eventemitter3": "5.0.1",
|
|
25
|
-
"@dynamic-labs/assert-package-version": "4.20.
|
|
26
|
-
"@dynamic-labs/logger": "4.20.
|
|
27
|
-
"@dynamic-labs/utils": "4.20.
|
|
28
|
-
"@dynamic-labs/webauthn": "4.20.
|
|
25
|
+
"@dynamic-labs/assert-package-version": "4.20.14",
|
|
26
|
+
"@dynamic-labs/logger": "4.20.14",
|
|
27
|
+
"@dynamic-labs/utils": "4.20.14",
|
|
28
|
+
"@dynamic-labs/webauthn": "4.20.14"
|
|
29
29
|
},
|
|
30
30
|
"peerDependencies": {}
|
|
31
31
|
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Global debug flag that can be set to true to enable debug mode
|
|
8
|
+
* for all resources that use the message transport.
|
|
9
|
+
*/
|
|
10
|
+
let globalDebugEnabled = false;
|
|
11
|
+
const setGlobalDebugEnabled = (debug) => {
|
|
12
|
+
globalDebugEnabled = debug;
|
|
13
|
+
};
|
|
14
|
+
const isGlobalDebugEnabled = () => globalDebugEnabled;
|
|
15
|
+
|
|
16
|
+
exports.isGlobalDebugEnabled = isGlobalDebugEnabled;
|
|
17
|
+
exports.setGlobalDebugEnabled = setGlobalDebugEnabled;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
/**
|
|
3
|
+
* Global debug flag that can be set to true to enable debug mode
|
|
4
|
+
* for all resources that use the message transport.
|
|
5
|
+
*/
|
|
6
|
+
let globalDebugEnabled = false;
|
|
7
|
+
const setGlobalDebugEnabled = (debug) => {
|
|
8
|
+
globalDebugEnabled = debug;
|
|
9
|
+
};
|
|
10
|
+
const isGlobalDebugEnabled = () => globalDebugEnabled;
|
|
11
|
+
|
|
12
|
+
export { isGlobalDebugEnabled, setGlobalDebugEnabled };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './debug';
|
package/src/index.cjs
CHANGED
|
@@ -26,6 +26,7 @@ var OtpMessages = require('./messageTypes/OtpMessages.cjs');
|
|
|
26
26
|
var SdkModuleMessages = require('./messageTypes/SdkModuleMessages.cjs');
|
|
27
27
|
var UserInterfaceModuleMessages = require('./messageTypes/UserInterfaceModuleMessages.cjs');
|
|
28
28
|
var WalletsModuleMessages = require('./messageTypes/WalletsModuleMessages.cjs');
|
|
29
|
+
var debug = require('./debug/debug.cjs');
|
|
29
30
|
|
|
30
31
|
assertPackageVersion.assertPackageVersion('@dynamic-labs/message-transport', _package.version);
|
|
31
32
|
|
|
@@ -58,3 +59,5 @@ exports.smsEventNames = OtpMessages.smsEventNames;
|
|
|
58
59
|
exports.sdkHasLoadedEventName = SdkModuleMessages.sdkHasLoadedEventName;
|
|
59
60
|
exports.userInterfaceEventNames = UserInterfaceModuleMessages.userInterfaceEventNames;
|
|
60
61
|
exports.userWalletsEventNames = WalletsModuleMessages.userWalletsEventNames;
|
|
62
|
+
exports.isGlobalDebugEnabled = debug.isGlobalDebugEnabled;
|
|
63
|
+
exports.setGlobalDebugEnabled = debug.setGlobalDebugEnabled;
|
package/src/index.d.ts
CHANGED
|
@@ -8,3 +8,4 @@ export { createEventEmitterForMessages, createStore, createStoreSetter, type Cre
|
|
|
8
8
|
export type { Store, StoreEventListeners, StoreKeys, StoreSetter, StoreStateChangeEvent, StoreStateEvents, StoreStateGetters, } from './store/types';
|
|
9
9
|
export type { PickedEventListeners } from './types';
|
|
10
10
|
export { authEventNames, emailEventNames, embeddedWalletsEventNames, sdkHasLoadedEventName, smsEventNames, userInterfaceEventNames, userWalletsEventNames, type AccountAbstractionGetEOAWalletArgs, type AccountAbstractionGetSmartWalletArgs, type AccountAbstractionIsSmartWalletArgs, type AccountAbstractionMessages, type AuthModuleMessages, type AuthModuleState, type ClientManifest, type ConsoleMessages, type CreateEmbeddedWalletArgs, type DeleteStorageItemArgs, type EmailOtpParams, type EmbeddedWalletsModuleMessages, type EmbeddedWalletsModuleState, type EthMessages, type EthRequestParams, type EthRequestWithAddressParams, type EthRequestWithChainIdParams, type ExternalAuthMessages, type FetchMessages, type GetStorageItemArgs, type MfaMessages, type NetworksModuleState, type OtpData, type OtpMessages, type PasskeyMessages, type PlatformServiceMessages, type ProjectSettingsMessages, type SdkModuleMessages, type SdkModuleState, type SetStorageItemArgs, type SignInWithExternalJwtParams, type SmsOtpParams, type SocialAuthModuleMessages, type SocialProvider, type SolanaMessages, type StorageMessages, type StorageMessageSource, type TurnkeyIframeEventProxyMessages, type UserInterfaceModuleMessages, type VerifyWithExternalJwtParams, type ViemMessages, type WaasMessages, type WalletEvents, type WalletsModuleMessages, type WalletsModuleState, type WebViewVisibilityMessages, type ZeroDevExtensionMessages, } from './messageTypes';
|
|
11
|
+
export { isGlobalDebugEnabled, setGlobalDebugEnabled } from './debug';
|
package/src/index.js
CHANGED
|
@@ -22,5 +22,6 @@ export { emailEventNames, smsEventNames } from './messageTypes/OtpMessages.js';
|
|
|
22
22
|
export { sdkHasLoadedEventName } from './messageTypes/SdkModuleMessages.js';
|
|
23
23
|
export { userInterfaceEventNames } from './messageTypes/UserInterfaceModuleMessages.js';
|
|
24
24
|
export { userWalletsEventNames } from './messageTypes/WalletsModuleMessages.js';
|
|
25
|
+
export { isGlobalDebugEnabled, setGlobalDebugEnabled } from './debug/debug.js';
|
|
25
26
|
|
|
26
27
|
assertPackageVersion('@dynamic-labs/message-transport', version);
|
|
@@ -38,6 +38,12 @@ export type MessageTransportData = {
|
|
|
38
38
|
messageSessionId: string;
|
|
39
39
|
/** Identifies which end emitted this message */
|
|
40
40
|
origin: 'webview' | 'host';
|
|
41
|
+
/**
|
|
42
|
+
* Whether this message is expected to NOT receive an ack reply.
|
|
43
|
+
*
|
|
44
|
+
* If this is true, the other end should NOT emit an ack message.
|
|
45
|
+
*/
|
|
46
|
+
doNotAck?: boolean;
|
|
41
47
|
};
|
|
42
48
|
export type MessageTransportCallback = (data: MessageTransportData) => void;
|
|
43
49
|
/**
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { LogLevel } from '@dynamic-labs/logger';
|
|
1
2
|
/**
|
|
2
3
|
* Defines the settings required by the SDK to be properly initialized
|
|
3
4
|
* inside the webview
|
|
@@ -12,7 +13,11 @@ export type ClientManifest = {
|
|
|
12
13
|
environmentId: string;
|
|
13
14
|
platform: 'browser' | 'react-native' | 'flutter' | 'swift';
|
|
14
15
|
redirectUrl: string;
|
|
15
|
-
|
|
16
|
+
debug?: {
|
|
17
|
+
webview?: boolean;
|
|
18
|
+
messageTransport?: boolean;
|
|
19
|
+
loggerLevel?: LogLevel;
|
|
20
|
+
};
|
|
16
21
|
};
|
|
17
22
|
export type SdkModuleState = {
|
|
18
23
|
/** Indicates the SDK is set up and ready for requests */
|
package/src/requestChannel/createRequestChannelMessageSender/createRequestChannelMessageSender.cjs
CHANGED
|
@@ -3,11 +3,12 @@
|
|
|
3
3
|
|
|
4
4
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
5
5
|
|
|
6
|
+
var debug = require('../../debug/debug.cjs');
|
|
6
7
|
var applyRecoveryManager = require('../../messageTransport/decorators/applyRecoveryManager/applyRecoveryManager.cjs');
|
|
7
8
|
var logger = require('../../utils/logger.cjs');
|
|
8
9
|
var utils = require('../utils/utils.cjs');
|
|
9
10
|
|
|
10
|
-
const createRequestChannelMessageSender = ({ requestType, messageSessionId, timeoutMap, onReceiveAck, messageTransport, onTimeout, params, }) => {
|
|
11
|
+
const createRequestChannelMessageSender = ({ requestType, messageSessionId, timeoutMap, onReceiveAck, messageTransport, onTimeout, params, debugOverride, disableAckForOutgoingMessage = false, }) => {
|
|
11
12
|
/**
|
|
12
13
|
* Tracks whether this sender's message has timed out.
|
|
13
14
|
* This way we can identify that it was a false negative if the message
|
|
@@ -15,30 +16,54 @@ const createRequestChannelMessageSender = ({ requestType, messageSessionId, time
|
|
|
15
16
|
*/
|
|
16
17
|
let messageTimedOut = false;
|
|
17
18
|
const ackMessageType = utils.getAckMessageType(requestType);
|
|
18
|
-
const
|
|
19
|
+
const isDebugEnabled = () => debugOverride !== null && debugOverride !== void 0 ? debugOverride : debug.isGlobalDebugEnabled();
|
|
20
|
+
const outgoingMessage = {
|
|
19
21
|
args: params,
|
|
22
|
+
doNotAck: disableAckForOutgoingMessage,
|
|
20
23
|
messageSessionId,
|
|
21
24
|
type: requestType,
|
|
22
25
|
};
|
|
26
|
+
const getTimestamp = () => new Date().toISOString();
|
|
23
27
|
// We must listen for acks
|
|
24
|
-
const handleAckMessage = ({ messageSessionId: incomingSessionId, type: incomingType, }) => {
|
|
28
|
+
const handleAckMessage = ({ messageSessionId: incomingSessionId, type: incomingType, doNotAck: incomingDoNotAck, }) => {
|
|
29
|
+
// DO NOT ignore ack messages when disableAckForOutgoingMessage is true.
|
|
30
|
+
// disableAckForOutgoingMessage means OUTGOING messages will not receive an ack.
|
|
31
|
+
// This is different than the INCOMING message's doNotAck, which is what we care about here
|
|
25
32
|
if (incomingSessionId !== messageSessionId ||
|
|
26
|
-
incomingType !== ackMessageType
|
|
33
|
+
incomingType !== ackMessageType ||
|
|
34
|
+
incomingDoNotAck) {
|
|
27
35
|
return;
|
|
36
|
+
}
|
|
37
|
+
if (isDebugEnabled()) {
|
|
38
|
+
logger.logger.debug(`[messageSender ${requestType} ${getTimestamp()}] — received ack message (messageSessionId: ${messageSessionId}). Message timeout ID: ${timeoutMap[messageSessionId]}. Content of timeoutMap: ${JSON.stringify(timeoutMap)}`);
|
|
39
|
+
}
|
|
28
40
|
clearTimeout(timeoutMap[messageSessionId]);
|
|
29
41
|
delete timeoutMap[messageSessionId];
|
|
30
42
|
onReceiveAck === null || onReceiveAck === void 0 ? void 0 : onReceiveAck();
|
|
31
43
|
if (messageTimedOut) {
|
|
44
|
+
if (isDebugEnabled()) {
|
|
45
|
+
logger.logger.debug(`[messageSender ${requestType} ${getTimestamp()}] — identified a false negative for message time out. Message: ${requestType} with session id ${messageSessionId}`);
|
|
46
|
+
}
|
|
32
47
|
logger.logger.instrument(`Identified a false negative for message time out. Message: ${requestType} with session id ${messageSessionId}. Params: ${JSON.stringify(params)}`);
|
|
33
48
|
}
|
|
34
49
|
};
|
|
35
50
|
const sendMessage = () => {
|
|
51
|
+
if (disableAckForOutgoingMessage) {
|
|
52
|
+
messageTransport.emit(outgoingMessage);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
36
55
|
const startTimer = () => {
|
|
37
56
|
const timeoutTimer = setTimeout(() => {
|
|
38
57
|
// Try to recover connection if available
|
|
39
58
|
if (applyRecoveryManager.hasRecoveryManager(messageTransport) &&
|
|
40
59
|
messageTransport.recoveryManager.canRetryMessageSessionId(messageSessionId)) {
|
|
60
|
+
if (isDebugEnabled()) {
|
|
61
|
+
logger.logger.debug(`[messageSender ${requestType} ${getTimestamp()}] — timed out, triggering recovery (messageSessionId: ${messageSessionId})`);
|
|
62
|
+
}
|
|
41
63
|
messageTransport.recoveryManager.triggerRecovery(messageSessionId);
|
|
64
|
+
if (isDebugEnabled()) {
|
|
65
|
+
logger.logger.debug(`[messageSender ${requestType} ${getTimestamp()}] — attempting to send message again (messageSessionId: ${messageSessionId})`);
|
|
66
|
+
}
|
|
42
67
|
sendMessage();
|
|
43
68
|
}
|
|
44
69
|
else {
|
|
@@ -47,6 +72,9 @@ const createRequestChannelMessageSender = ({ requestType, messageSessionId, time
|
|
|
47
72
|
messageTimedOut = true;
|
|
48
73
|
}
|
|
49
74
|
}, utils.TIMEOUT_DURATION);
|
|
75
|
+
if (isDebugEnabled()) {
|
|
76
|
+
logger.logger.debug(`[messageSender ${requestType} ${getTimestamp()}] — setting timeout timer (messageSessionId: ${messageSessionId}). Timeout ID: ${timeoutTimer}. Content of timeoutMap: ${JSON.stringify(timeoutMap)}`);
|
|
77
|
+
}
|
|
50
78
|
timeoutMap[messageSessionId] = timeoutTimer;
|
|
51
79
|
};
|
|
52
80
|
// If this message transport is currently blocked, we must only start
|
|
@@ -54,13 +82,13 @@ const createRequestChannelMessageSender = ({ requestType, messageSessionId, time
|
|
|
54
82
|
// We don't just default to this because the onEmit option is only
|
|
55
83
|
// present in the message transport if has the block decorator
|
|
56
84
|
if ('isBlocked' in messageTransport && messageTransport.isBlocked()) {
|
|
57
|
-
messageTransport.emit(
|
|
85
|
+
messageTransport.emit(outgoingMessage, { onEmit: startTimer });
|
|
58
86
|
return;
|
|
59
87
|
}
|
|
60
|
-
// Now we emit the event to set off the request
|
|
61
|
-
messageTransport.emit(message);
|
|
62
88
|
// We start the timer immediately since the message was not blocked
|
|
63
89
|
startTimer();
|
|
90
|
+
// Now we emit the event to set off the request
|
|
91
|
+
messageTransport.emit(outgoingMessage);
|
|
64
92
|
};
|
|
65
93
|
return { handleAckMessage, sendMessage };
|
|
66
94
|
};
|
package/src/requestChannel/createRequestChannelMessageSender/createRequestChannelMessageSender.d.ts
CHANGED
|
@@ -10,9 +10,11 @@ type RequestChannelMessageSenderParams<T extends RequestTypes, K extends Extract
|
|
|
10
10
|
onTimeout: VoidFunction;
|
|
11
11
|
messageTransport: MessageTransportWithDefaultOrigin | WithBlock<MessageTransportWithDefaultOrigin>;
|
|
12
12
|
params: Parameters<T[K]>;
|
|
13
|
+
debugOverride?: boolean;
|
|
14
|
+
disableAckForOutgoingMessage?: boolean;
|
|
13
15
|
};
|
|
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
|
+
export declare const createRequestChannelMessageSender: <T extends RequestTypes, K extends Extract<keyof T, string>>({ requestType, messageSessionId, timeoutMap, onReceiveAck, messageTransport, onTimeout, params, debugOverride, disableAckForOutgoingMessage, }: RequestChannelMessageSenderParams<T, K>) => {
|
|
17
|
+
handleAckMessage: ({ messageSessionId: incomingSessionId, type: incomingType, doNotAck: incomingDoNotAck, }: MessageTransportData) => void;
|
|
16
18
|
sendMessage: () => void;
|
|
17
19
|
};
|
|
18
20
|
export {};
|
package/src/requestChannel/createRequestChannelMessageSender/createRequestChannelMessageSender.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
'use client'
|
|
2
|
+
import { isGlobalDebugEnabled } from '../../debug/debug.js';
|
|
2
3
|
import { hasRecoveryManager } from '../../messageTransport/decorators/applyRecoveryManager/applyRecoveryManager.js';
|
|
3
4
|
import { logger } from '../../utils/logger.js';
|
|
4
5
|
import { getAckMessageType, TIMEOUT_DURATION } from '../utils/utils.js';
|
|
5
6
|
|
|
6
|
-
const createRequestChannelMessageSender = ({ requestType, messageSessionId, timeoutMap, onReceiveAck, messageTransport, onTimeout, params, }) => {
|
|
7
|
+
const createRequestChannelMessageSender = ({ requestType, messageSessionId, timeoutMap, onReceiveAck, messageTransport, onTimeout, params, debugOverride, disableAckForOutgoingMessage = false, }) => {
|
|
7
8
|
/**
|
|
8
9
|
* Tracks whether this sender's message has timed out.
|
|
9
10
|
* This way we can identify that it was a false negative if the message
|
|
@@ -11,30 +12,54 @@ const createRequestChannelMessageSender = ({ requestType, messageSessionId, time
|
|
|
11
12
|
*/
|
|
12
13
|
let messageTimedOut = false;
|
|
13
14
|
const ackMessageType = getAckMessageType(requestType);
|
|
14
|
-
const
|
|
15
|
+
const isDebugEnabled = () => debugOverride !== null && debugOverride !== void 0 ? debugOverride : isGlobalDebugEnabled();
|
|
16
|
+
const outgoingMessage = {
|
|
15
17
|
args: params,
|
|
18
|
+
doNotAck: disableAckForOutgoingMessage,
|
|
16
19
|
messageSessionId,
|
|
17
20
|
type: requestType,
|
|
18
21
|
};
|
|
22
|
+
const getTimestamp = () => new Date().toISOString();
|
|
19
23
|
// We must listen for acks
|
|
20
|
-
const handleAckMessage = ({ messageSessionId: incomingSessionId, type: incomingType, }) => {
|
|
24
|
+
const handleAckMessage = ({ messageSessionId: incomingSessionId, type: incomingType, doNotAck: incomingDoNotAck, }) => {
|
|
25
|
+
// DO NOT ignore ack messages when disableAckForOutgoingMessage is true.
|
|
26
|
+
// disableAckForOutgoingMessage means OUTGOING messages will not receive an ack.
|
|
27
|
+
// This is different than the INCOMING message's doNotAck, which is what we care about here
|
|
21
28
|
if (incomingSessionId !== messageSessionId ||
|
|
22
|
-
incomingType !== ackMessageType
|
|
29
|
+
incomingType !== ackMessageType ||
|
|
30
|
+
incomingDoNotAck) {
|
|
23
31
|
return;
|
|
32
|
+
}
|
|
33
|
+
if (isDebugEnabled()) {
|
|
34
|
+
logger.debug(`[messageSender ${requestType} ${getTimestamp()}] — received ack message (messageSessionId: ${messageSessionId}). Message timeout ID: ${timeoutMap[messageSessionId]}. Content of timeoutMap: ${JSON.stringify(timeoutMap)}`);
|
|
35
|
+
}
|
|
24
36
|
clearTimeout(timeoutMap[messageSessionId]);
|
|
25
37
|
delete timeoutMap[messageSessionId];
|
|
26
38
|
onReceiveAck === null || onReceiveAck === void 0 ? void 0 : onReceiveAck();
|
|
27
39
|
if (messageTimedOut) {
|
|
40
|
+
if (isDebugEnabled()) {
|
|
41
|
+
logger.debug(`[messageSender ${requestType} ${getTimestamp()}] — identified a false negative for message time out. Message: ${requestType} with session id ${messageSessionId}`);
|
|
42
|
+
}
|
|
28
43
|
logger.instrument(`Identified a false negative for message time out. Message: ${requestType} with session id ${messageSessionId}. Params: ${JSON.stringify(params)}`);
|
|
29
44
|
}
|
|
30
45
|
};
|
|
31
46
|
const sendMessage = () => {
|
|
47
|
+
if (disableAckForOutgoingMessage) {
|
|
48
|
+
messageTransport.emit(outgoingMessage);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
32
51
|
const startTimer = () => {
|
|
33
52
|
const timeoutTimer = setTimeout(() => {
|
|
34
53
|
// Try to recover connection if available
|
|
35
54
|
if (hasRecoveryManager(messageTransport) &&
|
|
36
55
|
messageTransport.recoveryManager.canRetryMessageSessionId(messageSessionId)) {
|
|
56
|
+
if (isDebugEnabled()) {
|
|
57
|
+
logger.debug(`[messageSender ${requestType} ${getTimestamp()}] — timed out, triggering recovery (messageSessionId: ${messageSessionId})`);
|
|
58
|
+
}
|
|
37
59
|
messageTransport.recoveryManager.triggerRecovery(messageSessionId);
|
|
60
|
+
if (isDebugEnabled()) {
|
|
61
|
+
logger.debug(`[messageSender ${requestType} ${getTimestamp()}] — attempting to send message again (messageSessionId: ${messageSessionId})`);
|
|
62
|
+
}
|
|
38
63
|
sendMessage();
|
|
39
64
|
}
|
|
40
65
|
else {
|
|
@@ -43,6 +68,9 @@ const createRequestChannelMessageSender = ({ requestType, messageSessionId, time
|
|
|
43
68
|
messageTimedOut = true;
|
|
44
69
|
}
|
|
45
70
|
}, TIMEOUT_DURATION);
|
|
71
|
+
if (isDebugEnabled()) {
|
|
72
|
+
logger.debug(`[messageSender ${requestType} ${getTimestamp()}] — setting timeout timer (messageSessionId: ${messageSessionId}). Timeout ID: ${timeoutTimer}. Content of timeoutMap: ${JSON.stringify(timeoutMap)}`);
|
|
73
|
+
}
|
|
46
74
|
timeoutMap[messageSessionId] = timeoutTimer;
|
|
47
75
|
};
|
|
48
76
|
// If this message transport is currently blocked, we must only start
|
|
@@ -50,13 +78,13 @@ const createRequestChannelMessageSender = ({ requestType, messageSessionId, time
|
|
|
50
78
|
// We don't just default to this because the onEmit option is only
|
|
51
79
|
// present in the message transport if has the block decorator
|
|
52
80
|
if ('isBlocked' in messageTransport && messageTransport.isBlocked()) {
|
|
53
|
-
messageTransport.emit(
|
|
81
|
+
messageTransport.emit(outgoingMessage, { onEmit: startTimer });
|
|
54
82
|
return;
|
|
55
83
|
}
|
|
56
|
-
// Now we emit the event to set off the request
|
|
57
|
-
messageTransport.emit(message);
|
|
58
84
|
// We start the timer immediately since the message was not blocked
|
|
59
85
|
startTimer();
|
|
86
|
+
// Now we emit the event to set off the request
|
|
87
|
+
messageTransport.emit(outgoingMessage);
|
|
60
88
|
};
|
|
61
89
|
return { handleAckMessage, sendMessage };
|
|
62
90
|
};
|
|
@@ -4,7 +4,9 @@
|
|
|
4
4
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
5
5
|
|
|
6
6
|
var _tslib = require('../../_virtual/_tslib.cjs');
|
|
7
|
+
var debug = require('../debug/debug.cjs');
|
|
7
8
|
var isSerializedError = require('../utils/isSerializedError/isSerializedError.cjs');
|
|
9
|
+
var logger = require('../utils/logger.cjs');
|
|
8
10
|
var parseErrorFromTransport = require('../utils/parseErrorFromTransport/parseErrorFromTransport.cjs');
|
|
9
11
|
var serializeErrorForTransport = require('../utils/serializeErrorForTransport/serializeErrorForTransport.cjs');
|
|
10
12
|
var createRequestChannelMessageSender = require('./createRequestChannelMessageSender/createRequestChannelMessageSender.cjs');
|
|
@@ -28,7 +30,7 @@ var utils = require('./utils/utils.cjs');
|
|
|
28
30
|
*
|
|
29
31
|
* This is an abstraction built on top of the MessageTransport interface.
|
|
30
32
|
*/
|
|
31
|
-
const createRequestChannel = (messageTransport) => {
|
|
33
|
+
const createRequestChannel = (messageTransport, { debugOverride, disableAcknowledgement } = {}) => {
|
|
32
34
|
/** Used to generated unique ids */
|
|
33
35
|
let uniqueIdCounter = 0;
|
|
34
36
|
/** Id prefix unique to this channel */
|
|
@@ -37,6 +39,8 @@ const createRequestChannel = (messageTransport) => {
|
|
|
37
39
|
const getUniqueId = () => `${idPrefix}-${uniqueIdCounter++}`;
|
|
38
40
|
/** Maps a request's session ID to its time out timer */
|
|
39
41
|
const timeoutMap = {};
|
|
42
|
+
const isDebugEnabled = () => debugOverride !== null && debugOverride !== void 0 ? debugOverride : debug.isGlobalDebugEnabled();
|
|
43
|
+
const getTimestamp = () => new Date().toISOString();
|
|
40
44
|
return {
|
|
41
45
|
emit: (requestType, ...params) => new Promise((resolve, reject) => {
|
|
42
46
|
// Generate the unique id for this message exchange session
|
|
@@ -44,6 +48,8 @@ const createRequestChannel = (messageTransport) => {
|
|
|
44
48
|
// to avoid tangling with other requests.
|
|
45
49
|
const messageSessionId = getUniqueId();
|
|
46
50
|
const { handleAckMessage, sendMessage } = createRequestChannelMessageSender.createRequestChannelMessageSender({
|
|
51
|
+
debugOverride,
|
|
52
|
+
disableAckForOutgoingMessage: disableAcknowledgement,
|
|
47
53
|
messageSessionId,
|
|
48
54
|
messageTransport,
|
|
49
55
|
onReceiveAck: () => {
|
|
@@ -59,19 +65,26 @@ const createRequestChannel = (messageTransport) => {
|
|
|
59
65
|
timeoutMap,
|
|
60
66
|
});
|
|
61
67
|
const cleanupMessageHandler = () => messageTransport.off(handleAckMessage);
|
|
62
|
-
|
|
68
|
+
if (disableAcknowledgement) {
|
|
69
|
+
resolve();
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
messageTransport.on(handleAckMessage);
|
|
73
|
+
}
|
|
63
74
|
sendMessage();
|
|
64
75
|
}),
|
|
65
76
|
handle: (requestType, handler) => {
|
|
66
|
-
const messageHandler = (_a) => _tslib.__awaiter(void 0, [_a], void 0, function* ({ args, messageSessionId, type: incomingType, }) {
|
|
77
|
+
const messageHandler = (_a) => _tslib.__awaiter(void 0, [_a], void 0, function* ({ args, messageSessionId, type: incomingType, doNotAck = false, }) {
|
|
67
78
|
if (requestType !== incomingType)
|
|
68
79
|
return;
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
80
|
+
if (!doNotAck) {
|
|
81
|
+
// Emit an Ack since the message will time out unless some handler acks it in time
|
|
82
|
+
messageTransport.emit({
|
|
83
|
+
args: [],
|
|
84
|
+
messageSessionId,
|
|
85
|
+
type: utils.getAckMessageType(requestType),
|
|
86
|
+
});
|
|
87
|
+
}
|
|
75
88
|
const result = handler(...args);
|
|
76
89
|
// If the handler doesn't return a promise,
|
|
77
90
|
// that means we don't need to respond.
|
|
@@ -106,6 +119,8 @@ const createRequestChannel = (messageTransport) => {
|
|
|
106
119
|
const resolveMessageType = utils.getResolveMessageType(requestType);
|
|
107
120
|
const rejectMessageType = utils.getRejectMessageType(requestType);
|
|
108
121
|
const { handleAckMessage, sendMessage } = createRequestChannelMessageSender.createRequestChannelMessageSender({
|
|
122
|
+
debugOverride,
|
|
123
|
+
disableAckForOutgoingMessage: disableAcknowledgement,
|
|
109
124
|
messageSessionId,
|
|
110
125
|
messageTransport,
|
|
111
126
|
onTimeout: () => {
|
|
@@ -120,10 +135,16 @@ const createRequestChannel = (messageTransport) => {
|
|
|
120
135
|
const handleMessage = (message) => {
|
|
121
136
|
if (message.messageSessionId !== messageSessionId)
|
|
122
137
|
return;
|
|
138
|
+
if (isDebugEnabled()) {
|
|
139
|
+
logger.logger.debug(`[request ${requestType} ${getTimestamp()}] — received response message (messageSessionId: ${messageSessionId})`);
|
|
140
|
+
}
|
|
123
141
|
const { args: [result], type: incomingType, } = message;
|
|
124
142
|
if (incomingType === resolveMessageType) {
|
|
125
143
|
cleanupMessageHandler();
|
|
126
144
|
resolve(result);
|
|
145
|
+
if (isDebugEnabled()) {
|
|
146
|
+
logger.logger.debug(`[request ${requestType} ${getTimestamp()}] — resolved message (messageSessionId: ${messageSessionId})`);
|
|
147
|
+
}
|
|
127
148
|
return;
|
|
128
149
|
}
|
|
129
150
|
if (incomingType === rejectMessageType) {
|
|
@@ -134,6 +155,9 @@ const createRequestChannel = (messageTransport) => {
|
|
|
134
155
|
else {
|
|
135
156
|
reject(result);
|
|
136
157
|
}
|
|
158
|
+
if (isDebugEnabled()) {
|
|
159
|
+
logger.logger.debug(`[request ${requestType} ${getTimestamp()}] — rejected message (messageSessionId: ${messageSessionId})`);
|
|
160
|
+
}
|
|
137
161
|
return;
|
|
138
162
|
}
|
|
139
163
|
handleAckMessage(message);
|
|
@@ -1,6 +1,20 @@
|
|
|
1
1
|
import { WithBlock } from '../messageTransport';
|
|
2
2
|
import { MessageTransportWithDefaultOrigin } from '../messageTransport/decorators/applyDefaultMessageOrigin/applyDefaultMessageOrigin';
|
|
3
3
|
import { RequestChannel, RequestTypes } from './types';
|
|
4
|
+
type CreateRequestChannelProps = {
|
|
5
|
+
/**
|
|
6
|
+
* Overrides whether to debug the request channel messages
|
|
7
|
+
*/
|
|
8
|
+
debugOverride?: boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Disables ack message replies for messages sent from this channel.
|
|
11
|
+
*
|
|
12
|
+
* Doesn't mean that this channel won't send ack replies to messages sent from
|
|
13
|
+
* other channels — what this does mean is messages SENT from THIS channel will
|
|
14
|
+
* not receive an ack reply.
|
|
15
|
+
*/
|
|
16
|
+
disableAcknowledgement?: boolean;
|
|
17
|
+
};
|
|
4
18
|
/**
|
|
5
19
|
* Allows handling and submitting requests to and from a webview.
|
|
6
20
|
* Requests are messages that (can) expect some response.
|
|
@@ -19,4 +33,5 @@ import { RequestChannel, RequestTypes } from './types';
|
|
|
19
33
|
*
|
|
20
34
|
* This is an abstraction built on top of the MessageTransport interface.
|
|
21
35
|
*/
|
|
22
|
-
export declare const createRequestChannel: <T extends RequestTypes = never>(messageTransport: MessageTransportWithDefaultOrigin | WithBlock<MessageTransportWithDefaultOrigin
|
|
36
|
+
export declare const createRequestChannel: <T extends RequestTypes = never>(messageTransport: MessageTransportWithDefaultOrigin | WithBlock<MessageTransportWithDefaultOrigin>, { debugOverride, disableAcknowledgement }?: CreateRequestChannelProps) => RequestChannel<T>;
|
|
37
|
+
export {};
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
'use client'
|
|
2
2
|
import { __awaiter } from '../../_virtual/_tslib.js';
|
|
3
|
+
import { isGlobalDebugEnabled } from '../debug/debug.js';
|
|
3
4
|
import { isSerializedError } from '../utils/isSerializedError/isSerializedError.js';
|
|
5
|
+
import { logger } from '../utils/logger.js';
|
|
4
6
|
import { parseErrorFromTransport } from '../utils/parseErrorFromTransport/parseErrorFromTransport.js';
|
|
5
7
|
import { serializeErrorForTransport } from '../utils/serializeErrorForTransport/serializeErrorForTransport.js';
|
|
6
8
|
import { createRequestChannelMessageSender } from './createRequestChannelMessageSender/createRequestChannelMessageSender.js';
|
|
@@ -24,7 +26,7 @@ import { createNoHandlerError, getAckMessageType, getResolveMessageType, getReje
|
|
|
24
26
|
*
|
|
25
27
|
* This is an abstraction built on top of the MessageTransport interface.
|
|
26
28
|
*/
|
|
27
|
-
const createRequestChannel = (messageTransport) => {
|
|
29
|
+
const createRequestChannel = (messageTransport, { debugOverride, disableAcknowledgement } = {}) => {
|
|
28
30
|
/** Used to generated unique ids */
|
|
29
31
|
let uniqueIdCounter = 0;
|
|
30
32
|
/** Id prefix unique to this channel */
|
|
@@ -33,6 +35,8 @@ const createRequestChannel = (messageTransport) => {
|
|
|
33
35
|
const getUniqueId = () => `${idPrefix}-${uniqueIdCounter++}`;
|
|
34
36
|
/** Maps a request's session ID to its time out timer */
|
|
35
37
|
const timeoutMap = {};
|
|
38
|
+
const isDebugEnabled = () => debugOverride !== null && debugOverride !== void 0 ? debugOverride : isGlobalDebugEnabled();
|
|
39
|
+
const getTimestamp = () => new Date().toISOString();
|
|
36
40
|
return {
|
|
37
41
|
emit: (requestType, ...params) => new Promise((resolve, reject) => {
|
|
38
42
|
// Generate the unique id for this message exchange session
|
|
@@ -40,6 +44,8 @@ const createRequestChannel = (messageTransport) => {
|
|
|
40
44
|
// to avoid tangling with other requests.
|
|
41
45
|
const messageSessionId = getUniqueId();
|
|
42
46
|
const { handleAckMessage, sendMessage } = createRequestChannelMessageSender({
|
|
47
|
+
debugOverride,
|
|
48
|
+
disableAckForOutgoingMessage: disableAcknowledgement,
|
|
43
49
|
messageSessionId,
|
|
44
50
|
messageTransport,
|
|
45
51
|
onReceiveAck: () => {
|
|
@@ -55,19 +61,26 @@ const createRequestChannel = (messageTransport) => {
|
|
|
55
61
|
timeoutMap,
|
|
56
62
|
});
|
|
57
63
|
const cleanupMessageHandler = () => messageTransport.off(handleAckMessage);
|
|
58
|
-
|
|
64
|
+
if (disableAcknowledgement) {
|
|
65
|
+
resolve();
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
messageTransport.on(handleAckMessage);
|
|
69
|
+
}
|
|
59
70
|
sendMessage();
|
|
60
71
|
}),
|
|
61
72
|
handle: (requestType, handler) => {
|
|
62
|
-
const messageHandler = (_a) => __awaiter(void 0, [_a], void 0, function* ({ args, messageSessionId, type: incomingType, }) {
|
|
73
|
+
const messageHandler = (_a) => __awaiter(void 0, [_a], void 0, function* ({ args, messageSessionId, type: incomingType, doNotAck = false, }) {
|
|
63
74
|
if (requestType !== incomingType)
|
|
64
75
|
return;
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
76
|
+
if (!doNotAck) {
|
|
77
|
+
// Emit an Ack since the message will time out unless some handler acks it in time
|
|
78
|
+
messageTransport.emit({
|
|
79
|
+
args: [],
|
|
80
|
+
messageSessionId,
|
|
81
|
+
type: getAckMessageType(requestType),
|
|
82
|
+
});
|
|
83
|
+
}
|
|
71
84
|
const result = handler(...args);
|
|
72
85
|
// If the handler doesn't return a promise,
|
|
73
86
|
// that means we don't need to respond.
|
|
@@ -102,6 +115,8 @@ const createRequestChannel = (messageTransport) => {
|
|
|
102
115
|
const resolveMessageType = getResolveMessageType(requestType);
|
|
103
116
|
const rejectMessageType = getRejectMessageType(requestType);
|
|
104
117
|
const { handleAckMessage, sendMessage } = createRequestChannelMessageSender({
|
|
118
|
+
debugOverride,
|
|
119
|
+
disableAckForOutgoingMessage: disableAcknowledgement,
|
|
105
120
|
messageSessionId,
|
|
106
121
|
messageTransport,
|
|
107
122
|
onTimeout: () => {
|
|
@@ -116,10 +131,16 @@ const createRequestChannel = (messageTransport) => {
|
|
|
116
131
|
const handleMessage = (message) => {
|
|
117
132
|
if (message.messageSessionId !== messageSessionId)
|
|
118
133
|
return;
|
|
134
|
+
if (isDebugEnabled()) {
|
|
135
|
+
logger.debug(`[request ${requestType} ${getTimestamp()}] — received response message (messageSessionId: ${messageSessionId})`);
|
|
136
|
+
}
|
|
119
137
|
const { args: [result], type: incomingType, } = message;
|
|
120
138
|
if (incomingType === resolveMessageType) {
|
|
121
139
|
cleanupMessageHandler();
|
|
122
140
|
resolve(result);
|
|
141
|
+
if (isDebugEnabled()) {
|
|
142
|
+
logger.debug(`[request ${requestType} ${getTimestamp()}] — resolved message (messageSessionId: ${messageSessionId})`);
|
|
143
|
+
}
|
|
123
144
|
return;
|
|
124
145
|
}
|
|
125
146
|
if (incomingType === rejectMessageType) {
|
|
@@ -130,6 +151,9 @@ const createRequestChannel = (messageTransport) => {
|
|
|
130
151
|
else {
|
|
131
152
|
reject(result);
|
|
132
153
|
}
|
|
154
|
+
if (isDebugEnabled()) {
|
|
155
|
+
logger.debug(`[request ${requestType} ${getTimestamp()}] — rejected message (messageSessionId: ${messageSessionId})`);
|
|
156
|
+
}
|
|
133
157
|
return;
|
|
134
158
|
}
|
|
135
159
|
handleAckMessage(message);
|