expo 54.0.0-canary-20250729-d8899ae → 54.0.0-preview.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/android/build.gradle +2 -2
  2. package/android/src/main/java/expo/modules/ExpoReactHostFactory.kt +1 -7
  3. package/android/src/main/java/expo/modules/ReactActivityDelegateWrapper.kt +8 -8
  4. package/android/src/main/java/expo/modules/ReactNativeHostWrapper.kt +0 -5
  5. package/android/src/test/resources/robolectric.properties +1 -0
  6. package/build/Expo.d.ts +9 -1
  7. package/build/Expo.d.ts.map +1 -1
  8. package/build/async-require/fetchAsync.native.d.ts.map +1 -1
  9. package/build/winter/fetch/FetchResponse.d.ts +2 -2
  10. package/build/winter/fetch/FetchResponse.d.ts.map +1 -1
  11. package/build/winter/fetch/NativeRequest.d.ts +1 -1
  12. package/build/winter/fetch/NativeRequest.d.ts.map +1 -1
  13. package/build/winter/installGlobal.d.ts +25 -0
  14. package/build/winter/installGlobal.d.ts.map +1 -0
  15. package/bundledNativeModules.json +94 -93
  16. package/devtools.d.ts +1 -1
  17. package/devtools.js +1 -1
  18. package/internal/babel-preset.d.ts +2 -0
  19. package/internal/babel-preset.js +2 -0
  20. package/internal/unstable-autolinking-exports.d.ts +2 -0
  21. package/internal/unstable-autolinking-exports.js +2 -0
  22. package/internal/unstable-expo-updates-cli-exports.d.ts +2 -0
  23. package/internal/unstable-expo-updates-cli-exports.js +2 -0
  24. package/ios/AppDelegates/ExpoReactNativeFactory.swift +14 -1
  25. package/ios/AppDelegates/ExpoReactNativeFactoryDelegate.swift +1 -1
  26. package/ios/AppDelegates/RCTAppDelegateUmbrella.h +5 -0
  27. package/package.json +28 -27
  28. package/src/Expo.ts +4 -0
  29. package/src/async-require/fetchAsync.native.ts +48 -10
  30. package/src/async-require/messageSocket.native.ts +0 -3
  31. package/src/winter/fetch/FetchResponse.ts +4 -4
  32. package/src/winter/fetch/NativeRequest.ts +1 -1
  33. package/src/winter/fetch/__tests__/RequestUtils-test.ts +7 -7
  34. package/src/winter/installGlobal.ts +109 -0
  35. package/src/winter/runtime.native.ts +1 -20
  36. package/template.tgz +0 -0
  37. package/build/devtools/DevToolsPluginClient.d.ts +0 -72
  38. package/build/devtools/DevToolsPluginClient.d.ts.map +0 -1
  39. package/build/devtools/DevToolsPluginClientFactory.d.ts +0 -16
  40. package/build/devtools/DevToolsPluginClientFactory.d.ts.map +0 -1
  41. package/build/devtools/DevToolsPluginClientImplApp.d.ts +0 -15
  42. package/build/devtools/DevToolsPluginClientImplApp.d.ts.map +0 -1
  43. package/build/devtools/DevToolsPluginClientImplBrowser.d.ts +0 -14
  44. package/build/devtools/DevToolsPluginClientImplBrowser.d.ts.map +0 -1
  45. package/build/devtools/MessageFramePacker.d.ts +0 -50
  46. package/build/devtools/MessageFramePacker.d.ts.map +0 -1
  47. package/build/devtools/ProtocolVersion.d.ts +0 -7
  48. package/build/devtools/ProtocolVersion.d.ts.map +0 -1
  49. package/build/devtools/WebSocketBackingStore.d.ts +0 -10
  50. package/build/devtools/WebSocketBackingStore.d.ts.map +0 -1
  51. package/build/devtools/WebSocketWithReconnect.d.ts +0 -81
  52. package/build/devtools/WebSocketWithReconnect.d.ts.map +0 -1
  53. package/build/devtools/devtools.types.d.ts +0 -42
  54. package/build/devtools/devtools.types.d.ts.map +0 -1
  55. package/build/devtools/getConnectionInfo.d.ts +0 -6
  56. package/build/devtools/getConnectionInfo.d.ts.map +0 -1
  57. package/build/devtools/getConnectionInfo.native.d.ts +0 -6
  58. package/build/devtools/getConnectionInfo.native.d.ts.map +0 -1
  59. package/build/devtools/index.d.ts +0 -12
  60. package/build/devtools/index.d.ts.map +0 -1
  61. package/build/devtools/logger.d.ts +0 -6
  62. package/build/devtools/logger.d.ts.map +0 -1
  63. package/src/devtools/DevToolsPluginClient.ts +0 -240
  64. package/src/devtools/DevToolsPluginClientFactory.ts +0 -73
  65. package/src/devtools/DevToolsPluginClientImplApp.ts +0 -56
  66. package/src/devtools/DevToolsPluginClientImplBrowser.ts +0 -38
  67. package/src/devtools/MessageFramePacker.ts +0 -235
  68. package/src/devtools/ProtocolVersion.ts +0 -6
  69. package/src/devtools/WebSocketBackingStore.ts +0 -10
  70. package/src/devtools/WebSocketWithReconnect.ts +0 -318
  71. package/src/devtools/__tests__/DevToolsPluginClient-test.ts +0 -285
  72. package/src/devtools/__tests__/DevToolsPluginClientFactory-test.ts +0 -120
  73. package/src/devtools/__tests__/MessageFramePack-test.node.ts +0 -157
  74. package/src/devtools/__tests__/MockWebSocket.ts +0 -100
  75. package/src/devtools/__tests__/WebSocketWithReconnect-test.node.ts +0 -184
  76. package/src/devtools/__tests__/logger-test.ts +0 -20
  77. package/src/devtools/devtools.types.ts +0 -50
  78. package/src/devtools/getConnectionInfo.native.ts +0 -18
  79. package/src/devtools/getConnectionInfo.ts +0 -16
  80. package/src/devtools/index.ts +0 -53
  81. package/src/devtools/logger.ts +0 -29
