expo 51.0.22 → 51.0.23

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.
@@ -33,7 +33,7 @@ def getRNVersion() {
33
33
  ensureDependeciesWereEvaluated(project)
34
34
 
35
35
  group = 'host.exp.exponent'
36
- version = '51.0.22'
36
+ version = '51.0.23'
37
37
 
38
38
  buildscript {
39
39
  // Simple helper that allows the root project to override versions declared by this library.
@@ -46,7 +46,7 @@ android {
46
46
  namespace "expo.core"
47
47
  defaultConfig {
48
48
  versionCode 1
49
- versionName "51.0.22"
49
+ versionName "51.0.23"
50
50
  consumerProguardFiles("proguard-rules.pro")
51
51
  }
52
52
  testOptions {
@@ -1,6 +1,6 @@
1
1
  import { EventEmitter, EventSubscription } from 'fbemitter';
2
2
  import { WebSocketBackingStore } from './WebSocketBackingStore';
3
- import type { ConnectionInfo } from './devtools.types';
3
+ import type { ConnectionInfo, DevToolsPluginClientOptions } from './devtools.types';
4
4
  export declare const MESSAGE_PROTOCOL_VERSION = 2;
5
5
  export declare const DevToolsPluginMethod = "Expo:DevToolsPlugin";
6
6
  /**
@@ -9,12 +9,13 @@ export declare const DevToolsPluginMethod = "Expo:DevToolsPlugin";
9
9
  */
10
10
  export declare abstract class DevToolsPluginClient {
11
11
  readonly connectionInfo: ConnectionInfo;
12
+ private readonly options?;
12
13
  protected eventEmitter: EventEmitter;
13
14
  private static defaultWSStore;
14
15
  private readonly wsStore;
15
16
  protected isClosed: boolean;
16
17
  protected retries: number;
17
- constructor(connectionInfo: ConnectionInfo);
18
+ constructor(connectionInfo: ConnectionInfo, options?: DevToolsPluginClientOptions | undefined);
18
19
  /**
19
20
  * Initialize the connection.
20
21
  * @hidden
@@ -1 +1 @@
1
- {"version":3,"file":"DevToolsPluginClient.d.ts","sourceRoot":"","sources":["../../src/devtools/DevToolsPluginClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAIvD,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAE1C,eAAO,MAAM,oBAAoB,wBAAwB,CAAC;AAE1D;;;GAGG;AACH,8BAAsB,oBAAoB;aASL,cAAc,EAAE,cAAc;IARjE,SAAS,CAAC,YAAY,EAAE,YAAY,CAAsB;IAE1D,OAAO,CAAC,MAAM,CAAC,cAAc,CAAsD;IACnF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8D;IAEtF,SAAS,CAAC,QAAQ,UAAS;IAC3B,SAAS,CAAC,OAAO,SAAK;gBAEa,cAAc,EAAE,cAAc;IAIjE;;;OAGG;IACU,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAQvC;;OAEG;IACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAWxC;;;;OAIG;IACI,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG;IAkB9C;;;;OAIG;IACI,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,GAAG,iBAAiB;IAI7F;;;;OAIG;IACI,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI;IAIpF;;OAEG;IACI,WAAW,IAAI,OAAO;IAI7B;;OAEG;IACH,SAAS,CAAC,YAAY,IAAI,OAAO,CAAC,SAAS,CAAC;IAuB5C,SAAS,CAAC,aAAa,UAAW,qBAAqB,KAAG,IAAI,CAiB5D;IAEF;;;OAGG;IACI,wBAAwB,IAAI,qBAAqB;CAGzD"}
1
+ {"version":3,"file":"DevToolsPluginClient.d.ts","sourceRoot":"","sources":["../../src/devtools/DevToolsPluginClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,KAAK,EAAE,cAAc,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAIpF,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAE1C,eAAO,MAAM,oBAAoB,wBAAwB,CAAC;AAE1D;;;GAGG;AACH,8BAAsB,oBAAoB;aAUtB,cAAc,EAAE,cAAc;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAV3B,SAAS,CAAC,YAAY,EAAE,YAAY,CAAsB;IAE1D,OAAO,CAAC,MAAM,CAAC,cAAc,CAAsD;IACnF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8D;IAEtF,SAAS,CAAC,QAAQ,UAAS;IAC3B,SAAS,CAAC,OAAO,SAAK;gBAGJ,cAAc,EAAE,cAAc,EAC7B,OAAO,CAAC,yCAA6B;IAKxD;;;OAGG;IACU,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAQvC;;OAEG;IACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAWxC;;;;OAIG;IACI,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG;IAkB9C;;;;OAIG;IACI,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,GAAG,iBAAiB;IAI7F;;;;OAIG;IACI,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI;IAIpF;;OAEG;IACI,WAAW,IAAI,OAAO;IAI7B;;OAEG;IACH,SAAS,CAAC,YAAY,IAAI,OAAO,CAAC,SAAS,CAAC;IAwB5C,SAAS,CAAC,aAAa,UAAW,qBAAqB,KAAG,IAAI,CAiB5D;IAEF;;;OAGG;IACI,wBAAwB,IAAI,qBAAqB;CAGzD"}
@@ -11,13 +11,15 @@ export const DevToolsPluginMethod = 'Expo:DevToolsPlugin';
11
11
  */
12
12
  export class DevToolsPluginClient {
13
13
  connectionInfo;
14
+ options;
14
15
  eventEmitter = new EventEmitter();
15
16
  static defaultWSStore = new WebSocketBackingStore();
16
17
  wsStore = DevToolsPluginClient.defaultWSStore;
17
18
  isClosed = false;
18
19
  retries = 0;
19
- constructor(connectionInfo) {
20
+ constructor(connectionInfo, options) {
20
21
  this.connectionInfo = connectionInfo;
22
+ this.options = options;
21
23
  this.wsStore = connectionInfo.wsStore || DevToolsPluginClient.defaultWSStore;
22
24
  }
23
25
  /**
@@ -93,6 +95,7 @@ export class DevToolsPluginClient {
93
95
  connectAsync() {
94
96
  return new Promise((resolve, reject) => {
95
97
  const ws = new WebSocketWithReconnect(`ws://${this.connectionInfo.devServer}/message`, {
98
+ binaryType: this.options?.websocketBinaryType,
96
99
  onError: (e) => {
97
100
  if (e instanceof Error) {
98
101
  console.warn(`Error happened from the WebSocket connection: ${e.message}\n${e.stack}`);
@@ -1 +1 @@
1
- {"version":3,"file":"DevToolsPluginClient.js","sourceRoot":"","sources":["../../src/devtools/DevToolsPluginClient.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventEmitter, EventSubscription } from 'fbemitter';\n\nimport { WebSocketBackingStore } from './WebSocketBackingStore';\nimport { WebSocketWithReconnect } from './WebSocketWithReconnect';\nimport type { ConnectionInfo } from './devtools.types';\nimport * as logger from './logger';\n\n// This version should be synced with the one in the **createMessageSocketEndpoint.ts** in @react-native-community/cli-server-api\nexport const MESSAGE_PROTOCOL_VERSION = 2;\n\nexport const DevToolsPluginMethod = 'Expo:DevToolsPlugin';\n\n/**\n * This client is for the Expo DevTools Plugins to communicate between the app and the DevTools webpage hosted in a browser.\n * All the code should be both compatible with browsers and React Native.\n */\nexport abstract class DevToolsPluginClient {\n protected eventEmitter: EventEmitter = new EventEmitter();\n\n private static defaultWSStore: WebSocketBackingStore = new WebSocketBackingStore();\n private readonly wsStore: WebSocketBackingStore = DevToolsPluginClient.defaultWSStore;\n\n protected isClosed = false;\n protected retries = 0;\n\n public constructor(public readonly connectionInfo: ConnectionInfo) {\n this.wsStore = connectionInfo.wsStore || DevToolsPluginClient.defaultWSStore;\n }\n\n /**\n * Initialize the connection.\n * @hidden\n */\n public async initAsync(): Promise<void> {\n if (this.wsStore.ws == null) {\n this.wsStore.ws = await this.connectAsync();\n }\n this.wsStore.refCount += 1;\n this.wsStore.ws.addEventListener('message', this.handleMessage);\n }\n\n /**\n * Close the connection.\n */\n public async closeAsync(): Promise<void> {\n this.isClosed = true;\n this.wsStore.ws?.removeEventListener('message', this.handleMessage);\n this.wsStore.refCount -= 1;\n if (this.wsStore.refCount < 1) {\n this.wsStore.ws?.close();\n this.wsStore.ws = null;\n }\n this.eventEmitter.removeAllListeners();\n }\n\n /**\n * Send a message to the other end of DevTools.\n * @param method A method name.\n * @param params any extra payload.\n */\n public sendMessage(method: string, params: any) {\n if (this.wsStore.ws?.readyState === WebSocket.CLOSED) {\n logger.warn('Unable to send message in a disconnected state.');\n return;\n }\n\n const payload: Record<string, any> = {\n version: MESSAGE_PROTOCOL_VERSION,\n pluginName: this.connectionInfo.pluginName,\n method: DevToolsPluginMethod,\n params: {\n method,\n params,\n },\n };\n this.wsStore.ws?.send(JSON.stringify(payload));\n }\n\n /**\n * Subscribe to a message from the other end of DevTools.\n * @param method Subscribe to a message with a method name.\n * @param listener Listener to be called when a message is received.\n */\n public addMessageListener(method: string, listener: (params: any) => void): EventSubscription {\n return this.eventEmitter.addListener(method, listener);\n }\n\n /**\n * Subscribe to a message from the other end of DevTools just once.\n * @param method Subscribe to a message with a method name.\n * @param listener Listener to be called when a message is received.\n */\n public addMessageListenerOnce(method: string, listener: (params: any) => void): void {\n this.eventEmitter.once(method, listener);\n }\n\n /**\n * Returns whether the client is connected to the server.\n */\n public isConnected(): boolean {\n return this.wsStore.ws?.readyState === WebSocket.OPEN;\n }\n\n /**\n * The method to create the WebSocket connection.\n */\n protected connectAsync(): Promise<WebSocket> {\n return new Promise((resolve, reject) => {\n const ws = new WebSocketWithReconnect(`ws://${this.connectionInfo.devServer}/message`, {\n onError: (e: unknown) => {\n if (e instanceof Error) {\n console.warn(`Error happened from the WebSocket connection: ${e.message}\\n${e.stack}`);\n } else {\n console.warn(`Error happened from the WebSocket connection: ${JSON.stringify(e)}`);\n }\n },\n });\n ws.addEventListener('open', () => {\n resolve(ws);\n });\n ws.addEventListener('error', (e) => {\n reject(e);\n });\n ws.addEventListener('close', (e: WebSocketCloseEvent) => {\n logger.info('WebSocket closed', e.code, e.reason);\n });\n });\n }\n\n protected handleMessage = (event: WebSocketMessageEvent): void => {\n let payload;\n try {\n payload = JSON.parse(event.data);\n } catch (e) {\n logger.info('Failed to parse JSON', e);\n return;\n }\n\n if (payload.version !== MESSAGE_PROTOCOL_VERSION || payload.method !== DevToolsPluginMethod) {\n return;\n }\n if (payload.pluginName && payload.pluginName !== this.connectionInfo.pluginName) {\n return;\n }\n\n this.eventEmitter.emit(payload.params.method, payload.params.params);\n };\n\n /**\n * Get the WebSocket backing store. Exposed for testing.\n * @hidden\n */\n public getWebSocketBackingStore(): WebSocketBackingStore {\n return this.wsStore;\n }\n}\n"]}
1
+ {"version":3,"file":"DevToolsPluginClient.js","sourceRoot":"","sources":["../../src/devtools/DevToolsPluginClient.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventEmitter, EventSubscription } from 'fbemitter';\n\nimport { WebSocketBackingStore } from './WebSocketBackingStore';\nimport { WebSocketWithReconnect } from './WebSocketWithReconnect';\nimport type { ConnectionInfo, DevToolsPluginClientOptions } from './devtools.types';\nimport * as logger from './logger';\n\n// This version should be synced with the one in the **createMessageSocketEndpoint.ts** in @react-native-community/cli-server-api\nexport const MESSAGE_PROTOCOL_VERSION = 2;\n\nexport const DevToolsPluginMethod = 'Expo:DevToolsPlugin';\n\n/**\n * This client is for the Expo DevTools Plugins to communicate between the app and the DevTools webpage hosted in a browser.\n * All the code should be both compatible with browsers and React Native.\n */\nexport abstract class DevToolsPluginClient {\n protected eventEmitter: EventEmitter = new EventEmitter();\n\n private static defaultWSStore: WebSocketBackingStore = new WebSocketBackingStore();\n private readonly wsStore: WebSocketBackingStore = DevToolsPluginClient.defaultWSStore;\n\n protected isClosed = false;\n protected retries = 0;\n\n public constructor(\n public readonly connectionInfo: ConnectionInfo,\n private readonly options?: DevToolsPluginClientOptions\n ) {\n this.wsStore = connectionInfo.wsStore || DevToolsPluginClient.defaultWSStore;\n }\n\n /**\n * Initialize the connection.\n * @hidden\n */\n public async initAsync(): Promise<void> {\n if (this.wsStore.ws == null) {\n this.wsStore.ws = await this.connectAsync();\n }\n this.wsStore.refCount += 1;\n this.wsStore.ws.addEventListener('message', this.handleMessage);\n }\n\n /**\n * Close the connection.\n */\n public async closeAsync(): Promise<void> {\n this.isClosed = true;\n this.wsStore.ws?.removeEventListener('message', this.handleMessage);\n this.wsStore.refCount -= 1;\n if (this.wsStore.refCount < 1) {\n this.wsStore.ws?.close();\n this.wsStore.ws = null;\n }\n this.eventEmitter.removeAllListeners();\n }\n\n /**\n * Send a message to the other end of DevTools.\n * @param method A method name.\n * @param params any extra payload.\n */\n public sendMessage(method: string, params: any) {\n if (this.wsStore.ws?.readyState === WebSocket.CLOSED) {\n logger.warn('Unable to send message in a disconnected state.');\n return;\n }\n\n const payload: Record<string, any> = {\n version: MESSAGE_PROTOCOL_VERSION,\n pluginName: this.connectionInfo.pluginName,\n method: DevToolsPluginMethod,\n params: {\n method,\n params,\n },\n };\n this.wsStore.ws?.send(JSON.stringify(payload));\n }\n\n /**\n * Subscribe to a message from the other end of DevTools.\n * @param method Subscribe to a message with a method name.\n * @param listener Listener to be called when a message is received.\n */\n public addMessageListener(method: string, listener: (params: any) => void): EventSubscription {\n return this.eventEmitter.addListener(method, listener);\n }\n\n /**\n * Subscribe to a message from the other end of DevTools just once.\n * @param method Subscribe to a message with a method name.\n * @param listener Listener to be called when a message is received.\n */\n public addMessageListenerOnce(method: string, listener: (params: any) => void): void {\n this.eventEmitter.once(method, listener);\n }\n\n /**\n * Returns whether the client is connected to the server.\n */\n public isConnected(): boolean {\n return this.wsStore.ws?.readyState === WebSocket.OPEN;\n }\n\n /**\n * The method to create the WebSocket connection.\n */\n protected connectAsync(): Promise<WebSocket> {\n return new Promise((resolve, reject) => {\n const ws = new WebSocketWithReconnect(`ws://${this.connectionInfo.devServer}/message`, {\n binaryType: this.options?.websocketBinaryType,\n onError: (e: unknown) => {\n if (e instanceof Error) {\n console.warn(`Error happened from the WebSocket connection: ${e.message}\\n${e.stack}`);\n } else {\n console.warn(`Error happened from the WebSocket connection: ${JSON.stringify(e)}`);\n }\n },\n });\n ws.addEventListener('open', () => {\n resolve(ws);\n });\n ws.addEventListener('error', (e) => {\n reject(e);\n });\n ws.addEventListener('close', (e: WebSocketCloseEvent) => {\n logger.info('WebSocket closed', e.code, e.reason);\n });\n });\n }\n\n protected handleMessage = (event: WebSocketMessageEvent): void => {\n let payload;\n try {\n payload = JSON.parse(event.data);\n } catch (e) {\n logger.info('Failed to parse JSON', e);\n return;\n }\n\n if (payload.version !== MESSAGE_PROTOCOL_VERSION || payload.method !== DevToolsPluginMethod) {\n return;\n }\n if (payload.pluginName && payload.pluginName !== this.connectionInfo.pluginName) {\n return;\n }\n\n this.eventEmitter.emit(payload.params.method, payload.params.params);\n };\n\n /**\n * Get the WebSocket backing store. Exposed for testing.\n * @hidden\n */\n public getWebSocketBackingStore(): WebSocketBackingStore {\n return this.wsStore;\n }\n}\n"]}
@@ -1,14 +1,14 @@
1
1
  import type { DevToolsPluginClient } from './DevToolsPluginClient';
2
- import type { ConnectionInfo } from './devtools.types';
2
+ import type { ConnectionInfo, DevToolsPluginClientOptions } from './devtools.types';
3
3
  /**
4
4
  * Factory of DevToolsPluginClient based on sender types.
5
5
  * @hidden
6
6
  */
7
- export declare function createDevToolsPluginClient(connectionInfo: ConnectionInfo): Promise<DevToolsPluginClient>;
7
+ export declare function createDevToolsPluginClient(connectionInfo: ConnectionInfo, options?: DevToolsPluginClientOptions): Promise<DevToolsPluginClient>;
8
8
  /**
9
9
  * Public API to get the DevToolsPluginClient instance.
10
10
  */
11
- export declare function getDevToolsPluginClientAsync(pluginName: string): Promise<DevToolsPluginClient>;
11
+ export declare function getDevToolsPluginClientAsync(pluginName: string, options?: DevToolsPluginClientOptions): Promise<DevToolsPluginClient>;
12
12
  /**
13
13
  * Internal testing API to cleanup all DevToolsPluginClient instances.
14
14
  */
@@ -1 +1 @@
1
- {"version":3,"file":"DevToolsPluginClientFactory.d.ts","sourceRoot":"","sources":["../../src/devtools/DevToolsPluginClientFactory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAGnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAKvD;;;GAGG;AACH,wBAAsB,0BAA0B,CAC9C,cAAc,EAAE,cAAc,GAC7B,OAAO,CAAC,oBAAoB,CAAC,CAS/B;AAED;;GAEG;AACH,wBAAsB,4BAA4B,CAChD,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,oBAAoB,CAAC,CAyB/B;AAED;;GAEG;AACH,wBAAgB,8BAA8B,SAU7C"}
1
+ {"version":3,"file":"DevToolsPluginClientFactory.d.ts","sourceRoot":"","sources":["../../src/devtools/DevToolsPluginClientFactory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAGnE,OAAO,KAAK,EAAE,cAAc,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAKpF;;;GAGG;AACH,wBAAsB,0BAA0B,CAC9C,cAAc,EAAE,cAAc,EAC9B,OAAO,CAAC,EAAE,2BAA2B,GACpC,OAAO,CAAC,oBAAoB,CAAC,CAS/B;AAED;;GAEG;AACH,wBAAsB,4BAA4B,CAChD,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,2BAA2B,GACpC,OAAO,CAAC,oBAAoB,CAAC,CAyB/B;AAED;;GAEG;AACH,wBAAgB,8BAA8B,SAU7C"}
@@ -6,13 +6,13 @@ const instanceMap = {};
6
6
  * Factory of DevToolsPluginClient based on sender types.
7
7
  * @hidden
8
8
  */
9
- export async function createDevToolsPluginClient(connectionInfo) {
9
+ export async function createDevToolsPluginClient(connectionInfo, options) {
10
10
  let client;
11
11
  if (connectionInfo.sender === 'app') {
12
- client = new DevToolsPluginClientImplApp(connectionInfo);
12
+ client = new DevToolsPluginClientImplApp(connectionInfo, options);
13
13
  }
14
14
  else {
15
- client = new DevToolsPluginClientImplBrowser(connectionInfo);
15
+ client = new DevToolsPluginClientImplBrowser(connectionInfo, options);
16
16
  }
17
17
  await client.initAsync();
18
18
  return client;
@@ -20,7 +20,7 @@ export async function createDevToolsPluginClient(connectionInfo) {
20
20
  /**
21
21
  * Public API to get the DevToolsPluginClient instance.
22
22
  */
23
- export async function getDevToolsPluginClientAsync(pluginName) {
23
+ export async function getDevToolsPluginClientAsync(pluginName, options) {
24
24
  const connectionInfo = getConnectionInfo();
25
25
  let instance = instanceMap[pluginName];
26
26
  if (instance != null) {
@@ -35,7 +35,7 @@ export async function getDevToolsPluginClientAsync(pluginName) {
35
35
  }
36
36
  }
37
37
  if (instance == null) {
38
- const instancePromise = createDevToolsPluginClient({ ...connectionInfo, pluginName });
38
+ const instancePromise = createDevToolsPluginClient({ ...connectionInfo, pluginName }, options);
39
39
  instanceMap[pluginName] = instancePromise;
40
40
  instance = await instancePromise;
41
41
  instanceMap[pluginName] = instance;
@@ -1 +1 @@
1
- {"version":3,"file":"DevToolsPluginClientFactory.js","sourceRoot":"","sources":["../../src/devtools/DevToolsPluginClientFactory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AAEpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,WAAW,GAAyE,EAAE,CAAC;AAE7F;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,cAA8B;IAE9B,IAAI,MAA4B,CAAC;IACjC,IAAI,cAAc,CAAC,MAAM,KAAK,KAAK,EAAE;QACnC,MAAM,GAAG,IAAI,2BAA2B,CAAC,cAAc,CAAC,CAAC;KAC1D;SAAM;QACL,MAAM,GAAG,IAAI,+BAA+B,CAAC,cAAc,CAAC,CAAC;KAC9D;IACD,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;IACzB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,UAAkB;IAElB,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC;IAE3C,IAAI,QAAQ,GACV,WAAW,CAAC,UAAU,CAAC,CAAC;IAC1B,IAAI,QAAQ,IAAI,IAAI,EAAE;QACpB,IAAI,QAAQ,YAAY,OAAO,EAAE;YAC/B,OAAO,QAAQ,CAAC;SACjB;QACD,IACE,QAAQ,CAAC,WAAW,EAAE,KAAK,KAAK;YAChC,QAAQ,CAAC,cAAc,CAAC,SAAS,KAAK,cAAc,CAAC,SAAS,EAC9D;YACA,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;YAC5B,OAAO,WAAW,CAAC,UAAU,CAAC,CAAC;YAC/B,QAAQ,GAAG,IAAI,CAAC;SACjB;KACF;IACD,IAAI,QAAQ,IAAI,IAAI,EAAE;QACpB,MAAM,eAAe,GAAG,0BAA0B,CAAC,EAAE,GAAG,cAAc,EAAE,UAAU,EAAE,CAAC,CAAC;QACtF,WAAW,CAAC,UAAU,CAAC,GAAG,eAAe,CAAC;QAC1C,QAAQ,GAAG,MAAM,eAAe,CAAC;QACjC,WAAW,CAAC,UAAU,CAAC,GAAG,QAAQ,CAAC;KACpC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,8BAA8B;IAC5C,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;QACjD,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;QACzC,OAAO,WAAW,CAAC,UAAU,CAAC,CAAC;QAC/B,IAAI,QAAQ,YAAY,OAAO,EAAE;YAC/B,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;SACpD;aAAM;YACL,QAAQ,CAAC,UAAU,EAAE,CAAC;SACvB;KACF;AACH,CAAC","sourcesContent":["import type { DevToolsPluginClient } from './DevToolsPluginClient';\nimport { DevToolsPluginClientImplApp } from './DevToolsPluginClientImplApp';\nimport { DevToolsPluginClientImplBrowser } from './DevToolsPluginClientImplBrowser';\nimport type { ConnectionInfo } from './devtools.types';\nimport { getConnectionInfo } from './getConnectionInfo';\n\nconst instanceMap: Record<string, DevToolsPluginClient | Promise<DevToolsPluginClient>> = {};\n\n/**\n * Factory of DevToolsPluginClient based on sender types.\n * @hidden\n */\nexport async function createDevToolsPluginClient(\n connectionInfo: ConnectionInfo\n): Promise<DevToolsPluginClient> {\n let client: DevToolsPluginClient;\n if (connectionInfo.sender === 'app') {\n client = new DevToolsPluginClientImplApp(connectionInfo);\n } else {\n client = new DevToolsPluginClientImplBrowser(connectionInfo);\n }\n await client.initAsync();\n return client;\n}\n\n/**\n * Public API to get the DevToolsPluginClient instance.\n */\nexport async function getDevToolsPluginClientAsync(\n pluginName: string\n): Promise<DevToolsPluginClient> {\n const connectionInfo = getConnectionInfo();\n\n let instance: DevToolsPluginClient | Promise<DevToolsPluginClient> | null =\n instanceMap[pluginName];\n if (instance != null) {\n if (instance instanceof Promise) {\n return instance;\n }\n if (\n instance.isConnected() === false ||\n instance.connectionInfo.devServer !== connectionInfo.devServer\n ) {\n await instance.closeAsync();\n delete instanceMap[pluginName];\n instance = null;\n }\n }\n if (instance == null) {\n const instancePromise = createDevToolsPluginClient({ ...connectionInfo, pluginName });\n instanceMap[pluginName] = instancePromise;\n instance = await instancePromise;\n instanceMap[pluginName] = instance;\n }\n return instance;\n}\n\n/**\n * Internal testing API to cleanup all DevToolsPluginClient instances.\n */\nexport function cleanupDevToolsPluginInstances() {\n for (const pluginName of Object.keys(instanceMap)) {\n const instance = instanceMap[pluginName];\n delete instanceMap[pluginName];\n if (instance instanceof Promise) {\n instance.then((instance) => instance.closeAsync());\n } else {\n instance.closeAsync();\n }\n }\n}\n"]}
1
+ {"version":3,"file":"DevToolsPluginClientFactory.js","sourceRoot":"","sources":["../../src/devtools/DevToolsPluginClientFactory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AAEpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,WAAW,GAAyE,EAAE,CAAC;AAE7F;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,cAA8B,EAC9B,OAAqC;IAErC,IAAI,MAA4B,CAAC;IACjC,IAAI,cAAc,CAAC,MAAM,KAAK,KAAK,EAAE;QACnC,MAAM,GAAG,IAAI,2BAA2B,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;KACnE;SAAM;QACL,MAAM,GAAG,IAAI,+BAA+B,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;KACvE;IACD,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;IACzB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,UAAkB,EAClB,OAAqC;IAErC,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC;IAE3C,IAAI,QAAQ,GACV,WAAW,CAAC,UAAU,CAAC,CAAC;IAC1B,IAAI,QAAQ,IAAI,IAAI,EAAE;QACpB,IAAI,QAAQ,YAAY,OAAO,EAAE;YAC/B,OAAO,QAAQ,CAAC;SACjB;QACD,IACE,QAAQ,CAAC,WAAW,EAAE,KAAK,KAAK;YAChC,QAAQ,CAAC,cAAc,CAAC,SAAS,KAAK,cAAc,CAAC,SAAS,EAC9D;YACA,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;YAC5B,OAAO,WAAW,CAAC,UAAU,CAAC,CAAC;YAC/B,QAAQ,GAAG,IAAI,CAAC;SACjB;KACF;IACD,IAAI,QAAQ,IAAI,IAAI,EAAE;QACpB,MAAM,eAAe,GAAG,0BAA0B,CAAC,EAAE,GAAG,cAAc,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,CAAC;QAC/F,WAAW,CAAC,UAAU,CAAC,GAAG,eAAe,CAAC;QAC1C,QAAQ,GAAG,MAAM,eAAe,CAAC;QACjC,WAAW,CAAC,UAAU,CAAC,GAAG,QAAQ,CAAC;KACpC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,8BAA8B;IAC5C,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;QACjD,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;QACzC,OAAO,WAAW,CAAC,UAAU,CAAC,CAAC;QAC/B,IAAI,QAAQ,YAAY,OAAO,EAAE;YAC/B,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;SACpD;aAAM;YACL,QAAQ,CAAC,UAAU,EAAE,CAAC;SACvB;KACF;AACH,CAAC","sourcesContent":["import type { DevToolsPluginClient } from './DevToolsPluginClient';\nimport { DevToolsPluginClientImplApp } from './DevToolsPluginClientImplApp';\nimport { DevToolsPluginClientImplBrowser } from './DevToolsPluginClientImplBrowser';\nimport type { ConnectionInfo, DevToolsPluginClientOptions } from './devtools.types';\nimport { getConnectionInfo } from './getConnectionInfo';\n\nconst instanceMap: Record<string, DevToolsPluginClient | Promise<DevToolsPluginClient>> = {};\n\n/**\n * Factory of DevToolsPluginClient based on sender types.\n * @hidden\n */\nexport async function createDevToolsPluginClient(\n connectionInfo: ConnectionInfo,\n options?: DevToolsPluginClientOptions\n): Promise<DevToolsPluginClient> {\n let client: DevToolsPluginClient;\n if (connectionInfo.sender === 'app') {\n client = new DevToolsPluginClientImplApp(connectionInfo, options);\n } else {\n client = new DevToolsPluginClientImplBrowser(connectionInfo, options);\n }\n await client.initAsync();\n return client;\n}\n\n/**\n * Public API to get the DevToolsPluginClient instance.\n */\nexport async function getDevToolsPluginClientAsync(\n pluginName: string,\n options?: DevToolsPluginClientOptions\n): Promise<DevToolsPluginClient> {\n const connectionInfo = getConnectionInfo();\n\n let instance: DevToolsPluginClient | Promise<DevToolsPluginClient> | null =\n instanceMap[pluginName];\n if (instance != null) {\n if (instance instanceof Promise) {\n return instance;\n }\n if (\n instance.isConnected() === false ||\n instance.connectionInfo.devServer !== connectionInfo.devServer\n ) {\n await instance.closeAsync();\n delete instanceMap[pluginName];\n instance = null;\n }\n }\n if (instance == null) {\n const instancePromise = createDevToolsPluginClient({ ...connectionInfo, pluginName }, options);\n instanceMap[pluginName] = instancePromise;\n instance = await instancePromise;\n instanceMap[pluginName] = instance;\n }\n return instance;\n}\n\n/**\n * Internal testing API to cleanup all DevToolsPluginClient instances.\n */\nexport function cleanupDevToolsPluginInstances() {\n for (const pluginName of Object.keys(instanceMap)) {\n const instance = instanceMap[pluginName];\n delete instanceMap[pluginName];\n if (instance instanceof Promise) {\n instance.then((instance) => instance.closeAsync());\n } else {\n instance.closeAsync();\n }\n }\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import type { DevToolsPluginClientOptions } from './devtools.types';
1
2
  export interface Options {
2
3
  /**
3
4
  * Reconnect interval in milliseconds.
@@ -23,6 +24,10 @@ export interface Options {
23
24
  * @default no-op
24
25
  */
25
26
  onReconnect?: (reason: string) => void;
27
+ /**
28
+ * The [`binaryType`](https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/binaryType).
29
+ */
30
+ binaryType?: DevToolsPluginClientOptions['websocketBinaryType'];
26
31
  }
27
32
  export declare class WebSocketWithReconnect implements WebSocket {
28
33
  readonly url: string;
@@ -39,6 +44,7 @@ export declare class WebSocketWithReconnect implements WebSocket {
39
44
  private lastCloseEvent;
40
45
  private readonly emitter;
41
46
  private readonly eventSubscriptions;
47
+ private readonly wsBinaryType?;
42
48
  constructor(url: string, options?: Options);
43
49
  close(code?: number, reason?: string): void;
44
50
  addEventListener(event: 'message', listener: (event: WebSocketMessageEvent) => void): void;
@@ -1 +1 @@
1
- {"version":3,"file":"WebSocketWithReconnect.d.ts","sourceRoot":"","sources":["../../src/devtools/WebSocketWithReconnect.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"WebSocketWithReconnect.d.ts","sourceRoot":"","sources":["../../src/devtools/WebSocketWithReconnect.ts"],"names":[],"mappings":"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"}
@@ -14,6 +14,7 @@ export class WebSocketWithReconnect {
14
14
  lastCloseEvent = null;
15
15
  emitter = new EventEmitter();
16
16
  eventSubscriptions = [];
17
+ wsBinaryType;
17
18
  constructor(url, options) {
18
19
  this.url = url;
19
20
  this.retriesInterval = options?.retriesInterval ?? 1500;
@@ -25,6 +26,7 @@ export class WebSocketWithReconnect {
25
26
  throw error;
26
27
  });
27
28
  this.onReconnect = options?.onReconnect ?? (() => { });
29
+ this.wsBinaryType = options?.binaryType;
28
30
  this.connect();
29
31
  }
30
32
  close(code, reason) {
@@ -61,6 +63,9 @@ export class WebSocketWithReconnect {
61
63
  }
62
64
  this.connectTimeoutHandle = setTimeout(this.handleConnectTimeout, this.connectTimeout);
63
65
  this.ws = new WebSocket(this.url.toString());
66
+ if (this.wsBinaryType != null) {
67
+ this.ws.binaryType = this.wsBinaryType;
68
+ }
64
69
  this.ws.addEventListener('message', this.handleMessage);
65
70
  this.ws.addEventListener('open', this.handleOpen);
66
71
  // @ts-ignore TypeScript expects (e: Event) => any, but we want (e: WebSocketErrorEvent) => any
@@ -1 +1 @@
1
- {"version":3,"file":"WebSocketWithReconnect.js","sourceRoot":"","sources":["../../src/devtools/WebSocketWithReconnect.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventEmitter, type EventSubscription } from 'fbemitter';\n\nexport interface Options {\n /**\n * Reconnect interval in milliseconds.\n * @default 1500\n */\n retriesInterval?: number;\n\n /**\n * The maximum number of retries.\n * @default 200\n */\n maxRetries?: number;\n\n /**\n * The timeout in milliseconds for the WebSocket connecting.\n */\n connectTimeout?: number;\n\n /**\n * The error handler.\n * @default throwing an error\n */\n onError?: (error: Error) => void;\n\n /**\n * The callback to be called when the WebSocket is reconnected.\n * @default no-op\n */\n onReconnect?: (reason: string) => void;\n}\n\nexport class WebSocketWithReconnect implements WebSocket {\n private readonly retriesInterval: number;\n private readonly maxRetries: number;\n private readonly connectTimeout: number;\n private readonly onError: (error: Error) => void;\n private readonly onReconnect: (reason: string) => void;\n\n private ws: WebSocket | null = null;\n private retries = 0;\n private connectTimeoutHandle: ReturnType<typeof setTimeout> | null = null;\n private isClosed = false;\n private sendQueue: (string | ArrayBufferView | Blob | ArrayBufferLike)[] = [];\n private lastCloseEvent: { code?: number; reason?: string; message?: string } | null = null;\n\n private readonly emitter = new EventEmitter();\n private readonly eventSubscriptions: EventSubscription[] = [];\n\n constructor(\n public readonly url: string,\n options?: Options\n ) {\n this.retriesInterval = options?.retriesInterval ?? 1500;\n this.maxRetries = options?.maxRetries ?? 200;\n this.connectTimeout = options?.connectTimeout ?? 5000;\n this.onError =\n options?.onError ??\n ((error) => {\n throw error;\n });\n this.onReconnect = options?.onReconnect ?? (() => {});\n\n this.connect();\n }\n\n public close(code?: number, reason?: string) {\n this.clearConnectTimeoutIfNeeded();\n this.emitter.emit(\n 'close',\n this.lastCloseEvent ?? {\n code: code ?? 1000,\n reason: reason ?? 'Explicit closing',\n message: 'Explicit closing',\n }\n );\n this.lastCloseEvent = null;\n this.isClosed = true;\n this.emitter.removeAllListeners();\n this.sendQueue = [];\n if (this.ws != null) {\n const ws = this.ws;\n this.ws = null;\n this.wsClose(ws);\n }\n }\n\n public addEventListener(event: 'message', listener: (event: WebSocketMessageEvent) => void): void;\n public addEventListener(event: 'open', listener: () => void): void;\n public addEventListener(event: 'error', listener: (event: WebSocketErrorEvent) => void): void;\n public addEventListener(event: 'close', listener: (event: WebSocketCloseEvent) => void): void;\n public addEventListener(event: string, listener: (event: any) => void) {\n this.eventSubscriptions.push(this.emitter.addListener(event, listener));\n }\n\n public removeEventListener(event: string, listener: (event: any) => void) {\n const index = this.eventSubscriptions.findIndex(\n (subscription) => subscription.listener === listener\n );\n if (index >= 0) {\n this.eventSubscriptions[index].remove();\n this.eventSubscriptions.splice(index, 1);\n }\n }\n\n //#region Internals\n\n private connect() {\n if (this.ws != null) {\n return;\n }\n this.connectTimeoutHandle = setTimeout(this.handleConnectTimeout, this.connectTimeout);\n\n this.ws = new WebSocket(this.url.toString());\n this.ws.addEventListener('message', this.handleMessage);\n this.ws.addEventListener('open', this.handleOpen);\n // @ts-ignore TypeScript expects (e: Event) => any, but we want (e: WebSocketErrorEvent) => any\n this.ws.addEventListener('error', this.handleError);\n this.ws.addEventListener('close', this.handleClose);\n }\n\n public send(data: string | ArrayBufferView | Blob | ArrayBufferLike): void {\n if (this.isClosed) {\n this.onError(new Error('Unable to send data: WebSocket is closed'));\n return;\n }\n\n if (this.retries >= this.maxRetries) {\n this.onError(\n new Error(`Unable to send data: Exceeded max retries - retries[${this.retries}]`)\n );\n return;\n }\n\n const ws = this.ws;\n if (ws != null && ws.readyState === WebSocket.OPEN) {\n ws.send(data);\n } else {\n this.sendQueue.push(data);\n }\n }\n\n private handleOpen = () => {\n this.clearConnectTimeoutIfNeeded();\n this.lastCloseEvent = null;\n this.emitter.emit('open');\n\n const sendQueue = this.sendQueue;\n this.sendQueue = [];\n for (const data of sendQueue) {\n this.send(data);\n }\n };\n\n private handleMessage = (event: WebSocketMessageEvent) => {\n this.emitter.emit('message', event);\n };\n\n private handleError = (event: WebSocketErrorEvent) => {\n this.clearConnectTimeoutIfNeeded();\n this.emitter.emit('error', event);\n this.reconnectIfNeeded(`WebSocket error - ${event.message}`);\n };\n\n private handleClose = (event: WebSocketCloseEvent) => {\n this.clearConnectTimeoutIfNeeded();\n this.lastCloseEvent = {\n code: event.code,\n reason: event.reason,\n message: event.message,\n };\n this.reconnectIfNeeded(`WebSocket closed - code[${event.code}] reason[${event.reason}]`);\n };\n\n private handleConnectTimeout = () => {\n this.reconnectIfNeeded('Timeout from connecting to the WebSocket');\n };\n\n private clearConnectTimeoutIfNeeded() {\n if (this.connectTimeoutHandle != null) {\n clearTimeout(this.connectTimeoutHandle);\n this.connectTimeoutHandle = null;\n }\n }\n\n private reconnectIfNeeded(reason: string) {\n if (this.ws != null) {\n this.wsClose(this.ws);\n this.ws = null;\n }\n if (this.isClosed) {\n return;\n }\n\n if (this.retries >= this.maxRetries) {\n this.onError(new Error('Exceeded max retries'));\n this.close();\n return;\n }\n\n setTimeout(() => {\n this.retries += 1;\n this.connect();\n this.onReconnect(reason);\n }, this.retriesInterval);\n }\n\n private wsClose(ws: WebSocket) {\n try {\n ws.removeEventListener('message', this.handleMessage);\n ws.removeEventListener('open', this.handleOpen);\n // @ts-ignore: TypeScript expects (e: Event) => any, but we want (e: WebSocketErrorEvent) => any\n ws.removeEventListener('error', this.handleError);\n ws.removeEventListener('close', this.handleClose);\n ws.close();\n } catch {}\n }\n\n public get readyState() {\n // Only return closed if the WebSocket is explicitly closed or exceeds max retries.\n if (this.isClosed) {\n return WebSocket.CLOSED;\n }\n\n const readyState = this.ws?.readyState;\n if (readyState === WebSocket.CLOSED) {\n return WebSocket.CONNECTING;\n }\n return readyState ?? WebSocket.CONNECTING;\n }\n\n //#endregion\n\n //#region WebSocket API proxy\n\n public readonly CONNECTING = 0;\n public readonly OPEN = 1;\n public readonly CLOSING = 2;\n public readonly CLOSED = 3;\n\n public get binaryType() {\n return this.ws?.binaryType ?? 'blob';\n }\n\n public get bufferedAmount() {\n return this.ws?.bufferedAmount ?? 0;\n }\n\n public get extensions() {\n return this.ws?.extensions ?? '';\n }\n\n public get protocol() {\n return this.ws?.protocol ?? '';\n }\n\n public ping(): void {\n return this.ws?.ping();\n }\n\n public dispatchEvent(event: Event) {\n return this.ws?.dispatchEvent(event) ?? false;\n }\n\n //#endregion\n\n //#regions Unsupported legacy properties\n\n public set onclose(value: ((e: WebSocketCloseEvent) => any) | null) {\n throw new Error('Unsupported legacy property, use addEventListener instead');\n }\n\n public set onerror(value: ((e: Event) => any) | null) {\n throw new Error('Unsupported legacy property, use addEventListener instead');\n }\n\n public set onmessage(value: ((e: WebSocketMessageEvent) => any) | null) {\n throw new Error('Unsupported legacy property, use addEventListener instead');\n }\n\n public set onopen(value: (() => any) | null) {\n throw new Error('Unsupported legacy property, use addEventListener instead');\n }\n\n //#endregion\n}\n"]}
1
+ {"version":3,"file":"WebSocketWithReconnect.js","sourceRoot":"","sources":["../../src/devtools/WebSocketWithReconnect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAA0B,MAAM,WAAW,CAAC;AAwCjE,MAAM,OAAO,sBAAsB;IAmBf;IAlBD,eAAe,CAAS;IACxB,UAAU,CAAS;IACnB,cAAc,CAAS;IACvB,OAAO,CAAyB;IAChC,WAAW,CAA2B;IAE/C,EAAE,GAAqB,IAAI,CAAC;IAC5B,OAAO,GAAG,CAAC,CAAC;IACZ,oBAAoB,GAAyC,IAAI,CAAC;IAClE,QAAQ,GAAG,KAAK,CAAC;IACjB,SAAS,GAA0D,EAAE,CAAC;IACtE,cAAc,GAAgE,IAAI,CAAC;IAE1E,OAAO,GAAG,IAAI,YAAY,EAAE,CAAC;IAC7B,kBAAkB,GAAwB,EAAE,CAAC;IAC7C,YAAY,CAAyB;IAEtD,YACkB,GAAW,EAC3B,OAAiB;QADD,QAAG,GAAH,GAAG,CAAQ;QAG3B,IAAI,CAAC,eAAe,GAAG,OAAO,EAAE,eAAe,IAAI,IAAI,CAAC;QACxD,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,GAAG,CAAC;QAC7C,IAAI,CAAC,cAAc,GAAG,OAAO,EAAE,cAAc,IAAI,IAAI,CAAC;QACtD,IAAI,CAAC,OAAO;YACV,OAAO,EAAE,OAAO;gBAChB,CAAC,CAAC,KAAK,EAAE,EAAE;oBACT,MAAM,KAAK,CAAC;gBACd,CAAC,CAAC,CAAC;QACL,IAAI,CAAC,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACtD,IAAI,CAAC,YAAY,GAAG,OAAO,EAAE,UAAU,CAAC;QAExC,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAEM,KAAK,CAAC,IAAa,EAAE,MAAe;QACzC,IAAI,CAAC,2BAA2B,EAAE,CAAC;QACnC,IAAI,CAAC,OAAO,CAAC,IAAI,CACf,OAAO,EACP,IAAI,CAAC,cAAc,IAAI;YACrB,IAAI,EAAE,IAAI,IAAI,IAAI;YAClB,MAAM,EAAE,MAAM,IAAI,kBAAkB;YACpC,OAAO,EAAE,kBAAkB;SAC5B,CACF,CAAC;QACF,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC;QAClC,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACpB,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE;YACnB,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;YACnB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;SAClB;IACH,CAAC;IAMM,gBAAgB,CAAC,KAAa,EAAE,QAA8B;QACnE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC1E,CAAC;IAEM,mBAAmB,CAAC,KAAa,EAAE,QAA8B;QACtE,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAC7C,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,KAAK,QAAQ,CACrD,CAAC;QACF,IAAI,KAAK,IAAI,CAAC,EAAE;YACd,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;YACxC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;SAC1C;IACH,CAAC;IAED,mBAAmB;IAEX,OAAO;QACb,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE;YACnB,OAAO;SACR;QACD,IAAI,CAAC,oBAAoB,GAAG,UAAU,CAAC,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAEvF,IAAI,CAAC,EAAE,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC7C,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,EAAE;YAC7B,IAAI,CAAC,EAAE,CAAC,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC;SACxC;QACD,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QACxD,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAClD,+FAA+F;QAC/F,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACpD,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACtD,CAAC;IAEM,IAAI,CAAC,IAAuD;QACjE,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC,CAAC;YACpE,OAAO;SACR;QAED,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,UAAU,EAAE;YACnC,IAAI,CAAC,OAAO,CACV,IAAI,KAAK,CAAC,uDAAuD,IAAI,CAAC,OAAO,GAAG,CAAC,CAClF,CAAC;YACF,OAAO;SACR;QAED,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QACnB,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE;YAClD,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SACf;aAAM;YACL,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC3B;IACH,CAAC;IAEO,UAAU,GAAG,GAAG,EAAE;QACxB,IAAI,CAAC,2BAA2B,EAAE,CAAC;QACnC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE1B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QACjC,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACpB,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE;YAC5B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SACjB;IACH,CAAC,CAAC;IAEM,aAAa,GAAG,CAAC,KAA4B,EAAE,EAAE;QACvD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC,CAAC;IAEM,WAAW,GAAG,CAAC,KAA0B,EAAE,EAAE;QACnD,IAAI,CAAC,2BAA2B,EAAE,CAAC;QACnC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAClC,IAAI,CAAC,iBAAiB,CAAC,qBAAqB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/D,CAAC,CAAC;IAEM,WAAW,GAAG,CAAC,KAA0B,EAAE,EAAE;QACnD,IAAI,CAAC,2BAA2B,EAAE,CAAC;QACnC,IAAI,CAAC,cAAc,GAAG;YACpB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC;QACF,IAAI,CAAC,iBAAiB,CAAC,2BAA2B,KAAK,CAAC,IAAI,YAAY,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3F,CAAC,CAAC;IAEM,oBAAoB,GAAG,GAAG,EAAE;QAClC,IAAI,CAAC,iBAAiB,CAAC,0CAA0C,CAAC,CAAC;IACrE,CAAC,CAAC;IAEM,2BAA2B;QACjC,IAAI,IAAI,CAAC,oBAAoB,IAAI,IAAI,EAAE;YACrC,YAAY,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACxC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;SAClC;IACH,CAAC;IAEO,iBAAiB,CAAC,MAAc;QACtC,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE;YACnB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACtB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;SAChB;QACD,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,OAAO;SACR;QAED,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,UAAU,EAAE;YACnC,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC;YAChD,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,OAAO;SACR;QAED,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;YAClB,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC3B,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;IAC3B,CAAC;IAEO,OAAO,CAAC,EAAa;QAC3B,IAAI;YACF,EAAE,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;YACtD,EAAE,CAAC,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAChD,gGAAgG;YAChG,EAAE,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YAClD,EAAE,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YAClD,EAAE,CAAC,KAAK,EAAE,CAAC;SACZ;QAAC,MAAM,GAAE;IACZ,CAAC;IAED,IAAW,UAAU;QACnB,mFAAmF;QACnF,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,OAAO,SAAS,CAAC,MAAM,CAAC;SACzB;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE,EAAE,UAAU,CAAC;QACvC,IAAI,UAAU,KAAK,SAAS,CAAC,MAAM,EAAE;YACnC,OAAO,SAAS,CAAC,UAAU,CAAC;SAC7B;QACD,OAAO,UAAU,IAAI,SAAS,CAAC,UAAU,CAAC;IAC5C,CAAC;IAED,YAAY;IAEZ,6BAA6B;IAEb,UAAU,GAAG,CAAC,CAAC;IACf,IAAI,GAAG,CAAC,CAAC;IACT,OAAO,GAAG,CAAC,CAAC;IACZ,MAAM,GAAG,CAAC,CAAC;IAE3B,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,EAAE,EAAE,UAAU,IAAI,MAAM,CAAC;IACvC,CAAC;IAED,IAAW,cAAc;QACvB,OAAO,IAAI,CAAC,EAAE,EAAE,cAAc,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,EAAE,EAAE,UAAU,IAAI,EAAE,CAAC;IACnC,CAAC;IAED,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,EAAE,EAAE,QAAQ,IAAI,EAAE,CAAC;IACjC,CAAC;IAEM,IAAI;QACT,OAAO,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;IAEM,aAAa,CAAC,KAAY;QAC/B,OAAO,IAAI,CAAC,EAAE,EAAE,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;IAChD,CAAC;IAED,YAAY;IAEZ,wCAAwC;IAExC,IAAW,OAAO,CAAC,KAA+C;QAChE,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC/E,CAAC;IAED,IAAW,OAAO,CAAC,KAAiC;QAClD,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC/E,CAAC;IAED,IAAW,SAAS,CAAC,KAAiD;QACpE,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC/E,CAAC;IAED,IAAW,MAAM,CAAC,KAAyB;QACzC,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC/E,CAAC;CAGF","sourcesContent":["import { EventEmitter, type EventSubscription } from 'fbemitter';\n\nimport type { DevToolsPluginClientOptions } from './devtools.types';\n\nexport interface Options {\n /**\n * Reconnect interval in milliseconds.\n * @default 1500\n */\n retriesInterval?: number;\n\n /**\n * The maximum number of retries.\n * @default 200\n */\n maxRetries?: number;\n\n /**\n * The timeout in milliseconds for the WebSocket connecting.\n */\n connectTimeout?: number;\n\n /**\n * The error handler.\n * @default throwing an error\n */\n onError?: (error: Error) => void;\n\n /**\n * The callback to be called when the WebSocket is reconnected.\n * @default no-op\n */\n onReconnect?: (reason: string) => void;\n\n /**\n * The [`binaryType`](https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/binaryType).\n */\n binaryType?: DevToolsPluginClientOptions['websocketBinaryType'];\n}\n\nexport class WebSocketWithReconnect implements WebSocket {\n private readonly retriesInterval: number;\n private readonly maxRetries: number;\n private readonly connectTimeout: number;\n private readonly onError: (error: Error) => void;\n private readonly onReconnect: (reason: string) => void;\n\n private ws: WebSocket | null = null;\n private retries = 0;\n private connectTimeoutHandle: ReturnType<typeof setTimeout> | null = null;\n private isClosed = false;\n private sendQueue: (string | ArrayBufferView | Blob | ArrayBufferLike)[] = [];\n private lastCloseEvent: { code?: number; reason?: string; message?: string } | null = null;\n\n private readonly emitter = new EventEmitter();\n private readonly eventSubscriptions: EventSubscription[] = [];\n private readonly wsBinaryType?: Options['binaryType'];\n\n constructor(\n public readonly url: string,\n options?: Options\n ) {\n this.retriesInterval = options?.retriesInterval ?? 1500;\n this.maxRetries = options?.maxRetries ?? 200;\n this.connectTimeout = options?.connectTimeout ?? 5000;\n this.onError =\n options?.onError ??\n ((error) => {\n throw error;\n });\n this.onReconnect = options?.onReconnect ?? (() => {});\n this.wsBinaryType = options?.binaryType;\n\n this.connect();\n }\n\n public close(code?: number, reason?: string) {\n this.clearConnectTimeoutIfNeeded();\n this.emitter.emit(\n 'close',\n this.lastCloseEvent ?? {\n code: code ?? 1000,\n reason: reason ?? 'Explicit closing',\n message: 'Explicit closing',\n }\n );\n this.lastCloseEvent = null;\n this.isClosed = true;\n this.emitter.removeAllListeners();\n this.sendQueue = [];\n if (this.ws != null) {\n const ws = this.ws;\n this.ws = null;\n this.wsClose(ws);\n }\n }\n\n public addEventListener(event: 'message', listener: (event: WebSocketMessageEvent) => void): void;\n public addEventListener(event: 'open', listener: () => void): void;\n public addEventListener(event: 'error', listener: (event: WebSocketErrorEvent) => void): void;\n public addEventListener(event: 'close', listener: (event: WebSocketCloseEvent) => void): void;\n public addEventListener(event: string, listener: (event: any) => void) {\n this.eventSubscriptions.push(this.emitter.addListener(event, listener));\n }\n\n public removeEventListener(event: string, listener: (event: any) => void) {\n const index = this.eventSubscriptions.findIndex(\n (subscription) => subscription.listener === listener\n );\n if (index >= 0) {\n this.eventSubscriptions[index].remove();\n this.eventSubscriptions.splice(index, 1);\n }\n }\n\n //#region Internals\n\n private connect() {\n if (this.ws != null) {\n return;\n }\n this.connectTimeoutHandle = setTimeout(this.handleConnectTimeout, this.connectTimeout);\n\n this.ws = new WebSocket(this.url.toString());\n if (this.wsBinaryType != null) {\n this.ws.binaryType = this.wsBinaryType;\n }\n this.ws.addEventListener('message', this.handleMessage);\n this.ws.addEventListener('open', this.handleOpen);\n // @ts-ignore TypeScript expects (e: Event) => any, but we want (e: WebSocketErrorEvent) => any\n this.ws.addEventListener('error', this.handleError);\n this.ws.addEventListener('close', this.handleClose);\n }\n\n public send(data: string | ArrayBufferView | Blob | ArrayBufferLike): void {\n if (this.isClosed) {\n this.onError(new Error('Unable to send data: WebSocket is closed'));\n return;\n }\n\n if (this.retries >= this.maxRetries) {\n this.onError(\n new Error(`Unable to send data: Exceeded max retries - retries[${this.retries}]`)\n );\n return;\n }\n\n const ws = this.ws;\n if (ws != null && ws.readyState === WebSocket.OPEN) {\n ws.send(data);\n } else {\n this.sendQueue.push(data);\n }\n }\n\n private handleOpen = () => {\n this.clearConnectTimeoutIfNeeded();\n this.lastCloseEvent = null;\n this.emitter.emit('open');\n\n const sendQueue = this.sendQueue;\n this.sendQueue = [];\n for (const data of sendQueue) {\n this.send(data);\n }\n };\n\n private handleMessage = (event: WebSocketMessageEvent) => {\n this.emitter.emit('message', event);\n };\n\n private handleError = (event: WebSocketErrorEvent) => {\n this.clearConnectTimeoutIfNeeded();\n this.emitter.emit('error', event);\n this.reconnectIfNeeded(`WebSocket error - ${event.message}`);\n };\n\n private handleClose = (event: WebSocketCloseEvent) => {\n this.clearConnectTimeoutIfNeeded();\n this.lastCloseEvent = {\n code: event.code,\n reason: event.reason,\n message: event.message,\n };\n this.reconnectIfNeeded(`WebSocket closed - code[${event.code}] reason[${event.reason}]`);\n };\n\n private handleConnectTimeout = () => {\n this.reconnectIfNeeded('Timeout from connecting to the WebSocket');\n };\n\n private clearConnectTimeoutIfNeeded() {\n if (this.connectTimeoutHandle != null) {\n clearTimeout(this.connectTimeoutHandle);\n this.connectTimeoutHandle = null;\n }\n }\n\n private reconnectIfNeeded(reason: string) {\n if (this.ws != null) {\n this.wsClose(this.ws);\n this.ws = null;\n }\n if (this.isClosed) {\n return;\n }\n\n if (this.retries >= this.maxRetries) {\n this.onError(new Error('Exceeded max retries'));\n this.close();\n return;\n }\n\n setTimeout(() => {\n this.retries += 1;\n this.connect();\n this.onReconnect(reason);\n }, this.retriesInterval);\n }\n\n private wsClose(ws: WebSocket) {\n try {\n ws.removeEventListener('message', this.handleMessage);\n ws.removeEventListener('open', this.handleOpen);\n // @ts-ignore: TypeScript expects (e: Event) => any, but we want (e: WebSocketErrorEvent) => any\n ws.removeEventListener('error', this.handleError);\n ws.removeEventListener('close', this.handleClose);\n ws.close();\n } catch {}\n }\n\n public get readyState() {\n // Only return closed if the WebSocket is explicitly closed or exceeds max retries.\n if (this.isClosed) {\n return WebSocket.CLOSED;\n }\n\n const readyState = this.ws?.readyState;\n if (readyState === WebSocket.CLOSED) {\n return WebSocket.CONNECTING;\n }\n return readyState ?? WebSocket.CONNECTING;\n }\n\n //#endregion\n\n //#region WebSocket API proxy\n\n public readonly CONNECTING = 0;\n public readonly OPEN = 1;\n public readonly CLOSING = 2;\n public readonly CLOSED = 3;\n\n public get binaryType() {\n return this.ws?.binaryType ?? 'blob';\n }\n\n public get bufferedAmount() {\n return this.ws?.bufferedAmount ?? 0;\n }\n\n public get extensions() {\n return this.ws?.extensions ?? '';\n }\n\n public get protocol() {\n return this.ws?.protocol ?? '';\n }\n\n public ping(): void {\n return this.ws?.ping();\n }\n\n public dispatchEvent(event: Event) {\n return this.ws?.dispatchEvent(event) ?? false;\n }\n\n //#endregion\n\n //#regions Unsupported legacy properties\n\n public set onclose(value: ((e: WebSocketCloseEvent) => any) | null) {\n throw new Error('Unsupported legacy property, use addEventListener instead');\n }\n\n public set onerror(value: ((e: Event) => any) | null) {\n throw new Error('Unsupported legacy property, use addEventListener instead');\n }\n\n public set onmessage(value: ((e: WebSocketMessageEvent) => any) | null) {\n throw new Error('Unsupported legacy property, use addEventListener instead');\n }\n\n public set onopen(value: (() => any) | null) {\n throw new Error('Unsupported legacy property, use addEventListener instead');\n }\n\n //#endregion\n}\n"]}
@@ -24,4 +24,13 @@ export interface HandshakeMessageParams {
24
24
  browserClientId: string;
25
25
  pluginName: string;
26
26
  }
27
+ /**
28
+ * Options for the devtools plugin client.
29
+ */
30
+ export interface DevToolsPluginClientOptions {
31
+ /**
32
+ * The underlying WebSocket [`binaryType`](https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/binaryType).
33
+ */
34
+ websocketBinaryType?: 'arraybuffer' | 'blob';
35
+ }
27
36
  //# sourceMappingURL=devtools.types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"devtools.types.d.ts","sourceRoot":"","sources":["../../src/devtools/devtools.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAErE;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,wDAAwD;IACxD,MAAM,EACF,KAAK,GACL,SAAS,CAAC;IAEd,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAC;IAElB,uBAAuB;IACvB,UAAU,EAAE,MAAM,CAAC;IAEnB;;;;OAIG;IACH,OAAO,CAAC,EAAE,qBAAqB,CAAC;CACjC;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB"}
1
+ {"version":3,"file":"devtools.types.d.ts","sourceRoot":"","sources":["../../src/devtools/devtools.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAErE;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,wDAAwD;IACxD,MAAM,EACF,KAAK,GACL,SAAS,CAAC;IAEd,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAC;IAElB,uBAAuB;IACvB,UAAU,EAAE,MAAM,CAAC;IAEnB;;;;OAIG;IACH,OAAO,CAAC,EAAE,qBAAqB,CAAC;CACjC;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C;;OAEG;IACH,mBAAmB,CAAC,EAAE,aAAa,GAAG,MAAM,CAAC;CAC9C"}
@@ -1 +1 @@
1
- {"version":3,"file":"devtools.types.js","sourceRoot":"","sources":["../../src/devtools/devtools.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { WebSocketBackingStore } from './WebSocketBackingStore';\n\n/**\n * The connection info for devtools plugins client.\n */\nexport interface ConnectionInfo {\n /** Indicates the sender towards the devtools plugin. */\n sender:\n | 'app' // client running in the app environment.\n | 'browser'; // client running in the browser environment.\n\n /** Dev server address. */\n devServer: string;\n\n /** The plugin name. */\n pluginName: string;\n\n /**\n * The backing store for the WebSocket connection. Exposed for testing.\n * If not provided, the default singleton instance will be used.\n * @hidden\n */\n wsStore?: WebSocketBackingStore;\n}\n\n/**\n * Parameters for the `handshake` message.\n * @hidden\n */\nexport interface HandshakeMessageParams {\n browserClientId: string;\n pluginName: string;\n}\n"]}
1
+ {"version":3,"file":"devtools.types.js","sourceRoot":"","sources":["../../src/devtools/devtools.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { WebSocketBackingStore } from './WebSocketBackingStore';\n\n/**\n * The connection info for devtools plugins client.\n */\nexport interface ConnectionInfo {\n /** Indicates the sender towards the devtools plugin. */\n sender:\n | 'app' // client running in the app environment.\n | 'browser'; // client running in the browser environment.\n\n /** Dev server address. */\n devServer: string;\n\n /** The plugin name. */\n pluginName: string;\n\n /**\n * The backing store for the WebSocket connection. Exposed for testing.\n * If not provided, the default singleton instance will be used.\n * @hidden\n */\n wsStore?: WebSocketBackingStore;\n}\n\n/**\n * Parameters for the `handshake` message.\n * @hidden\n */\nexport interface HandshakeMessageParams {\n browserClientId: string;\n pluginName: string;\n}\n\n/**\n * Options for the devtools plugin client.\n */\nexport interface DevToolsPluginClientOptions {\n /**\n * The underlying WebSocket [`binaryType`](https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/binaryType).\n */\n websocketBinaryType?: 'arraybuffer' | 'blob';\n}\n"]}
@@ -1,10 +1,12 @@
1
1
  import { DevToolsPluginClient } from './DevToolsPluginClient';
2
2
  import { getDevToolsPluginClientAsync } from './DevToolsPluginClientFactory';
3
+ import type { DevToolsPluginClientOptions } from './devtools.types';
3
4
  export { getDevToolsPluginClientAsync, DevToolsPluginClient };
5
+ export type { DevToolsPluginClientOptions };
4
6
  export type { EventSubscription } from 'fbemitter';
5
7
  export { setEnableLogging } from './logger';
6
8
  /**
7
9
  * A React hook to get the DevToolsPluginClient instance.
8
10
  */
9
- export declare function useDevToolsPluginClient(pluginName: string): DevToolsPluginClient | null;
11
+ export declare function useDevToolsPluginClient(pluginName: string, options?: DevToolsPluginClientOptions): DevToolsPluginClient | null;
10
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/devtools/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAC;AAE7E,OAAO,EAAE,4BAA4B,EAAE,oBAAoB,EAAE,CAAC;AAE9D,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAkCvF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/devtools/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAC;AAC7E,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAEpE,OAAO,EAAE,4BAA4B,EAAE,oBAAoB,EAAE,CAAC;AAC9D,YAAY,EAAE,2BAA2B,EAAE,CAAC;AAE5C,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,2BAA2B,GACpC,oBAAoB,GAAG,IAAI,CAkC7B"}
@@ -6,13 +6,13 @@ export { setEnableLogging } from './logger';
6
6
  /**
7
7
  * A React hook to get the DevToolsPluginClient instance.
8
8
  */
9
- export function useDevToolsPluginClient(pluginName) {
9
+ export function useDevToolsPluginClient(pluginName, options) {
10
10
  const [client, setClient] = useState(null);
11
11
  const [error, setError] = useState(null);
12
12
  useEffect(() => {
13
13
  async function setup() {
14
14
  try {
15
- const client = await getDevToolsPluginClientAsync(pluginName);
15
+ const client = await getDevToolsPluginClientAsync(pluginName, options);
16
16
  setClient(client);
17
17
  }
18
18
  catch (e) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/devtools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAC;AAE7E,OAAO,EAAE,4BAA4B,EAAE,oBAAoB,EAAE,CAAC;AAG9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,UAAkB;IACxD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAA8B,IAAI,CAAC,CAAC;IACxE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAC;IAEvD,SAAS,CAAC,GAAG,EAAE;QACb,KAAK,UAAU,KAAK;YAClB,IAAI;gBACF,MAAM,MAAM,GAAG,MAAM,4BAA4B,CAAC,UAAU,CAAC,CAAC;gBAC9D,SAAS,CAAC,MAAM,CAAC,CAAC;aACnB;YAAC,OAAO,CAAC,EAAE;gBACV,QAAQ,CAAC,IAAI,KAAK,CAAC,uDAAuD,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;aAC7F;QACH,CAAC;QAED,KAAK,UAAU,QAAQ;YACrB,IAAI;gBACF,MAAM,MAAM,EAAE,UAAU,EAAE,CAAC;aAC5B;YAAC,OAAO,CAAC,EAAE;gBACV,QAAQ,CACN,IAAI,KAAK,CAAC,0DAA0D,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CACrF,CAAC;aACH;QACH,CAAC;QAED,KAAK,EAAE,CAAC;QACR,OAAO,GAAG,EAAE;YACV,QAAQ,EAAE,CAAC;QACb,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,IAAI,KAAK,IAAI,IAAI,EAAE;QACjB,MAAM,KAAK,CAAC;KACb;IACD,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import { useState, useEffect } from 'react';\n\nimport { DevToolsPluginClient } from './DevToolsPluginClient';\nimport { getDevToolsPluginClientAsync } from './DevToolsPluginClientFactory';\n\nexport { getDevToolsPluginClientAsync, DevToolsPluginClient };\n// Export the EventSubscription type if people need to use explicit type from `addMessageListener`\nexport type { EventSubscription } from 'fbemitter';\nexport { setEnableLogging } from './logger';\n\n/**\n * A React hook to get the DevToolsPluginClient instance.\n */\nexport function useDevToolsPluginClient(pluginName: string): DevToolsPluginClient | null {\n const [client, setClient] = useState<DevToolsPluginClient | null>(null);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n async function setup() {\n try {\n const client = await getDevToolsPluginClientAsync(pluginName);\n setClient(client);\n } catch (e) {\n setError(new Error('Failed to setup client from useDevToolsPluginClient: ' + e.toString()));\n }\n }\n\n async function teardown() {\n try {\n await client?.closeAsync();\n } catch (e) {\n setError(\n new Error('Failed to teardown client from useDevToolsPluginClient: ' + e.toString())\n );\n }\n }\n\n setup();\n return () => {\n teardown();\n };\n }, [pluginName]);\n\n if (error != null) {\n throw error;\n }\n return client;\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/devtools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAC;AAG7E,OAAO,EAAE,4BAA4B,EAAE,oBAAoB,EAAE,CAAC;AAI9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C;;GAEG;AACH,MAAM,UAAU,uBAAuB,CACrC,UAAkB,EAClB,OAAqC;IAErC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAA8B,IAAI,CAAC,CAAC;IACxE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAC;IAEvD,SAAS,CAAC,GAAG,EAAE;QACb,KAAK,UAAU,KAAK;YAClB,IAAI;gBACF,MAAM,MAAM,GAAG,MAAM,4BAA4B,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBACvE,SAAS,CAAC,MAAM,CAAC,CAAC;aACnB;YAAC,OAAO,CAAC,EAAE;gBACV,QAAQ,CAAC,IAAI,KAAK,CAAC,uDAAuD,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;aAC7F;QACH,CAAC;QAED,KAAK,UAAU,QAAQ;YACrB,IAAI;gBACF,MAAM,MAAM,EAAE,UAAU,EAAE,CAAC;aAC5B;YAAC,OAAO,CAAC,EAAE;gBACV,QAAQ,CACN,IAAI,KAAK,CAAC,0DAA0D,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CACrF,CAAC;aACH;QACH,CAAC;QAED,KAAK,EAAE,CAAC;QACR,OAAO,GAAG,EAAE;YACV,QAAQ,EAAE,CAAC;QACb,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,IAAI,KAAK,IAAI,IAAI,EAAE;QACjB,MAAM,KAAK,CAAC;KACb;IACD,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import { useState, useEffect } from 'react';\n\nimport { DevToolsPluginClient } from './DevToolsPluginClient';\nimport { getDevToolsPluginClientAsync } from './DevToolsPluginClientFactory';\nimport type { DevToolsPluginClientOptions } from './devtools.types';\n\nexport { getDevToolsPluginClientAsync, DevToolsPluginClient };\nexport type { DevToolsPluginClientOptions };\n// Export the EventSubscription type if people need to use explicit type from `addMessageListener`\nexport type { EventSubscription } from 'fbemitter';\nexport { setEnableLogging } from './logger';\n\n/**\n * A React hook to get the DevToolsPluginClient instance.\n */\nexport function useDevToolsPluginClient(\n pluginName: string,\n options?: DevToolsPluginClientOptions\n): DevToolsPluginClient | null {\n const [client, setClient] = useState<DevToolsPluginClient | null>(null);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n async function setup() {\n try {\n const client = await getDevToolsPluginClientAsync(pluginName, options);\n setClient(client);\n } catch (e) {\n setError(new Error('Failed to setup client from useDevToolsPluginClient: ' + e.toString()));\n }\n }\n\n async function teardown() {\n try {\n await client?.closeAsync();\n } catch (e) {\n setError(\n new Error('Failed to teardown client from useDevToolsPluginClient: ' + e.toString())\n );\n }\n }\n\n setup();\n return () => {\n teardown();\n };\n }, [pluginName]);\n\n if (error != null) {\n throw error;\n }\n return client;\n}\n"]}
@@ -56,13 +56,13 @@
56
56
  "expo-mail-composer": "~13.0.1",
57
57
  "expo-media-library": "~16.0.4",
58
58
  "expo-module-template": "~10.14.11",
59
- "expo-modules-core": "~1.12.19",
59
+ "expo-modules-core": "~1.12.20",
60
60
  "expo-navigation-bar": "~3.0.7",
61
61
  "expo-network": "~6.0.1",
62
- "expo-notifications": "~0.28.11",
62
+ "expo-notifications": "~0.28.13",
63
63
  "expo-print": "~13.0.1",
64
64
  "expo-random": "~14.0.1",
65
- "expo-router": "~3.5.18",
65
+ "expo-router": "~3.5.19",
66
66
  "expo-screen-capture": "~6.0.1",
67
67
  "expo-screen-orientation": "~7.0.5",
68
68
  "expo-secure-store": "~13.0.2",
@@ -71,7 +71,7 @@
71
71
  "expo-sms": "~12.0.1",
72
72
  "expo-speech": "~12.0.2",
73
73
  "expo-splash-screen": "~0.27.5",
74
- "expo-sqlite": "~14.0.4",
74
+ "expo-sqlite": "~14.0.5",
75
75
  "expo-status-bar": "~1.12.1",
76
76
  "expo-store-review": "~7.0.2",
77
77
  "expo-symbols": "~0.1.4",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "expo",
3
- "version": "51.0.22",
3
+ "version": "51.0.23",
4
4
  "description": "The Expo SDK",
5
5
  "main": "build/Expo.js",
6
6
  "module": "build/Expo.js",
@@ -60,10 +60,10 @@
60
60
  "homepage": "https://github.com/expo/expo/tree/main/packages/expo",
61
61
  "dependencies": {
62
62
  "@babel/runtime": "^7.20.0",
63
- "@expo/cli": "0.18.25",
63
+ "@expo/cli": "0.18.26",
64
64
  "@expo/config": "9.0.3",
65
65
  "@expo/config-plugins": "8.0.8",
66
- "@expo/metro-config": "0.18.9",
66
+ "@expo/metro-config": "0.18.10",
67
67
  "@expo/vector-icons": "^14.0.0",
68
68
  "babel-preset-expo": "~11.0.12",
69
69
  "expo-asset": "~10.0.10",
@@ -71,7 +71,7 @@
71
71
  "expo-font": "~12.0.9",
72
72
  "expo-keep-awake": "~13.0.2",
73
73
  "expo-modules-autolinking": "1.11.1",
74
- "expo-modules-core": "1.12.19",
74
+ "expo-modules-core": "1.12.20",
75
75
  "fbemitter": "^3.0.0",
76
76
  "whatwg-url-without-unicode": "8.0.0-3"
77
77
  },
@@ -83,5 +83,5 @@
83
83
  "react-dom": "18.2.0",
84
84
  "react-native": "0.74.3"
85
85
  },
86
- "gitHead": "7254cc3de7d97ccaf7e9c0864188cb233ba919e5"
86
+ "gitHead": "89cb316cd1f16193ae9841d2aec2ae39e0ee00bb"
87
87
  }