@webview-bridge/web 1.4.1 → 1.4.3-nightly.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.
@@ -58,7 +58,14 @@ var createEvents = () => ({
58
58
  };
59
59
  }
60
60
  });
61
- var createResolver = (emitter2, methodName, eventId, evaluate, failHandler = false) => {
61
+ var createResolver = ({
62
+ emitter: emitter2,
63
+ evaluate,
64
+ eventId,
65
+ failHandler = false,
66
+ methodName,
67
+ onFallback
68
+ }) => {
62
69
  return new Promise((resolve, reject) => {
63
70
  const unbind = emitter2.on(
64
71
  `${methodName}-${eventId}`,
@@ -66,6 +73,7 @@ var createResolver = (emitter2, methodName, eventId, evaluate, failHandler = fal
66
73
  unbind();
67
74
  if (throwOccurred) {
68
75
  if (failHandler instanceof Error) {
76
+ onFallback?.();
69
77
  reject(failHandler);
70
78
  } else {
71
79
  resolve(void 0);
@@ -214,29 +222,39 @@ var linkBridgeStore = (initialState = {}) => {
214
222
  };
215
223
 
216
224
  // src/linkBridge.ts
217
- var createNativeMethod = (methodName, timeoutMs, throwOnError) => (...args) => {
225
+ var createNativeMethod = ({
226
+ methodName,
227
+ throwOnError,
228
+ timeoutMs,
229
+ onFallback
230
+ }) => (...args) => {
218
231
  const eventId = createRandomId();
219
- return Promise.race([
220
- createResolver(
221
- emitter,
222
- methodName,
223
- eventId,
224
- () => {
225
- window.ReactNativeWebView?.postMessage(
226
- JSON.stringify({
227
- type: "bridge",
228
- body: {
229
- method: methodName,
230
- eventId,
231
- args
232
- }
233
- })
234
- );
235
- },
236
- throwOnError && new NativeMethodError(methodName)
237
- ),
238
- timeout(timeoutMs, throwOnError)
239
- ]);
232
+ return Promise.race(
233
+ [
234
+ createResolver({
235
+ emitter,
236
+ methodName,
237
+ eventId,
238
+ evaluate: () => {
239
+ window.ReactNativeWebView?.postMessage(
240
+ JSON.stringify({
241
+ type: "bridge",
242
+ body: {
243
+ method: methodName,
244
+ eventId,
245
+ args
246
+ }
247
+ })
248
+ );
249
+ },
250
+ onFallback: () => {
251
+ onFallback?.(methodName, args);
252
+ },
253
+ failHandler: throwOnError && new NativeMethodError(methodName)
254
+ }),
255
+ timeoutMs > 0 && timeout(timeoutMs, throwOnError)
256
+ ].filter(Boolean)
257
+ );
240
258
  };
241
259
  var linkBridge = (options = {
242
260
  timeout: 2e3,
@@ -270,11 +288,12 @@ var linkBridge = (options = {
270
288
  (acc, methodName) => {
271
289
  return {
272
290
  ...acc,
273
- [methodName]: createNativeMethod(
291
+ [methodName]: createNativeMethod({
274
292
  methodName,
275
293
  timeoutMs,
276
- willMethodThrowOnError(methodName)
277
- )
294
+ throwOnError: willMethodThrowOnError(methodName),
295
+ onFallback
296
+ })
278
297
  };
279
298
  },
280
299
  {}
@@ -286,11 +305,12 @@ var linkBridge = (options = {
286
305
  )) {
287
306
  return target2[methodName];
288
307
  }
289
- return createNativeMethod(
308
+ return createNativeMethod({
290
309
  methodName,
291
310
  timeoutMs,
292
- willMethodThrowOnError(methodName)
293
- );
311
+ throwOnError: willMethodThrowOnError(methodName),
312
+ onFallback
313
+ });
294
314
  }
295
315
  });
296
316
  Object.assign(target, {
@@ -314,9 +334,11 @@ var linkBridge = (options = {
314
334
  }
315
335
  })
316
336
  );
317
- onFallback?.(methodName);
318
337
  if (willMethodThrowOnError(methodName)) {
319
- return () => Promise.reject(new MethodNotFoundError(methodName));
338
+ return (...args) => {
339
+ onFallback?.(methodName, args);
340
+ Promise.reject(new MethodNotFoundError(methodName));
341
+ };
320
342
  } else {
321
343
  console.warn(
322
344
  `[WebViewBridge] ${methodName} is not defined, using fallback.`
@@ -325,6 +347,10 @@ var linkBridge = (options = {
325
347
  return () => Promise.resolve();
326
348
  }
327
349
  });
350
+ for (const [eventName, ...args] of window.nativeBatchedEvents ?? []) {
351
+ emitter.emit(eventName, ...args);
352
+ }
353
+ window.nativeBatchedEvents = [];
328
354
  onReady?.(proxy);
329
355
  return proxy;
330
356
  };
@@ -28,7 +28,14 @@ var createEvents = () => ({
28
28
  };
29
29
  }
30
30
  });
31
- var createResolver = (emitter2, methodName, eventId, evaluate, failHandler = false) => {
31
+ var createResolver = ({
32
+ emitter: emitter2,
33
+ evaluate,
34
+ eventId,
35
+ failHandler = false,
36
+ methodName,
37
+ onFallback
38
+ }) => {
32
39
  return new Promise((resolve, reject) => {
33
40
  const unbind = emitter2.on(
34
41
  `${methodName}-${eventId}`,
@@ -36,6 +43,7 @@ var createResolver = (emitter2, methodName, eventId, evaluate, failHandler = fal
36
43
  unbind();
37
44
  if (throwOccurred) {
38
45
  if (failHandler instanceof Error) {
46
+ onFallback?.();
39
47
  reject(failHandler);
40
48
  } else {
41
49
  resolve(void 0);
@@ -184,29 +192,39 @@ var linkBridgeStore = (initialState = {}) => {
184
192
  };
185
193
 
186
194
  // src/linkBridge.ts
187
- var createNativeMethod = (methodName, timeoutMs, throwOnError) => (...args) => {
195
+ var createNativeMethod = ({
196
+ methodName,
197
+ throwOnError,
198
+ timeoutMs,
199
+ onFallback
200
+ }) => (...args) => {
188
201
  const eventId = createRandomId();
189
- return Promise.race([
190
- createResolver(
191
- emitter,
192
- methodName,
193
- eventId,
194
- () => {
195
- window.ReactNativeWebView?.postMessage(
196
- JSON.stringify({
197
- type: "bridge",
198
- body: {
199
- method: methodName,
200
- eventId,
201
- args
202
- }
203
- })
204
- );
205
- },
206
- throwOnError && new NativeMethodError(methodName)
207
- ),
208
- timeout(timeoutMs, throwOnError)
209
- ]);
202
+ return Promise.race(
203
+ [
204
+ createResolver({
205
+ emitter,
206
+ methodName,
207
+ eventId,
208
+ evaluate: () => {
209
+ window.ReactNativeWebView?.postMessage(
210
+ JSON.stringify({
211
+ type: "bridge",
212
+ body: {
213
+ method: methodName,
214
+ eventId,
215
+ args
216
+ }
217
+ })
218
+ );
219
+ },
220
+ onFallback: () => {
221
+ onFallback?.(methodName, args);
222
+ },
223
+ failHandler: throwOnError && new NativeMethodError(methodName)
224
+ }),
225
+ timeoutMs > 0 && timeout(timeoutMs, throwOnError)
226
+ ].filter(Boolean)
227
+ );
210
228
  };
211
229
  var linkBridge = (options = {
212
230
  timeout: 2e3,
@@ -240,11 +258,12 @@ var linkBridge = (options = {
240
258
  (acc, methodName) => {
241
259
  return {
242
260
  ...acc,
243
- [methodName]: createNativeMethod(
261
+ [methodName]: createNativeMethod({
244
262
  methodName,
245
263
  timeoutMs,
246
- willMethodThrowOnError(methodName)
247
- )
264
+ throwOnError: willMethodThrowOnError(methodName),
265
+ onFallback
266
+ })
248
267
  };
249
268
  },
250
269
  {}
@@ -256,11 +275,12 @@ var linkBridge = (options = {
256
275
  )) {
257
276
  return target2[methodName];
258
277
  }
259
- return createNativeMethod(
278
+ return createNativeMethod({
260
279
  methodName,
261
280
  timeoutMs,
262
- willMethodThrowOnError(methodName)
263
- );
281
+ throwOnError: willMethodThrowOnError(methodName),
282
+ onFallback
283
+ });
264
284
  }
265
285
  });
266
286
  Object.assign(target, {
@@ -284,9 +304,11 @@ var linkBridge = (options = {
284
304
  }
285
305
  })
286
306
  );
287
- onFallback?.(methodName);
288
307
  if (willMethodThrowOnError(methodName)) {
289
- return () => Promise.reject(new MethodNotFoundError(methodName));
308
+ return (...args) => {
309
+ onFallback?.(methodName, args);
310
+ Promise.reject(new MethodNotFoundError(methodName));
311
+ };
290
312
  } else {
291
313
  console.warn(
292
314
  `[WebViewBridge] ${methodName} is not defined, using fallback.`
@@ -295,6 +317,10 @@ var linkBridge = (options = {
295
317
  return () => Promise.resolve();
296
318
  }
297
319
  });
320
+ for (const [eventName, ...args] of window.nativeBatchedEvents ?? []) {
321
+ emitter.emit(eventName, ...args);
322
+ }
323
+ window.nativeBatchedEvents = [];
298
324
  onReady?.(proxy);
299
325
  return proxy;
300
326
  };
@@ -3,7 +3,7 @@ import { LinkBridge } from "./types";
3
3
  export interface LinkBridgeOptions<T extends BridgeStore<T extends Bridge ? T : any>> {
4
4
  timeout?: number;
5
5
  throwOnError?: boolean | (keyof ExtractStore<T>)[] | string[];
6
- onFallback?: (methodName: string) => void;
6
+ onFallback?: (methodName: string, args: unknown[]) => void;
7
7
  onReady?: (method: LinkBridge<ExcludePrimitive<ExtractStore<T>>, Omit<T, "setState">>) => void;
8
8
  }
9
9
  export declare const linkBridge: <T extends BridgeStore<T extends Bridge ? T : any>>(options?: LinkBridgeOptions<T>) => LinkBridge<ExcludePrimitive<ExtractStore<T>>, Omit<T, "setState">>;
@@ -12,5 +12,13 @@ export interface EventEmitter<Events extends EventsMap = DefaultEvents> {
12
12
  on<K extends keyof Events>(this: this, event: K, cb: Events[K]): () => void;
13
13
  }
14
14
  export declare const createEvents: <Events extends EventsMap = DefaultEvents>() => EventEmitter<Events>;
15
- export declare const createResolver: (emitter: EventEmitter<DefaultEvents>, methodName: string, eventId: string, evaluate: () => void, failHandler?: Error | false) => Promise<unknown>;
15
+ export interface CreateResolverOptions {
16
+ emitter: EventEmitter<DefaultEvents>;
17
+ evaluate: () => void;
18
+ eventId: string;
19
+ failHandler?: Error | false;
20
+ methodName: string;
21
+ onFallback?: () => void;
22
+ }
23
+ export declare const createResolver: ({ emitter, evaluate, eventId, failHandler, methodName, onFallback, }: CreateResolverOptions) => Promise<unknown>;
16
24
  export {};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@webview-bridge/web",
3
3
  "type": "module",
4
- "version": "1.4.1",
4
+ "version": "1.4.3-nightly.0",
5
5
  "description": "Fully Type-Safe Integration for React Native WebView and Web",
6
6
  "publishConfig": {
7
7
  "access": "public"