@@ -1,184 +0,0 @@
1
- import { WebSocket, WebSocketServer } from 'ws';
2
-
3
- import { WebSocketWithReconnect } from '../WebSocketWithReconnect';
4
-
5
- // @ts-expect-error - The WebSocket from ws is not compatible with the globalThis.WebSocket
6
- globalThis.WebSocket = WebSocket;
7
-
8
- describe(WebSocketWithReconnect, () => {
9
- let ws: WebSocketWithReconnect | null = null;
10
- let server: WebSocketServer | null = null;
11
-
12
- afterEach(async () => {
13
- ws?.close();
14
- await closeServerAsync(server);
15
- });
16
-
17
- it('should act as a WebSocket', async () => {
18
- server = new WebSocketServer({ port: 8000 });
19
- // An echoing server
20
- server?.addListener('connection', (socket) => {
21
- socket.addEventListener('message', (e) => {
22
- socket.send(e.data);
23
- });
24
- });
25
-
26
- ws = new WebSocketWithReconnect('ws://localhost:8000');
27
- let received = '';
28
- ws.addEventListener('message', (e) => {
29
- received = e.data;
30
- });
31
- await new Promise((resolve) => {
32
- ws?.addEventListener('open', () => {
33
- resolve(null);
34
- });
35
- });
36
- expect(ws.readyState).toBe(WebSocket.OPEN);
37
-
38
- ws.send('hello');
39
- await delayAsync(50);
40
- expect(received).toBe('hello');
41
- });
42
-
43
- it('should reconnect when the connection is lost', async () => {
44
- server = new WebSocketServer({ port: 8000 });
45
-
46
- const mockOnReconnect = jest.fn();
47
- ws = new WebSocketWithReconnect('ws://localhost:8000', {
48
- retriesInterval: 10,
49
- onReconnect: mockOnReconnect,
50
- });
51
- await new Promise((resolve) => {
52
- ws?.addEventListener('open', () => {
53
- resolve(null);
54
- });
55
- });
56
- expect(ws.readyState).toBe(WebSocket.OPEN);
57
-
58
- await closeServerAsync(server);
59
- server = new WebSocketServer({ port: 8000 });
60
- await delayAsync(100);
61
-
62
- expect(ws.readyState).toBe(WebSocket.OPEN);
63
- expect(mockOnReconnect).toHaveBeenCalled();
64
- });
65
-
66
- it('should keep sending messages when retrying connection', async () => {
67
- server = new WebSocketServer({ port: 8000 });
68
- ws = new WebSocketWithReconnect('ws://localhost:8000', {
69
- retriesInterval: 10,
70
- });
71
- await new Promise((resolve) => {
72
- ws?.addEventListener('open', () => {
73
- resolve(null);
74
- });
75
- });
76
- expect(ws.readyState).toBe(WebSocket.OPEN);
77
-
78
- await closeServerAsync(server);
79
-
80
- expect(ws.readyState).not.toBe(WebSocket.OPEN);
81
- ws.send('hello');
82
-
83
- server = new WebSocketServer({ port: 8000 });
84
- const receivedPromise = new Promise((resolve) => {
85
- server?.addListener('connection', (socket) => {
86
- socket.addEventListener('message', (e) => {
87
- resolve(e.data);
88
- });
89
- });
90
- });
91
-
92
- await delayAsync(30);
93
- expect(ws.readyState).toBe(WebSocket.OPEN);
94
- const received = await receivedPromise;
95
- expect(received).toBe('hello');
96
- });
97
-
98
- it('should throw errors if exceeds max retries', async () => {
99
- server = new WebSocketServer({ port: 8000 });
100
-
101
- const mockOnError = jest.fn();
102
- ws = new WebSocketWithReconnect('ws://localhost:8000', {
103
- retriesInterval: 10,
104
- maxRetries: 2,
105
- onError: mockOnError,
106
- });
107
- await closeServerAsync(server);
108
- await delayAsync(100);
109
- expect(mockOnError).toHaveBeenCalled();
110
- });
111
-
112
- it('should show connecting state when reconnecting', async () => {
113
- server = new WebSocketServer({ port: 8000 });
114
-
115
- ws = new WebSocketWithReconnect('ws://localhost:8000', {
116
- retriesInterval: 1000,
117
- });
118
- await closeServerAsync(server);
119
- await delayAsync(100);
120
- expect(ws.readyState).toBe(WebSocket.CONNECTING);
121
- });
122
-
123
- it('should not emit close event when reconnecting until exceeds maxRetries', async () => {
124
- server = new WebSocketServer({ port: 8000 });
125
-
126
- const mockOnError = jest.fn();
127
- ws = new WebSocketWithReconnect('ws://localhost:8000', {
128
- retriesInterval: 50,
129
- maxRetries: 2,
130
- onError: mockOnError,
131
- });
132
- const mockClose = jest.fn();
133
- ws.addEventListener('close', mockClose);
134
- await closeServerAsync(server);
135
- await delayAsync(50);
136
- expect(mockClose).not.toHaveBeenCalled();
137
- await delayAsync(100);
138
- expect(mockClose).toHaveBeenCalled();
139
- expect(ws.readyState).toBe(WebSocket.CLOSED);
140
- expect(mockOnError).toHaveBeenCalled();
141
- });
142
-
143
- it('should support arraybuffer binaryType option', async () => {
144
- server = new WebSocketServer({ port: 8000 });
145
- // An echoing server
146
- server?.addListener('connection', (socket) => {
147
- socket.addEventListener('message', (e) => {
148
- socket.send(e.data);
149
- });
150
- });
151
-
152
- ws = new WebSocketWithReconnect('ws://localhost:8000', { binaryType: 'arraybuffer' });
153
- let received: any = null;
154
- ws.addEventListener('message', (e) => {
155
- received = e.data;
156
- });
157
- await new Promise((resolve) => {
158
- ws?.addEventListener('open', () => {
159
- resolve(null);
160
- });
161
- });
162
- expect(ws.readyState).toBe(WebSocket.OPEN);
163
-
164
- ws.send(new Uint8Array([0x01, 0x02, 0x03]));
165
- await delayAsync(50);
166
- expect(received).toBeInstanceOf(ArrayBuffer);
167
- expect(new Uint8Array(received as ArrayBuffer)).toEqual(new Uint8Array([0x01, 0x02, 0x03]));
168
- });
169
- });
170
-
171
- async function closeServerAsync(server: WebSocketServer | null) {
172
- if (server == null) {
173
- return;
174
- }
175
- server.close();
176
- for (const client of server.clients) {
177
- client.terminate();
178
- }
179
- await delayAsync(30);
180
- }
181
-
182
- async function delayAsync(timeMs: number) {
183
- return new Promise((resolve) => setTimeout(resolve, timeMs));
184
- }
@@ -1,20 +0,0 @@
1
- import * as logger from '../logger';
2
-
3
- describe('logger', () => {
4
- const spyLog = jest.spyOn(console, 'info').mockImplementation(() => {});
5
-
6
- afterEach(() => {
7
- logger.setEnableLogging(false);
8
- });
9
- it('should not log by default', () => {
10
- logger.info('test');
11
- expect(spyLog).not.toHaveBeenCalled();
12
- });
13
-
14
- it('should logger when enabled', () => {
15
- logger.setEnableLogging(true);
16
- logger.info('test logging');
17
- expect(spyLog).toHaveBeenCalled();
18
- expect(spyLog.mock.calls[0][0]).toBe('test logging');
19
- });
20
- });
@@ -1,50 +0,0 @@
1
- import type { WebSocketBackingStore } from './WebSocketBackingStore';
2
-
3
- /**
4
- * The connection info for devtools plugins client.
5
- */
6
- export interface ConnectionInfo {
7
- /** Indicates the sender towards the devtools plugin. */
8
- sender:
9
- | 'app' // client running in the app environment.
10
- | 'browser'; // client running in the browser environment.
11
-
12
- /** Dev server address. */
13
- devServer: string;
14
-
15
- /** The plugin name. */
16
- pluginName: string;
17
-
18
- /**
19
- * The backing store for the WebSocket connection. Exposed for testing.
20
- * If not provided, the default singleton instance will be used.
21
- * @hidden
22
- */
23
- wsStore?: WebSocketBackingStore;
24
-
25
- /**
26
- * The transport protocol version between the app and the webui.
27
- */
28
- protocolVersion: number;
29
- }
30
-
31
- /**
32
- * Options for the devtools plugin client.
33
- */
34
- export interface DevToolsPluginClientOptions {
35
- /**
36
- * The underlying WebSocket [`binaryType`](https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/binaryType).
37
- */
38
- websocketBinaryType?: 'arraybuffer' | 'blob';
39
- }
40
-
41
- /**
42
- * The handshake messages for the devtools plugin client.
43
- * @hidden
44
- */
45
- export interface HandshakeMessageParams {
46
- protocolVersion: number;
47
- pluginName: string;
48
- method: 'handshake' | 'terminateBrowserClient';
49
- browserClientId: string;
50
- }
@@ -1,18 +0,0 @@
1
- /**
2
- * Get the dev server address.
3
- */
4
-
5
- import { PROTOCOL_VERSION } from './ProtocolVersion';
6
- import type { ConnectionInfo } from './devtools.types';
7
-
8
- export function getConnectionInfo(): Omit<ConnectionInfo, 'pluginName'> {
9
- const getDevServer = require('react-native/Libraries/Core/Devtools/getDevServer').default;
10
- const devServer = getDevServer()
11
- .url.replace(/^https?:\/\//, '')
12
- .replace(/\/?$/, '') as string;
13
- return {
14
- protocolVersion: PROTOCOL_VERSION,
15
- sender: 'app',
16
- devServer,
17
- };
18
- }
@@ -1,16 +0,0 @@
1
- /**
2
- * Get the dev server address.
3
- */
4
-
5
- import { PROTOCOL_VERSION } from './ProtocolVersion';
6
- import type { ConnectionInfo } from './devtools.types';
7
-
8
- export function getConnectionInfo(): Omit<ConnectionInfo, 'pluginName'> {
9
- const devServerQuery = new URLSearchParams(window.location.search).get('devServer');
10
- const host = window.location.origin.replace(/^https?:\/\//, '');
11
- return {
12
- protocolVersion: PROTOCOL_VERSION,
13
- sender: 'browser',
14
- devServer: devServerQuery || host,
15
- };
16
- }
@@ -1,53 +0,0 @@
1
- import { useState, useEffect } from 'react';
2
-
3
- import { DevToolsPluginClient } from './DevToolsPluginClient';
4
- import { getDevToolsPluginClientAsync } from './DevToolsPluginClientFactory';
5
- import type { DevToolsPluginClientOptions } from './devtools.types';
6
-
7
- export { getDevToolsPluginClientAsync, DevToolsPluginClient };
8
- export type { DevToolsPluginClientOptions };
9
- // Export the EventSubscription type if people need to use explicit type from `addMessageListener`
10
- export type { EventSubscription } from './DevToolsPluginClient';
11
- export { setEnableLogging } from './logger';
12
-
13
- /**
14
- * A React hook to get the DevToolsPluginClient instance.
15
- */
16
- export function useDevToolsPluginClient(
17
- pluginName: string,
18
- options?: DevToolsPluginClientOptions
19
- ): DevToolsPluginClient | null {
20
- const [client, setClient] = useState<DevToolsPluginClient | null>(null);
21
- const [error, setError] = useState<Error | null>(null);
22
-
23
- useEffect(() => {
24
- async function setup() {
25
- try {
26
- const client = await getDevToolsPluginClientAsync(pluginName, options);
27
- setClient(client);
28
- } catch (e: any) {
29
- setError(new Error('Failed to setup client from useDevToolsPluginClient: ' + e.toString()));
30
- }
31
- }
32
-
33
- async function teardown() {
34
- try {
35
- await client?.closeAsync();
36
- } catch (e: any) {
37
- setError(
38
- new Error('Failed to teardown client from useDevToolsPluginClient: ' + e.toString())
39
- );
40
- }
41
- }
42
-
43
- setup();
44
- return () => {
45
- teardown();
46
- };
47
- }, [pluginName]);
48
-
49
- if (error != null) {
50
- throw error;
51
- }
52
- return client;
53
- }
@@ -1,29 +0,0 @@
1
- let enableLogging = false;
2
-
3
- export function log(...params: Parameters<typeof console.log>) {
4
- if (enableLogging) {
5
- console.log(...params);
6
- }
7
- }
8
-
9
- export function debug(...params: Parameters<typeof console.debug>) {
10
- if (enableLogging) {
11
- console.debug(...params);
12
- }
13
- }
14
-
15
- export function info(...params: Parameters<typeof console.info>) {
16
- if (enableLogging) {
17
- console.info(...params);
18
- }
19
- }
20
-
21
- export function warn(...params: Parameters<typeof console.info>) {
22
- if (enableLogging) {
23
- console.warn(...params);
24
- }
25
- }
26
-
27
- export function setEnableLogging(enabled: boolean) {
28
- enableLogging = enabled;
29
- }