@prismicio/simulator 0.1.4 → 0.2.0
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/README.md +7 -18
- package/dist/SimulatorAPI.cjs +38 -46
- package/dist/SimulatorAPI.cjs.map +1 -1
- package/dist/SimulatorAPI.d.cts +18 -0
- package/dist/SimulatorAPI.d.ts +16 -10
- package/dist/SimulatorAPI.js +37 -46
- package/dist/SimulatorAPI.js.map +1 -1
- package/dist/SimulatorClient.cjs +41 -51
- package/dist/SimulatorClient.cjs.map +1 -1
- package/dist/SimulatorClient.d.cts +16 -0
- package/dist/SimulatorClient.d.ts +15 -9
- package/dist/SimulatorClient.js +40 -51
- package/dist/SimulatorClient.js.map +1 -1
- package/dist/channel/ChannelEmitter.cjs +112 -143
- package/dist/channel/ChannelEmitter.cjs.map +1 -1
- package/dist/channel/ChannelEmitter.d.cts +38 -0
- package/dist/channel/ChannelEmitter.d.ts +36 -36
- package/dist/channel/ChannelEmitter.js +110 -141
- package/dist/channel/ChannelEmitter.js.map +1 -1
- package/dist/channel/ChannelNetwork.cjs +81 -109
- package/dist/channel/ChannelNetwork.cjs.map +1 -1
- package/dist/channel/ChannelNetwork.d.cts +28 -0
- package/dist/channel/ChannelNetwork.d.ts +25 -21
- package/dist/channel/ChannelNetwork.js +81 -109
- package/dist/channel/ChannelNetwork.js.map +1 -1
- package/dist/channel/ChannelReceiver.cjs +69 -92
- package/dist/channel/ChannelReceiver.cjs.map +1 -1
- package/dist/channel/ChannelReceiver.d.cts +20 -0
- package/dist/channel/ChannelReceiver.d.ts +18 -18
- package/dist/channel/ChannelReceiver.js +67 -90
- package/dist/channel/ChannelReceiver.js.map +1 -1
- package/dist/channel/errors.cjs +41 -46
- package/dist/channel/errors.cjs.map +1 -1
- package/dist/channel/errors.d.cts +28 -0
- package/dist/channel/errors.d.ts +22 -19
- package/dist/channel/errors.js +40 -52
- package/dist/channel/errors.js.map +1 -1
- package/dist/channel/messages.cjs +48 -43
- package/dist/channel/messages.cjs.map +1 -1
- package/dist/channel/messages.d.cts +12 -0
- package/dist/channel/messages.d.ts +12 -10
- package/dist/channel/messages.js +50 -53
- package/dist/channel/messages.js.map +1 -1
- package/dist/channel/types.cjs +15 -11
- package/dist/channel/types.cjs.map +1 -1
- package/dist/channel/types.d.cts +53 -0
- package/dist/channel/types.d.ts +42 -50
- package/dist/channel/types.js +13 -13
- package/dist/channel/types.js.map +1 -1
- package/dist/globalExtensions.d.cts +15 -0
- package/dist/globalExtensions.d.ts +13 -10
- package/dist/index.cjs +24 -33
- package/dist/index.d.cts +10 -0
- package/dist/index.d.ts +10 -8
- package/dist/index.js +5 -25
- package/dist/kit/SimulatorManager.cjs +106 -137
- package/dist/kit/SimulatorManager.cjs.map +1 -1
- package/dist/kit/SimulatorManager.d.cts +19 -0
- package/dist/kit/SimulatorManager.d.ts +16 -12
- package/dist/kit/SimulatorManager.js +103 -134
- package/dist/kit/SimulatorManager.js.map +1 -1
- package/dist/kit/State.cjs +82 -80
- package/dist/kit/State.cjs.map +1 -1
- package/dist/kit/State.d.cts +29 -0
- package/dist/kit/State.d.ts +26 -22
- package/dist/kit/State.js +80 -78
- package/dist/kit/State.js.map +1 -1
- package/dist/kit/domHelpers.cjs +25 -37
- package/dist/kit/domHelpers.cjs.map +1 -1
- package/dist/kit/domHelpers.d.cts +11 -0
- package/dist/kit/domHelpers.d.ts +10 -8
- package/dist/kit/domHelpers.js +25 -43
- package/dist/kit/domHelpers.js.map +1 -1
- package/dist/kit/eventHandlers.cjs +11 -9
- package/dist/kit/eventHandlers.cjs.map +1 -1
- package/dist/kit/eventHandlers.d.cts +8 -0
- package/dist/kit/eventHandlers.d.ts +7 -3
- package/dist/kit/eventHandlers.js +11 -11
- package/dist/kit/eventHandlers.js.map +1 -1
- package/dist/kit/getDefault.cjs +9 -7
- package/dist/kit/getDefault.cjs.map +1 -1
- package/dist/kit/getDefault.d.cts +10 -0
- package/dist/kit/getDefault.d.ts +10 -8
- package/dist/kit/getDefault.js +9 -10
- package/dist/kit/getDefault.js.map +1 -1
- package/dist/kit/messages.cjs +8 -22
- package/dist/kit/messages.cjs.map +1 -1
- package/dist/kit/messages.d.cts +5 -0
- package/dist/kit/messages.d.ts +5 -1
- package/dist/kit/messages.js +8 -23
- package/dist/kit/messages.js.map +1 -1
- package/dist/kit/types.cjs +12 -9
- package/dist/kit/types.cjs.map +1 -1
- package/dist/kit/types.d.cts +28 -0
- package/dist/kit/types.d.ts +24 -19
- package/dist/kit/types.js +11 -10
- package/dist/kit/types.js.map +1 -1
- package/dist/kit.cjs +21 -26
- package/dist/kit.d.cts +8 -0
- package/dist/kit.d.ts +8 -0
- package/dist/kit.js +7 -21
- package/dist/lib/EventEmitter.cjs +16 -25
- package/dist/lib/EventEmitter.cjs.map +1 -1
- package/dist/lib/EventEmitter.d.cts +12 -0
- package/dist/lib/EventEmitter.d.ts +11 -9
- package/dist/lib/EventEmitter.js +16 -26
- package/dist/lib/EventEmitter.js.map +1 -1
- package/dist/lib/throttle.cjs +21 -21
- package/dist/lib/throttle.cjs.map +1 -1
- package/dist/lib/throttle.js +21 -22
- package/dist/lib/throttle.js.map +1 -1
- package/dist/types.cjs +18 -14
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +39 -0
- package/dist/types.d.ts +32 -27
- package/dist/types.js +16 -16
- package/dist/types.js.map +1 -1
- package/package.json +27 -68
- package/src/SimulatorAPI.ts +24 -22
- package/src/SimulatorClient.ts +24 -25
- package/src/channel/ChannelEmitter.ts +71 -74
- package/src/channel/ChannelNetwork.ts +53 -55
- package/src/channel/ChannelReceiver.ts +46 -48
- package/src/channel/errors.ts +14 -14
- package/src/channel/index.ts +10 -10
- package/src/channel/messages.ts +39 -31
- package/src/channel/types.ts +40 -40
- package/src/globalExtensions.ts +6 -6
- package/src/index.ts +8 -8
- package/src/kit/SimulatorManager.ts +64 -63
- package/src/kit/State.ts +45 -44
- package/src/kit/domHelpers.ts +24 -24
- package/src/kit/eventHandlers.ts +6 -6
- package/src/kit/getDefault.ts +8 -8
- package/src/kit/index.ts +8 -8
- package/src/kit/messages.ts +5 -5
- package/src/kit/types.ts +13 -13
- package/src/lib/EventEmitter.ts +8 -8
- package/src/lib/__PRODUCTION__.ts +2 -2
- package/src/lib/throttle.ts +12 -12
- package/src/types.ts +20 -20
- package/dist/channel/index.d.ts +0 -10
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/kit/index.d.ts +0 -8
- package/dist/kit.cjs.map +0 -1
- package/dist/kit.js.map +0 -1
- package/dist/lib/__PRODUCTION__.d.ts +0 -7
- package/dist/lib/throttle.d.ts +0 -1
|
@@ -1,46 +1,48 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type {
|
|
2
2
|
ExtractSuccessResponseMessage,
|
|
3
|
-
InternalEmitterRequestType,
|
|
4
3
|
InternalEmitterTransactions,
|
|
5
|
-
InternalReceiverRequestType,
|
|
6
4
|
SuccessResponseMessage,
|
|
7
5
|
TransactionsHandlers,
|
|
8
6
|
UnknownRequestMessage,
|
|
9
7
|
UnknownResponseMessage,
|
|
10
|
-
UnknownTransaction
|
|
11
|
-
|
|
8
|
+
UnknownTransaction} from "./types";
|
|
9
|
+
import {
|
|
10
|
+
InternalEmitterRequestType,
|
|
11
|
+
InternalReceiverRequestType
|
|
12
|
+
} from "./types"
|
|
12
13
|
|
|
13
14
|
import {
|
|
14
15
|
ChannelNotSetError,
|
|
15
16
|
ConnectionTimeoutError,
|
|
16
17
|
NotReadyError,
|
|
17
|
-
} from "./errors"
|
|
18
|
+
} from "./errors"
|
|
18
19
|
|
|
19
|
-
import {
|
|
20
|
-
ChannelNetwork,
|
|
20
|
+
import type {
|
|
21
21
|
ChannelNetworkOptions,
|
|
22
|
-
PostRequestOptions
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
PostRequestOptions} from "./ChannelNetwork";
|
|
23
|
+
import {
|
|
24
|
+
ChannelNetwork
|
|
25
|
+
} from "./ChannelNetwork"
|
|
26
|
+
import type { AllChannelReceiverOptions } from "./ChannelReceiver"
|
|
25
27
|
import {
|
|
26
28
|
createErrorResponseMessage,
|
|
27
29
|
createSuccessResponseMessage,
|
|
28
30
|
isRequestMessage,
|
|
29
31
|
validateMessage,
|
|
30
|
-
} from "./messages"
|
|
32
|
+
} from "./messages"
|
|
31
33
|
|
|
32
34
|
export type ChannelEmitterOptions = {
|
|
33
|
-
connectTimeout: number
|
|
34
|
-
}
|
|
35
|
+
connectTimeout: number
|
|
36
|
+
}
|
|
35
37
|
|
|
36
38
|
export const channelEmitterDefaultOptions: ChannelEmitterOptions &
|
|
37
39
|
Partial<ChannelNetworkOptions> = {
|
|
38
40
|
connectTimeout: 20000,
|
|
39
41
|
requestIDPrefix: "emitter-",
|
|
40
|
-
}
|
|
42
|
+
}
|
|
41
43
|
|
|
42
44
|
export type AllChannelEmitterOptions = ChannelEmitterOptions &
|
|
43
|
-
ChannelNetworkOptions
|
|
45
|
+
ChannelNetworkOptions
|
|
44
46
|
|
|
45
47
|
export abstract class ChannelEmitter<
|
|
46
48
|
TReceiverTransactions extends Record<string, UnknownTransaction> = Record<
|
|
@@ -53,30 +55,30 @@ export abstract class ChannelEmitter<
|
|
|
53
55
|
TReceiverTransactions,
|
|
54
56
|
ChannelEmitterOptions & TOptions
|
|
55
57
|
> {
|
|
56
|
-
private _target: HTMLIFrameElement
|
|
57
|
-
private _channel: MessageChannel | null = null
|
|
58
|
+
private _target: HTMLIFrameElement
|
|
59
|
+
private _channel: MessageChannel | null = null
|
|
58
60
|
protected get channel(): MessageChannel {
|
|
59
61
|
if (!this._channel) {
|
|
60
|
-
throw new ChannelNotSetError()
|
|
62
|
+
throw new ChannelNotSetError()
|
|
61
63
|
}
|
|
62
64
|
|
|
63
|
-
return this._channel
|
|
65
|
+
return this._channel
|
|
64
66
|
}
|
|
65
67
|
protected set channel(channel: MessageChannel | null) {
|
|
66
|
-
this._channel = channel
|
|
68
|
+
this._channel = channel
|
|
67
69
|
|
|
68
70
|
// Update port automatically
|
|
69
71
|
if (this._channel) {
|
|
70
|
-
this.port = this._channel.port1
|
|
72
|
+
this.port = this._channel.port1
|
|
71
73
|
} else {
|
|
72
|
-
this.port = null
|
|
74
|
+
this.port = null
|
|
73
75
|
}
|
|
74
76
|
}
|
|
75
|
-
private _receiverReady = ""
|
|
76
|
-
private _receiverReadyCallback: (() => Promise<void>) | null = null
|
|
77
|
-
private _connected = false
|
|
77
|
+
private _receiverReady = ""
|
|
78
|
+
private _receiverReadyCallback: (() => Promise<void>) | null = null
|
|
79
|
+
private _connected = false
|
|
78
80
|
public get connected(): boolean {
|
|
79
|
-
return this._connected
|
|
81
|
+
return this._connected
|
|
80
82
|
}
|
|
81
83
|
|
|
82
84
|
constructor(
|
|
@@ -84,13 +86,13 @@ export abstract class ChannelEmitter<
|
|
|
84
86
|
requestHandlers: TransactionsHandlers<TReceiverTransactions>,
|
|
85
87
|
options: Partial<AllChannelEmitterOptions> & TOptions,
|
|
86
88
|
) {
|
|
87
|
-
super(requestHandlers, { ...channelEmitterDefaultOptions, ...options })
|
|
89
|
+
super(requestHandlers, { ...channelEmitterDefaultOptions, ...options })
|
|
88
90
|
|
|
89
|
-
this._target = target
|
|
91
|
+
this._target = target
|
|
90
92
|
|
|
91
93
|
window.addEventListener("message", (event) => {
|
|
92
|
-
this._onPublicMessage(event)
|
|
93
|
-
})
|
|
94
|
+
this._onPublicMessage(event)
|
|
95
|
+
})
|
|
94
96
|
}
|
|
95
97
|
|
|
96
98
|
/**
|
|
@@ -109,10 +111,10 @@ export abstract class ChannelEmitter<
|
|
|
109
111
|
newOrigin = false,
|
|
110
112
|
): Promise<SuccessResponseMessage> {
|
|
111
113
|
// Disconnect first
|
|
112
|
-
this.disconnect()
|
|
114
|
+
this.disconnect()
|
|
113
115
|
// If changing origin we'll need to wait for receiver to be ready again
|
|
114
116
|
if (newOrigin) {
|
|
115
|
-
this._receiverReady = ""
|
|
117
|
+
this._receiverReady = ""
|
|
116
118
|
}
|
|
117
119
|
|
|
118
120
|
// Handshake promise
|
|
@@ -123,28 +125,28 @@ export abstract class ChannelEmitter<
|
|
|
123
125
|
() => {
|
|
124
126
|
// Throw if target doesn't allow access to content window
|
|
125
127
|
if (!this._target.contentWindow) {
|
|
126
|
-
return reject(new Error("Target window is not available"))
|
|
128
|
+
return reject(new Error("Target window is not available"))
|
|
127
129
|
}
|
|
128
130
|
|
|
129
131
|
const receiverReadyTimeout = setTimeout(() => {
|
|
130
|
-
reject(new ConnectionTimeoutError())
|
|
131
|
-
}, this.options.connectTimeout)
|
|
132
|
+
reject(new ConnectionTimeoutError())
|
|
133
|
+
}, this.options.connectTimeout)
|
|
132
134
|
|
|
133
135
|
// Connect to target once ready
|
|
134
136
|
const receiverReadyCallback = async (): Promise<void> => {
|
|
135
137
|
// Clear receiver ready timeout
|
|
136
|
-
clearTimeout(receiverReadyTimeout)
|
|
138
|
+
clearTimeout(receiverReadyTimeout)
|
|
137
139
|
|
|
138
140
|
// Create new message channel (set up port automatically)
|
|
139
141
|
// This is done here to prevent transferable objects neutering
|
|
140
142
|
// when calling `connect()` multiple times
|
|
141
|
-
this.channel = new MessageChannel()
|
|
143
|
+
this.channel = new MessageChannel()
|
|
142
144
|
|
|
143
145
|
// Conclude handshake by sending message channel port to target
|
|
144
146
|
const request = this.createRequestMessage(
|
|
145
147
|
InternalEmitterRequestType.Connect,
|
|
146
148
|
receiverOptions,
|
|
147
|
-
)
|
|
149
|
+
)
|
|
148
150
|
const response = await this.postRequest<
|
|
149
151
|
InternalEmitterTransactions<
|
|
150
152
|
AllChannelReceiverOptions & TReceiverOptions
|
|
@@ -157,8 +159,8 @@ export abstract class ChannelEmitter<
|
|
|
157
159
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
158
160
|
this._target.contentWindow!.postMessage(request, "*", [
|
|
159
161
|
this.channel.port2,
|
|
160
|
-
])
|
|
161
|
-
})
|
|
162
|
+
])
|
|
163
|
+
})
|
|
162
164
|
|
|
163
165
|
// Finish by aknowledging ready
|
|
164
166
|
this.postResponse(
|
|
@@ -166,82 +168,77 @@ export abstract class ChannelEmitter<
|
|
|
166
168
|
(response) => {
|
|
167
169
|
// Target content window is checked in previous statement
|
|
168
170
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
169
|
-
this._target.contentWindow!.postMessage(response, "*")
|
|
171
|
+
this._target.contentWindow!.postMessage(response, "*")
|
|
170
172
|
},
|
|
171
|
-
)
|
|
173
|
+
)
|
|
172
174
|
|
|
173
175
|
// If post request succeed, we're connected
|
|
174
|
-
this._connected = true
|
|
176
|
+
this._connected = true
|
|
175
177
|
|
|
176
|
-
resolve(response)
|
|
177
|
-
}
|
|
178
|
+
resolve(response)
|
|
179
|
+
}
|
|
178
180
|
|
|
179
181
|
if (this._receiverReady) {
|
|
180
182
|
// If receiver is already ready, send port immediately
|
|
181
|
-
receiverReadyCallback()
|
|
183
|
+
receiverReadyCallback()
|
|
182
184
|
} else {
|
|
183
185
|
// Else wait for receiver to be ready
|
|
184
|
-
this._receiverReadyCallback = receiverReadyCallback
|
|
186
|
+
this._receiverReadyCallback = receiverReadyCallback
|
|
185
187
|
}
|
|
186
188
|
},
|
|
187
189
|
{ once: true },
|
|
188
|
-
)
|
|
189
|
-
})
|
|
190
|
+
)
|
|
191
|
+
})
|
|
190
192
|
}
|
|
191
193
|
|
|
192
|
-
/**
|
|
193
|
-
* Destroys current connection to receiver if any
|
|
194
|
-
*/
|
|
194
|
+
/** Destroys current connection to receiver if any */
|
|
195
195
|
disconnect(): void {
|
|
196
|
-
this._connected = false
|
|
197
|
-
this.channel = null
|
|
196
|
+
this._connected = false
|
|
197
|
+
this.channel = null
|
|
198
198
|
}
|
|
199
199
|
|
|
200
|
-
/**
|
|
201
|
-
* Handles public messages
|
|
202
|
-
*/
|
|
200
|
+
/** Handles public messages */
|
|
203
201
|
private async _onPublicMessage(event: MessageEvent<unknown>): Promise<void> {
|
|
204
202
|
// Return is event is not from target
|
|
205
203
|
if (event.source !== this._target.contentWindow) {
|
|
206
|
-
return
|
|
204
|
+
return
|
|
207
205
|
}
|
|
208
206
|
|
|
209
207
|
try {
|
|
210
|
-
const message = validateMessage(event.data)
|
|
208
|
+
const message = validateMessage(event.data)
|
|
211
209
|
|
|
212
210
|
if (isRequestMessage(message)) {
|
|
213
211
|
if (this.options.debug) {
|
|
214
212
|
// eslint-disable-next-line no-console
|
|
215
|
-
console.debug(event.data)
|
|
213
|
+
console.debug(event.data)
|
|
216
214
|
}
|
|
217
215
|
|
|
218
216
|
switch (message.type) {
|
|
219
217
|
case InternalReceiverRequestType.Ready:
|
|
220
|
-
this._receiverReady = message.requestID
|
|
218
|
+
this._receiverReady = message.requestID
|
|
221
219
|
|
|
222
220
|
// If emitter is waiting for receiver to be ready
|
|
223
221
|
if (this._receiverReadyCallback) {
|
|
224
222
|
// We don't await the promise directly as we need to clear the callback first
|
|
225
|
-
const receiverReadyCallbackPromise =
|
|
226
|
-
this._receiverReadyCallback();
|
|
223
|
+
const receiverReadyCallbackPromise = this._receiverReadyCallback()
|
|
227
224
|
|
|
228
|
-
this._receiverReadyCallback = null
|
|
225
|
+
this._receiverReadyCallback = null
|
|
229
226
|
|
|
230
|
-
await receiverReadyCallbackPromise
|
|
227
|
+
await receiverReadyCallbackPromise
|
|
231
228
|
}
|
|
232
|
-
break
|
|
229
|
+
break
|
|
233
230
|
|
|
234
231
|
default:
|
|
235
232
|
this.postResponse(
|
|
236
233
|
createErrorResponseMessage(message.requestID, undefined),
|
|
237
234
|
(response) => {
|
|
238
|
-
(event.source as WindowProxy).postMessage(
|
|
235
|
+
;(event.source as WindowProxy).postMessage(
|
|
239
236
|
response,
|
|
240
237
|
event.origin,
|
|
241
|
-
)
|
|
238
|
+
)
|
|
242
239
|
},
|
|
243
|
-
)
|
|
244
|
-
break
|
|
240
|
+
)
|
|
241
|
+
break
|
|
245
242
|
}
|
|
246
243
|
} else {
|
|
247
244
|
// No response messages are expected on public channel
|
|
@@ -250,7 +247,7 @@ export abstract class ChannelEmitter<
|
|
|
250
247
|
if (error instanceof TypeError) {
|
|
251
248
|
// Ignore unknown messages
|
|
252
249
|
} else {
|
|
253
|
-
throw error
|
|
250
|
+
throw error
|
|
254
251
|
}
|
|
255
252
|
}
|
|
256
253
|
}
|
|
@@ -266,13 +263,13 @@ export abstract class ChannelEmitter<
|
|
|
266
263
|
if (!this._connected) {
|
|
267
264
|
throw new NotReadyError(
|
|
268
265
|
"Emitter is not connected, use `ChannelEmitter.connect()` first",
|
|
269
|
-
)
|
|
266
|
+
)
|
|
270
267
|
}
|
|
271
268
|
|
|
272
269
|
return this.postRequest(
|
|
273
270
|
this.createRequestMessage(type, data),
|
|
274
271
|
undefined,
|
|
275
272
|
options,
|
|
276
|
-
)
|
|
273
|
+
)
|
|
277
274
|
}
|
|
278
275
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type {
|
|
2
2
|
ExtractErrorResponseMessage,
|
|
3
3
|
ExtractSuccessResponseMessage,
|
|
4
4
|
RequestMessage,
|
|
@@ -6,14 +6,14 @@ import {
|
|
|
6
6
|
UnknownRequestMessage,
|
|
7
7
|
UnknownResponseMessage,
|
|
8
8
|
UnknownTransaction,
|
|
9
|
-
} from "./types"
|
|
9
|
+
} from "./types"
|
|
10
10
|
|
|
11
11
|
import {
|
|
12
12
|
PortNotSetError,
|
|
13
13
|
RequestTimeoutError,
|
|
14
14
|
ResponseError,
|
|
15
15
|
TooManyConcurrentRequestsError,
|
|
16
|
-
} from "./errors"
|
|
16
|
+
} from "./errors"
|
|
17
17
|
|
|
18
18
|
import {
|
|
19
19
|
createErrorResponseMessage,
|
|
@@ -22,25 +22,25 @@ import {
|
|
|
22
22
|
isRequestMessage,
|
|
23
23
|
isSuccessResponseMessage,
|
|
24
24
|
validateMessage,
|
|
25
|
-
} from "./messages"
|
|
25
|
+
} from "./messages"
|
|
26
26
|
|
|
27
27
|
export type PostRequestOptions = {
|
|
28
|
-
timeout?: number
|
|
29
|
-
}
|
|
28
|
+
timeout?: number
|
|
29
|
+
}
|
|
30
30
|
|
|
31
31
|
export type ChannelNetworkOptions = {
|
|
32
|
-
debug: boolean
|
|
33
|
-
maximumRequestConcurrency: number
|
|
34
|
-
defaultTimeout: number
|
|
35
|
-
requestIDPrefix: string
|
|
36
|
-
}
|
|
32
|
+
debug: boolean
|
|
33
|
+
maximumRequestConcurrency: number
|
|
34
|
+
defaultTimeout: number
|
|
35
|
+
requestIDPrefix: string
|
|
36
|
+
}
|
|
37
37
|
|
|
38
38
|
export const channelNetworkDefaultOptions: ChannelNetworkOptions = {
|
|
39
39
|
debug: false,
|
|
40
40
|
maximumRequestConcurrency: 20,
|
|
41
41
|
defaultTimeout: 5000,
|
|
42
42
|
requestIDPrefix: "channel-",
|
|
43
|
-
}
|
|
43
|
+
}
|
|
44
44
|
|
|
45
45
|
export abstract class ChannelNetwork<
|
|
46
46
|
TPartnerTransactions extends Record<string, UnknownTransaction> = Record<
|
|
@@ -49,61 +49,61 @@ export abstract class ChannelNetwork<
|
|
|
49
49
|
>,
|
|
50
50
|
TOptions extends Record<string, unknown> = Record<string, unknown>,
|
|
51
51
|
> {
|
|
52
|
-
public requestHandlers: TransactionsHandlers<TPartnerTransactions
|
|
53
|
-
public options: ChannelNetworkOptions & TOptions
|
|
52
|
+
public requestHandlers: TransactionsHandlers<TPartnerTransactions>
|
|
53
|
+
public options: ChannelNetworkOptions & TOptions
|
|
54
54
|
|
|
55
|
-
private _port: MessagePort | null = null
|
|
55
|
+
private _port: MessagePort | null = null
|
|
56
56
|
protected get port(): MessagePort {
|
|
57
57
|
if (!this._port) {
|
|
58
|
-
throw new PortNotSetError()
|
|
58
|
+
throw new PortNotSetError()
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
-
return this._port
|
|
61
|
+
return this._port
|
|
62
62
|
}
|
|
63
63
|
protected set port(port: MessagePort | null) {
|
|
64
64
|
// Destroy old port
|
|
65
65
|
if (this._port) {
|
|
66
|
-
this._port.onmessage = null
|
|
66
|
+
this._port.onmessage = null
|
|
67
67
|
}
|
|
68
68
|
|
|
69
|
-
this._port = port
|
|
69
|
+
this._port = port
|
|
70
70
|
if (this._port) {
|
|
71
|
-
this._port.onmessage = this.onMessage.bind(this)
|
|
71
|
+
this._port.onmessage = this.onMessage.bind(this)
|
|
72
72
|
}
|
|
73
73
|
}
|
|
74
74
|
|
|
75
75
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
76
|
-
private _pendingRequests: Map<string, (response: any) => void> = new Map()
|
|
76
|
+
private _pendingRequests: Map<string, (response: any) => void> = new Map()
|
|
77
77
|
|
|
78
78
|
constructor(
|
|
79
79
|
requestHandlers: TransactionsHandlers<TPartnerTransactions>,
|
|
80
80
|
options: Partial<ChannelNetworkOptions> & TOptions,
|
|
81
81
|
) {
|
|
82
|
-
this.requestHandlers = requestHandlers
|
|
83
|
-
this.options = { ...channelNetworkDefaultOptions, ...options }
|
|
82
|
+
this.requestHandlers = requestHandlers
|
|
83
|
+
this.options = { ...channelNetworkDefaultOptions, ...options }
|
|
84
84
|
}
|
|
85
85
|
|
|
86
86
|
public createRequestMessage<TType extends string = string, TData = undefined>(
|
|
87
87
|
type: TType,
|
|
88
88
|
data: TData,
|
|
89
89
|
): RequestMessage<TType, TData> {
|
|
90
|
-
return createRequestMessage(type, data, this.options.requestIDPrefix)
|
|
90
|
+
return createRequestMessage(type, data, this.options.requestIDPrefix)
|
|
91
91
|
}
|
|
92
92
|
|
|
93
93
|
protected async onMessage(event: MessageEvent<unknown>): Promise<void> {
|
|
94
94
|
if (this.options.debug) {
|
|
95
95
|
// eslint-disable-next-line no-console
|
|
96
|
-
console.debug(event.data)
|
|
96
|
+
console.debug(event.data)
|
|
97
97
|
}
|
|
98
98
|
|
|
99
99
|
try {
|
|
100
|
-
const message = validateMessage(event.data)
|
|
100
|
+
const message = validateMessage(event.data)
|
|
101
101
|
|
|
102
102
|
if (isRequestMessage(message)) {
|
|
103
103
|
if (!this.requestHandlers[message.type]) {
|
|
104
104
|
this.postResponse(
|
|
105
105
|
createErrorResponseMessage(message.requestID, undefined, 501),
|
|
106
|
-
)
|
|
106
|
+
)
|
|
107
107
|
} else {
|
|
108
108
|
try {
|
|
109
109
|
// TODO: Figure out why type cannot be inferred on its own anymore
|
|
@@ -120,13 +120,13 @@ export abstract class ChannelNetwork<
|
|
|
120
120
|
) as Parameters<
|
|
121
121
|
(typeof this.requestHandlers)[string]
|
|
122
122
|
>[1]["error"],
|
|
123
|
-
})
|
|
123
|
+
})
|
|
124
124
|
|
|
125
|
-
this.postResponse(response)
|
|
125
|
+
this.postResponse(response)
|
|
126
126
|
} catch (error) {
|
|
127
127
|
this.postResponse(
|
|
128
128
|
createErrorResponseMessage(message.requestID, error, 500),
|
|
129
|
-
)
|
|
129
|
+
)
|
|
130
130
|
}
|
|
131
131
|
}
|
|
132
132
|
} else {
|
|
@@ -135,20 +135,20 @@ export abstract class ChannelNetwork<
|
|
|
135
135
|
`Unknown request ID received in response: ${JSON.stringify(
|
|
136
136
|
message,
|
|
137
137
|
)}`,
|
|
138
|
-
)
|
|
138
|
+
)
|
|
139
139
|
} else {
|
|
140
140
|
// Pending requests are checked in previous statement
|
|
141
141
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
142
|
-
this._pendingRequests.get(message.requestID)!(message)
|
|
143
|
-
this._pendingRequests.delete(message.requestID)
|
|
142
|
+
this._pendingRequests.get(message.requestID)!(message)
|
|
143
|
+
this._pendingRequests.delete(message.requestID)
|
|
144
144
|
}
|
|
145
145
|
}
|
|
146
146
|
} catch (error) {
|
|
147
147
|
if (error instanceof TypeError) {
|
|
148
|
-
console.warn(error.message)
|
|
148
|
+
console.warn(error.message)
|
|
149
149
|
} else {
|
|
150
150
|
// Should not be possible, but who knows :shrug:
|
|
151
|
-
throw error
|
|
151
|
+
throw error
|
|
152
152
|
}
|
|
153
153
|
}
|
|
154
154
|
}
|
|
@@ -163,40 +163,38 @@ export abstract class ChannelNetwork<
|
|
|
163
163
|
): Promise<ExtractSuccessResponseMessage<TResponse>> {
|
|
164
164
|
if (this.options.debug) {
|
|
165
165
|
// eslint-disable-next-line no-console
|
|
166
|
-
console.debug(request)
|
|
166
|
+
console.debug(request)
|
|
167
167
|
}
|
|
168
168
|
|
|
169
169
|
if (this._pendingRequests.size >= this.options.maximumRequestConcurrency) {
|
|
170
|
-
throw new TooManyConcurrentRequestsError(request)
|
|
170
|
+
throw new TooManyConcurrentRequestsError(request)
|
|
171
171
|
}
|
|
172
172
|
|
|
173
173
|
return new Promise<ExtractSuccessResponseMessage<TResponse>>(
|
|
174
174
|
(resolve, reject) => {
|
|
175
175
|
const requestTimeout = setTimeout(() => {
|
|
176
176
|
if (this._pendingRequests.has(request.requestID)) {
|
|
177
|
-
this._pendingRequests.delete(request.requestID)
|
|
177
|
+
this._pendingRequests.delete(request.requestID)
|
|
178
178
|
}
|
|
179
|
-
reject(new RequestTimeoutError(request))
|
|
180
|
-
}, options.timeout || this.options.defaultTimeout)
|
|
179
|
+
reject(new RequestTimeoutError(request))
|
|
180
|
+
}, options.timeout || this.options.defaultTimeout)
|
|
181
181
|
|
|
182
182
|
this._pendingRequests.set(
|
|
183
183
|
request.requestID,
|
|
184
184
|
(response: TResponse): void => {
|
|
185
|
-
clearTimeout(requestTimeout)
|
|
186
|
-
|
|
187
|
-
isSuccessResponseMessage(response)
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
),
|
|
193
|
-
);
|
|
185
|
+
clearTimeout(requestTimeout)
|
|
186
|
+
|
|
187
|
+
if (isSuccessResponseMessage(response)) {
|
|
188
|
+
resolve(response as ExtractSuccessResponseMessage<TResponse>)
|
|
189
|
+
} else {
|
|
190
|
+
reject(new ResponseError(response as ExtractErrorResponseMessage<TResponse>))
|
|
191
|
+
}
|
|
194
192
|
},
|
|
195
|
-
)
|
|
193
|
+
)
|
|
196
194
|
|
|
197
|
-
postMessage(request)
|
|
195
|
+
postMessage(request)
|
|
198
196
|
},
|
|
199
|
-
)
|
|
197
|
+
)
|
|
200
198
|
}
|
|
201
199
|
|
|
202
200
|
protected postResponse<TResponse extends UnknownResponseMessage>(
|
|
@@ -206,11 +204,11 @@ export abstract class ChannelNetwork<
|
|
|
206
204
|
): TResponse {
|
|
207
205
|
if (this.options.debug) {
|
|
208
206
|
// eslint-disable-next-line no-console
|
|
209
|
-
console.debug(response)
|
|
207
|
+
console.debug(response)
|
|
210
208
|
}
|
|
211
209
|
|
|
212
|
-
postMessage(response)
|
|
210
|
+
postMessage(response)
|
|
213
211
|
|
|
214
|
-
return response
|
|
212
|
+
return response
|
|
215
213
|
}
|
|
216
214
|
}
|