@aspectly/core 0.1.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -1,51 +1,58 @@
1
- export { A as AspectlyBridge, B as BridgeBase, c as BridgeData, q as BridgeErrorType, b as BridgeEvent, o as BridgeEventType, d as BridgeHandler, e as BridgeHandlers, m as BridgeInitEvent, n as BridgeInitResultEvent, a as BridgeInternal, f as BridgeListener, g as BridgeOptions, h as BridgeRequestEvent, l as BridgeResultData, j as BridgeResultError, i as BridgeResultEvent, k as BridgeResultSuccess, p as BridgeResultType } from './AspectlyBridge-hGuDjcI6.mjs';
1
+ export { A as AspectlyBridge, B as BridgeBase, c as BridgeData, q as BridgeErrorType, b as BridgeEvent, o as BridgeEventType, d as BridgeHandler, e as BridgeHandlers, m as BridgeInitEvent, n as BridgeInitResultEvent, a as BridgeInternal, f as BridgeListener, g as BridgeOptions, h as BridgeRequestEvent, l as BridgeResultData, j as BridgeResultError, i as BridgeResultEvent, k as BridgeResultSuccess, p as BridgeResultType } from './AspectlyBridge-BujTb5Lq.mjs';
2
+ import { Transport } from '@aspectly/transports';
3
+ export { CefSharpTransport, IframeTransport, NullTransport, ReactNativeTransport, Transport, TransportDetector, TransportListener, TransportRegistry, TransportUnsubscribe, detectTransport, registerTransport } from '@aspectly/transports';
2
4
 
3
5
  /**
4
6
  * Low-level bridge core handling platform-specific message passing
7
+ * Now delegates to @aspectly/transports for platform detection
5
8
  */
9
+
6
10
  type Event = unknown;
7
- interface WebViewMessage {
8
- nativeEvent?: {
9
- data?: string;
10
- };
11
- }
12
11
  type BridgeCoreListener = (event: Event) => void;
13
- declare global {
14
- interface Window {
15
- ReactNativeWebView?: {
16
- postMessage: (message: string) => void;
17
- };
18
- }
19
- }
20
12
  /**
21
13
  * BridgeCore handles the low-level platform detection and message serialization.
22
14
  * It provides static methods for wrapping events, creating listeners, and sending messages.
15
+ *
16
+ * Platform detection is now handled by @aspectly/transports which supports:
17
+ * - CefSharp (Chromium Embedded Framework for .NET)
18
+ * - React Native WebView
19
+ * - Iframe (window.parent.postMessage)
20
+ * - Custom transports via TransportRegistry
23
21
  */
24
22
  declare class BridgeCore {
25
23
  private static BRIDGE_EVENT_TYPE;
24
+ private static transport;
26
25
  private static isJSONObject;
27
26
  /**
28
- * Wraps an event in the bridge protocol format
27
+ * Get the current transport (lazy initialization)
29
28
  */
30
- static wrapBridgeEvent: (event: Event) => string;
29
+ private static getTransport;
31
30
  /**
32
- * Creates a listener wrapper that parses incoming messages
31
+ * Set a custom transport (useful for testing or manual configuration)
33
32
  */
34
- static wrapListener: (listener: BridgeCoreListener) => (data?: string) => void;
33
+ static setTransport(transport: Transport): void;
35
34
  /**
36
- * Creates a browser-specific message event listener
35
+ * Reset transport to auto-detect on next use
37
36
  */
38
- static browserListener: (listener: BridgeCoreListener) => (originalEvent: MessageEvent) => void;
37
+ static resetTransport(): void;
39
38
  /**
40
- * Creates a React Native WebView message listener
39
+ * Get the name of the current transport
41
40
  */
42
- static webViewListener: (listener: BridgeCoreListener) => (originalEvent: WebViewMessage) => void;
41
+ static getTransportName(): string;
42
+ /**
43
+ * Wraps an event in the bridge protocol format
44
+ */
45
+ static wrapBridgeEvent: (event: Event) => string;
46
+ /**
47
+ * Creates a listener wrapper that parses incoming messages
48
+ */
49
+ static wrapListener: (listener: BridgeCoreListener) => (data?: string) => void;
43
50
  /**
44
- * Sends an event to the parent context (WebView or iframe parent)
51
+ * Sends an event to the parent context using the detected transport
45
52
  */
46
53
  static sendEvent: (event: Event) => void;
47
54
  /**
48
- * Subscribes to window message events
55
+ * Subscribes to incoming messages via the detected transport
49
56
  * @returns Cleanup function to unsubscribe
50
57
  */
51
58
  static subscribe: (listener: BridgeCoreListener) => VoidFunction;
package/dist/index.d.ts CHANGED
@@ -1,51 +1,58 @@
1
- export { A as AspectlyBridge, B as BridgeBase, c as BridgeData, q as BridgeErrorType, b as BridgeEvent, o as BridgeEventType, d as BridgeHandler, e as BridgeHandlers, m as BridgeInitEvent, n as BridgeInitResultEvent, a as BridgeInternal, f as BridgeListener, g as BridgeOptions, h as BridgeRequestEvent, l as BridgeResultData, j as BridgeResultError, i as BridgeResultEvent, k as BridgeResultSuccess, p as BridgeResultType } from './AspectlyBridge-hGuDjcI6.js';
1
+ export { A as AspectlyBridge, B as BridgeBase, c as BridgeData, q as BridgeErrorType, b as BridgeEvent, o as BridgeEventType, d as BridgeHandler, e as BridgeHandlers, m as BridgeInitEvent, n as BridgeInitResultEvent, a as BridgeInternal, f as BridgeListener, g as BridgeOptions, h as BridgeRequestEvent, l as BridgeResultData, j as BridgeResultError, i as BridgeResultEvent, k as BridgeResultSuccess, p as BridgeResultType } from './AspectlyBridge-BujTb5Lq.js';
2
+ import { Transport } from '@aspectly/transports';
3
+ export { CefSharpTransport, IframeTransport, NullTransport, ReactNativeTransport, Transport, TransportDetector, TransportListener, TransportRegistry, TransportUnsubscribe, detectTransport, registerTransport } from '@aspectly/transports';
2
4
 
3
5
  /**
4
6
  * Low-level bridge core handling platform-specific message passing
7
+ * Now delegates to @aspectly/transports for platform detection
5
8
  */
9
+
6
10
  type Event = unknown;
7
- interface WebViewMessage {
8
- nativeEvent?: {
9
- data?: string;
10
- };
11
- }
12
11
  type BridgeCoreListener = (event: Event) => void;
13
- declare global {
14
- interface Window {
15
- ReactNativeWebView?: {
16
- postMessage: (message: string) => void;
17
- };
18
- }
19
- }
20
12
  /**
21
13
  * BridgeCore handles the low-level platform detection and message serialization.
22
14
  * It provides static methods for wrapping events, creating listeners, and sending messages.
15
+ *
16
+ * Platform detection is now handled by @aspectly/transports which supports:
17
+ * - CefSharp (Chromium Embedded Framework for .NET)
18
+ * - React Native WebView
19
+ * - Iframe (window.parent.postMessage)
20
+ * - Custom transports via TransportRegistry
23
21
  */
24
22
  declare class BridgeCore {
25
23
  private static BRIDGE_EVENT_TYPE;
24
+ private static transport;
26
25
  private static isJSONObject;
27
26
  /**
28
- * Wraps an event in the bridge protocol format
27
+ * Get the current transport (lazy initialization)
29
28
  */
30
- static wrapBridgeEvent: (event: Event) => string;
29
+ private static getTransport;
31
30
  /**
32
- * Creates a listener wrapper that parses incoming messages
31
+ * Set a custom transport (useful for testing or manual configuration)
33
32
  */
34
- static wrapListener: (listener: BridgeCoreListener) => (data?: string) => void;
33
+ static setTransport(transport: Transport): void;
35
34
  /**
36
- * Creates a browser-specific message event listener
35
+ * Reset transport to auto-detect on next use
37
36
  */
38
- static browserListener: (listener: BridgeCoreListener) => (originalEvent: MessageEvent) => void;
37
+ static resetTransport(): void;
39
38
  /**
40
- * Creates a React Native WebView message listener
39
+ * Get the name of the current transport
41
40
  */
42
- static webViewListener: (listener: BridgeCoreListener) => (originalEvent: WebViewMessage) => void;
41
+ static getTransportName(): string;
42
+ /**
43
+ * Wraps an event in the bridge protocol format
44
+ */
45
+ static wrapBridgeEvent: (event: Event) => string;
46
+ /**
47
+ * Creates a listener wrapper that parses incoming messages
48
+ */
49
+ static wrapListener: (listener: BridgeCoreListener) => (data?: string) => void;
43
50
  /**
44
- * Sends an event to the parent context (WebView or iframe parent)
51
+ * Sends an event to the parent context using the detected transport
45
52
  */
46
53
  static sendEvent: (event: Event) => void;
47
54
  /**
48
- * Subscribes to window message events
55
+ * Subscribes to incoming messages via the detected transport
49
56
  * @returns Cleanup function to unsubscribe
50
57
  */
51
58
  static subscribe: (listener: BridgeCoreListener) => VoidFunction;
package/dist/index.js CHANGED
@@ -1,9 +1,39 @@
1
1
  'use strict';
2
2
 
3
+ var transports = require('@aspectly/transports');
4
+
3
5
  // src/BridgeCore.ts
4
6
  var _BridgeCore = class _BridgeCore {
7
+ /**
8
+ * Get the current transport (lazy initialization)
9
+ */
10
+ static getTransport() {
11
+ if (!_BridgeCore.transport) {
12
+ _BridgeCore.transport = transports.detectTransport();
13
+ }
14
+ return _BridgeCore.transport;
15
+ }
16
+ /**
17
+ * Set a custom transport (useful for testing or manual configuration)
18
+ */
19
+ static setTransport(transport) {
20
+ _BridgeCore.transport = transport;
21
+ }
22
+ /**
23
+ * Reset transport to auto-detect on next use
24
+ */
25
+ static resetTransport() {
26
+ _BridgeCore.transport = null;
27
+ }
28
+ /**
29
+ * Get the name of the current transport
30
+ */
31
+ static getTransportName() {
32
+ return _BridgeCore.getTransport().name;
33
+ }
5
34
  };
6
35
  _BridgeCore.BRIDGE_EVENT_TYPE = "BridgeEvent";
36
+ _BridgeCore.transport = null;
7
37
  _BridgeCore.isJSONObject = (str) => {
8
38
  return str.startsWith("{") && str.endsWith("}");
9
39
  };
@@ -43,60 +73,21 @@ _BridgeCore.wrapListener = (listener) => (data) => {
43
73
  }
44
74
  };
45
75
  /**
46
- * Creates a browser-specific message event listener
47
- */
48
- _BridgeCore.browserListener = (listener) => {
49
- const triggerEvent = _BridgeCore.wrapListener(listener);
50
- return (originalEvent) => {
51
- if (!originalEvent?.data) {
52
- return;
53
- }
54
- triggerEvent(originalEvent.data);
55
- };
56
- };
57
- /**
58
- * Creates a React Native WebView message listener
59
- */
60
- _BridgeCore.webViewListener = (listener) => {
61
- const triggerEvent = _BridgeCore.wrapListener(listener);
62
- return (originalEvent) => {
63
- if (!originalEvent?.nativeEvent?.data) {
64
- return;
65
- }
66
- triggerEvent(originalEvent.nativeEvent.data);
67
- };
68
- };
69
- /**
70
- * Sends an event to the parent context (WebView or iframe parent)
76
+ * Sends an event to the parent context using the detected transport
71
77
  */
72
78
  _BridgeCore.sendEvent = (event) => {
73
79
  const bridgeEvent = _BridgeCore.wrapBridgeEvent(event);
74
- if (typeof window === "undefined") {
75
- console.warn("Window is undefined");
76
- return;
77
- }
78
- const RNW = window.ReactNativeWebView;
79
- if (typeof RNW?.postMessage === "function") {
80
- RNW.postMessage(`'${bridgeEvent}'`);
81
- return;
82
- }
83
- if (window.parent === window) {
84
- return;
85
- }
86
- window.parent.postMessage(bridgeEvent, "*");
80
+ const transport = _BridgeCore.getTransport();
81
+ transport.send(bridgeEvent);
87
82
  };
88
83
  /**
89
- * Subscribes to window message events
84
+ * Subscribes to incoming messages via the detected transport
90
85
  * @returns Cleanup function to unsubscribe
91
86
  */
92
87
  _BridgeCore.subscribe = (listener) => {
93
- const browserListener = _BridgeCore.browserListener(listener);
94
- if (typeof window === "undefined" || !window.addEventListener) {
95
- return () => {
96
- };
97
- }
98
- window.addEventListener("message", browserListener);
99
- return () => window.removeEventListener("message", browserListener);
88
+ const transport = _BridgeCore.getTransport();
89
+ const wrappedListener = _BridgeCore.wrapListener(listener);
90
+ return transport.subscribe(wrappedListener);
100
91
  };
101
92
  var BridgeCore = _BridgeCore;
102
93
 
@@ -135,6 +126,16 @@ var BridgeInternal = class {
135
126
  this.available = false;
136
127
  this.supportedMethods = [];
137
128
  this.listeners = [];
129
+ /**
130
+ * Reset bridge state for a new connection context.
131
+ * Call this when the remote side has changed (e.g., new popup window).
132
+ */
133
+ this.reset = () => {
134
+ this.handlers = {};
135
+ this.available = false;
136
+ this.supportedMethods = [];
137
+ this.initPromise = void 0;
138
+ };
138
139
  /**
139
140
  * Subscribe to all result events
140
141
  */
@@ -388,6 +389,10 @@ var BridgeBase = class {
388
389
  * @returns Promise resolving when initialization is complete
389
390
  */
390
391
  this.init = (handlers) => this.bridge.init(handlers);
392
+ /**
393
+ * Reset bridge state for a new connection context
394
+ */
395
+ this.reset = () => this.bridge.reset();
391
396
  this.bridge = bridge;
392
397
  }
393
398
  };
@@ -409,6 +414,34 @@ var AspectlyBridge = class extends BridgeBase {
409
414
  }
410
415
  };
411
416
 
417
+ Object.defineProperty(exports, "CefSharpTransport", {
418
+ enumerable: true,
419
+ get: function () { return transports.CefSharpTransport; }
420
+ });
421
+ Object.defineProperty(exports, "IframeTransport", {
422
+ enumerable: true,
423
+ get: function () { return transports.IframeTransport; }
424
+ });
425
+ Object.defineProperty(exports, "NullTransport", {
426
+ enumerable: true,
427
+ get: function () { return transports.NullTransport; }
428
+ });
429
+ Object.defineProperty(exports, "ReactNativeTransport", {
430
+ enumerable: true,
431
+ get: function () { return transports.ReactNativeTransport; }
432
+ });
433
+ Object.defineProperty(exports, "TransportRegistry", {
434
+ enumerable: true,
435
+ get: function () { return transports.TransportRegistry; }
436
+ });
437
+ Object.defineProperty(exports, "detectTransport", {
438
+ enumerable: true,
439
+ get: function () { return transports.detectTransport; }
440
+ });
441
+ Object.defineProperty(exports, "registerTransport", {
442
+ enumerable: true,
443
+ get: function () { return transports.registerTransport; }
444
+ });
412
445
  exports.AspectlyBridge = AspectlyBridge;
413
446
  exports.BridgeBase = BridgeBase;
414
447
  exports.BridgeCore = BridgeCore;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/BridgeCore.ts","../src/types.ts","../src/BridgeInternal.ts","../src/BridgeBase.ts","../src/AspectlyBridge.ts"],"names":["BridgeEventType","BridgeResultType","BridgeErrorType"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Low-level bridge core handling platform-specific message passing\n */\n\nexport type Event = unknown;\n\ninterface BridgeCoreEvent {\n type: string;\n event: Event;\n}\n\ninterface WebViewMessage {\n nativeEvent?: {\n data?: string;\n };\n}\n\nexport type BridgeCoreListener = (event: Event) => void;\n\ndeclare global {\n interface Window {\n ReactNativeWebView?: {\n postMessage: (message: string) => void;\n };\n }\n}\n\n/**\n * BridgeCore handles the low-level platform detection and message serialization.\n * It provides static methods for wrapping events, creating listeners, and sending messages.\n */\nexport class BridgeCore {\n private static BRIDGE_EVENT_TYPE = 'BridgeEvent';\n\n private static isJSONObject = (str: string): boolean => {\n return str.startsWith('{') && str.endsWith('}');\n };\n\n /**\n * Wraps an event in the bridge protocol format\n */\n public static wrapBridgeEvent = (event: Event): string => {\n return JSON.stringify({\n event,\n type: BridgeCore.BRIDGE_EVENT_TYPE,\n });\n };\n\n /**\n * Creates a listener wrapper that parses incoming messages\n */\n static wrapListener =\n (listener: BridgeCoreListener) =>\n (data?: string): void => {\n if (typeof data !== 'string') {\n return;\n }\n if (!data) {\n return;\n }\n let processedData = data;\n // iOS wraps JSON with additional quotes\n if (processedData.startsWith(\"'\") && processedData.endsWith(\"'\")) {\n processedData = processedData.substring(1, processedData.length - 1);\n }\n if (!BridgeCore.isJSONObject(processedData)) {\n return;\n }\n try {\n const eventData: BridgeCoreEvent = JSON.parse(processedData);\n if (!eventData || eventData.type !== BridgeCore.BRIDGE_EVENT_TYPE) {\n return;\n }\n listener(eventData.event);\n } catch {\n // Ignore parse errors\n }\n };\n\n /**\n * Creates a browser-specific message event listener\n */\n static browserListener = (listener: BridgeCoreListener) => {\n const triggerEvent = BridgeCore.wrapListener(listener);\n return (originalEvent: MessageEvent): void => {\n if (!originalEvent?.data) {\n return;\n }\n triggerEvent(originalEvent.data);\n };\n };\n\n /**\n * Creates a React Native WebView message listener\n */\n static webViewListener = (listener: BridgeCoreListener) => {\n const triggerEvent = BridgeCore.wrapListener(listener);\n return (originalEvent: WebViewMessage): void => {\n if (!originalEvent?.nativeEvent?.data) {\n return;\n }\n triggerEvent(originalEvent.nativeEvent.data);\n };\n };\n\n /**\n * Sends an event to the parent context (WebView or iframe parent)\n */\n static sendEvent = (event: Event): void => {\n const bridgeEvent = BridgeCore.wrapBridgeEvent(event);\n if (typeof window === 'undefined') {\n console.warn('Window is undefined');\n return;\n }\n const RNW = window.ReactNativeWebView;\n if (typeof RNW?.postMessage === 'function') {\n RNW.postMessage(`'${bridgeEvent}'`);\n return;\n }\n if (window.parent === window) {\n return;\n }\n window.parent.postMessage(bridgeEvent, '*');\n };\n\n /**\n * Subscribes to window message events\n * @returns Cleanup function to unsubscribe\n */\n static subscribe = (listener: BridgeCoreListener): VoidFunction => {\n const browserListener = BridgeCore.browserListener(listener);\n if (typeof window === 'undefined' || !window.addEventListener) {\n return () => {};\n }\n window.addEventListener('message', browserListener);\n return () => window.removeEventListener('message', browserListener);\n };\n}\n","/**\n * Event types used in bridge communication protocol\n */\nexport enum BridgeEventType {\n /** Request to invoke a method on the other side */\n Request = 'Request',\n /** Response to a request */\n Result = 'Result',\n /** Initialization handshake */\n Init = 'Init',\n /** Response to initialization */\n InitResult = 'InitResult',\n}\n\n/**\n * Result types for bridge responses\n */\nexport enum BridgeResultType {\n /** Successful response */\n Success = 'Success',\n /** Error response */\n Error = 'Error',\n}\n\n/**\n * Error types that can occur during bridge communication\n */\nexport enum BridgeErrorType {\n /** Handler took longer than timeout (default: 100s) */\n METHOD_EXECUTION_TIMEOUT = 'METHOD_EXECUTION_TIMEOUT',\n /** Method is not registered on the receiving side */\n UNSUPPORTED_METHOD = 'UNSUPPORTED_METHOD',\n /** Handler threw an error */\n REJECTED = 'REJECTED',\n /** Bridge is not initialized or unavailable */\n BRIDGE_NOT_AVAILABLE = 'BRIDGE_NOT_AVAILABLE',\n}\n\n/**\n * Error data returned when a bridge call fails\n */\nexport interface BridgeResultError {\n error_type: BridgeErrorType;\n error_message?: string;\n}\n\n/**\n * Successful result data (any object)\n */\nexport type BridgeResultSuccess = object;\n\n/**\n * Union type for result data\n */\nexport type BridgeResultData =\n | BridgeResultError\n | undefined\n | BridgeResultSuccess;\n\n/**\n * Result event sent back after processing a request\n */\nexport interface BridgeResultEvent {\n type?: BridgeResultType;\n method?: string;\n request_id?: string;\n data?: BridgeResultData;\n}\n\n/**\n * Request event sent to invoke a method\n */\nexport interface BridgeRequestEvent {\n method: string;\n params: object;\n request_id?: string;\n}\n\n/**\n * Initialization event with available methods\n */\nexport interface BridgeInitEvent {\n methods: string[];\n}\n\n/**\n * Initialization result (success/failure)\n */\nexport type BridgeInitResultEvent = boolean;\n\n/**\n * Union of all possible bridge data payloads\n */\nexport type BridgeData =\n | BridgeResultEvent\n | BridgeInitEvent\n | BridgeInitResultEvent\n | BridgeRequestEvent;\n\n/**\n * Complete bridge event with type and data\n */\nexport interface BridgeEvent {\n type: BridgeEventType;\n data: BridgeData;\n}\n\n/**\n * Handler function for processing incoming requests\n */\nexport type BridgeHandler<TParams = object, TResult = unknown> = (\n params: TParams\n) => Promise<TResult>;\n\n/**\n * Map of method names to their handlers\n */\nexport interface BridgeHandlers {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: BridgeHandler<any, any>;\n}\n\n/**\n * Listener function for bridge result events\n */\nexport type BridgeListener = (result: BridgeResultEvent) => void;\n\n/**\n * Options for bridge initialization\n */\nexport interface BridgeOptions {\n /** Timeout for method execution in milliseconds (default: 100000) */\n timeout?: number;\n}\n","import type {\n BridgeData,\n BridgeEvent,\n BridgeHandlers,\n BridgeInitEvent,\n BridgeInitResultEvent,\n BridgeListener,\n BridgeOptions,\n BridgeRequestEvent,\n BridgeResultData,\n BridgeResultError,\n BridgeResultEvent,\n} from './types';\nimport {\n BridgeErrorType,\n BridgeEventType,\n BridgeResultType,\n} from './types';\n\n/**\n * Creates a bridge event with the specified type and data\n */\nexport const internalEvent = (\n type: BridgeEventType,\n data: BridgeData\n): BridgeEvent => ({\n type,\n data,\n});\n\n/**\n * Creates a result event\n */\nexport const internalResultEvent = (data: BridgeData): BridgeEvent =>\n internalEvent(BridgeEventType.Result, data);\n\ninterface InternalRequestPromise {\n reject: (error: BridgeResultError) => void;\n resolve: (result: BridgeResultData) => void;\n}\n\ninterface InitPromise {\n reject: () => void;\n resolve: (success: boolean) => void;\n}\n\ntype InternalEventSender = (event: BridgeEvent) => void;\n\nconst DEFAULT_TIMEOUT = 100000;\n\n/**\n * BridgeInternal handles the business logic of the bridge protocol.\n * It manages request/response lifecycle, handler registration, and event routing.\n */\nexport class BridgeInternal {\n private requests: InternalRequestPromise[] = [];\n private handlers: BridgeHandlers = {};\n private available = false;\n private supportedMethods: string[] = [];\n private listeners: BridgeListener[] = [];\n private initPromise?: InitPromise;\n private readonly sendEvent: InternalEventSender;\n private readonly timeout: number;\n\n constructor(sendEvent: InternalEventSender, options?: BridgeOptions) {\n this.sendEvent = sendEvent;\n this.timeout = options?.timeout ?? DEFAULT_TIMEOUT;\n }\n\n /**\n * Subscribe to all result events\n */\n public subscribe = (listener: BridgeListener): number => {\n return this.listeners.push(listener);\n };\n\n /**\n * Unsubscribe from result events\n */\n public unsubscribe = (listener: BridgeListener): void => {\n this.listeners = this.listeners.filter(\n (oldListener) => oldListener !== listener\n );\n };\n\n private checkDiff = (a: string[], b: string[]): boolean => {\n return (\n a.filter((x) => !b.includes(x)).length > 0 ||\n b.filter((x) => !a.includes(x)).length > 0\n );\n };\n\n /**\n * Initialize the bridge with handlers\n * @param handlers Map of method names to handler functions\n * @returns Promise that resolves when the other side acknowledges\n */\n public init = (handlers: BridgeHandlers = {}): Promise<boolean> => {\n const oldMethods = Object.keys(this.handlers);\n const newMethods = Object.keys(handlers);\n this.handlers = handlers;\n if (!this.checkDiff(oldMethods, newMethods)) {\n return Promise.resolve(true);\n }\n return new Promise((resolve, reject) => {\n this.initPromise = { resolve, reject };\n this.sendEvent(\n internalEvent(BridgeEventType.Init, {\n methods: newMethods,\n })\n );\n });\n };\n\n /**\n * Handle incoming bridge events\n */\n public handleCoreEvent = (event: BridgeEvent): void => {\n const { type, data } = event;\n switch (type) {\n case BridgeEventType.Init:\n this.handleInit(data as BridgeInitEvent);\n break;\n case BridgeEventType.InitResult:\n this.handleInitResult(data as BridgeInitResultEvent);\n break;\n case BridgeEventType.Request:\n this.handleRequest(data as BridgeRequestEvent);\n break;\n case BridgeEventType.Result:\n this.handleResult(data as BridgeResultEvent);\n break;\n }\n };\n\n /**\n * Handle incoming requests and execute the appropriate handler\n */\n public handleRequest = (request: BridgeRequestEvent): void => {\n const { method, params, request_id } = request;\n new Promise<BridgeResultData>((resolve, reject) => {\n let timeout = false;\n if (!Object.prototype.hasOwnProperty.call(this.handlers, method)) {\n reject({\n error_type: BridgeErrorType.UNSUPPORTED_METHOD,\n error: new Error(`Handler for «${method}» is not registered`),\n });\n return;\n }\n const timer = setTimeout(() => {\n timeout = true;\n reject({\n error_type: BridgeErrorType.METHOD_EXECUTION_TIMEOUT,\n error: new Error('Execution timeout exceeded'),\n });\n }, this.timeout);\n const handler = this.handlers[method];\n if (!handler) {\n reject({\n error_type: BridgeErrorType.UNSUPPORTED_METHOD,\n error: new Error(`Handler for «${method}» is undefined`),\n });\n return;\n }\n handler(params)\n .then((result) => {\n if (timeout) {\n return;\n }\n clearTimeout(timer);\n resolve(result as BridgeResultData);\n })\n .catch((error: Error) => {\n if (timeout) {\n return;\n }\n clearTimeout(timer);\n reject({\n error_type: BridgeErrorType.REJECTED,\n error: error,\n });\n });\n })\n .then((data: BridgeResultData) => {\n this.sendEvent(\n internalResultEvent({\n type: BridgeResultType.Success,\n data,\n method,\n request_id,\n })\n );\n })\n .catch(\n ({\n error_type,\n error,\n }: {\n error_type: BridgeErrorType;\n error: Error;\n }) => {\n this.sendEvent(\n internalResultEvent({\n type: BridgeResultType.Error,\n request_id,\n method,\n data: {\n error_message: error.message,\n error_type,\n },\n })\n );\n }\n );\n };\n\n private handleResult = (result: BridgeResultEvent): void => {\n this.handleRequestResult(result);\n this.listeners.forEach((listener) => listener(result));\n };\n\n private handleRequestResult = (result: BridgeResultEvent): void => {\n if (!result || !Object.prototype.hasOwnProperty.call(result, 'request_id')) {\n return;\n }\n if (!Object.prototype.hasOwnProperty.call(result, 'type')) {\n console.warn('unknown result', result);\n return;\n }\n const { request_id, data, type } = result;\n const request = this.requests[Number(request_id)];\n if (!request) {\n return;\n }\n if (type === BridgeResultType.Success) {\n request.resolve(data);\n return;\n }\n if (type === BridgeResultType.Error) {\n request.reject(data as BridgeResultError);\n }\n };\n\n private handleInit = (data: BridgeInitEvent): void => {\n this.available = true;\n this.supportedMethods = data.methods;\n this.sendEvent(internalEvent(BridgeEventType.InitResult, true));\n };\n\n private handleInitResult = (success: BridgeInitResultEvent): void => {\n if (success) {\n this.initPromise?.resolve(true);\n } else {\n this.initPromise?.reject();\n }\n };\n\n /**\n * Send a request to the other side\n * @param method Method name to invoke\n * @param params Parameters to pass to the method\n * @returns Promise that resolves with the result\n */\n public send = <TResult = unknown>(\n method: string,\n params: object\n ): Promise<TResult> =>\n new Promise((resolve, reject) => {\n const request_id = (\n this.requests.push({ resolve: resolve as (result: BridgeResultData) => void, reject }) - 1\n ).toString();\n if (!this.isAvailable()) {\n this.handleCoreEvent(\n internalResultEvent({\n type: BridgeResultType.Error,\n request_id,\n method,\n data: {\n error_message: 'Bridge is not available',\n error_type: BridgeErrorType.BRIDGE_NOT_AVAILABLE,\n },\n })\n );\n return;\n }\n this.sendEvent(\n internalEvent(BridgeEventType.Request, {\n method,\n params,\n request_id,\n })\n );\n });\n\n /**\n * Check if a method is supported by the other side\n */\n public supports = (method: string): boolean =>\n this.supportedMethods.includes(method);\n\n /**\n * Check if the bridge is available (initialized)\n */\n public isAvailable = (): boolean => this.available;\n}\n","import type { BridgeHandlers, BridgeListener } from './types';\nimport type { BridgeInternal } from './BridgeInternal';\n\n/**\n * BridgeBase provides the public API for bridge communication.\n * It wraps BridgeInternal and exposes a clean interface for consumers.\n */\nexport class BridgeBase {\n protected bridge: BridgeInternal;\n\n constructor(bridge: BridgeInternal) {\n this.bridge = bridge;\n }\n\n /**\n * Check if a method is supported by the other side\n * @param method Method name to check\n */\n public supports = (method: string): boolean => this.bridge.supports(method);\n\n /**\n * Check if the bridge is available (initialized)\n */\n public isAvailable = (): boolean => this.bridge.isAvailable();\n\n /**\n * Send a request to invoke a method on the other side\n * @param method Method name to invoke\n * @param params Parameters to pass\n * @returns Promise resolving with the result\n */\n public send = <TResult = unknown>(\n method: string,\n params: object = {}\n ): Promise<TResult> => {\n return this.bridge.send<TResult>(method, params);\n };\n\n /**\n * Subscribe to all result events\n * @param listener Callback for result events\n * @returns Subscription index\n */\n public subscribe = (listener: BridgeListener): number => {\n return this.bridge.subscribe(listener);\n };\n\n /**\n * Unsubscribe from result events\n * @param listener The listener to remove\n */\n public unsubscribe = (listener: BridgeListener): void => {\n return this.bridge.unsubscribe(listener);\n };\n\n /**\n * Initialize the bridge with handlers\n * @param handlers Map of method names to handler functions\n * @returns Promise resolving when initialization is complete\n */\n public init = (handlers?: BridgeHandlers): Promise<boolean> =>\n this.bridge.init(handlers);\n}\n","import { BridgeCore } from './BridgeCore';\nimport { BridgeInternal } from './BridgeInternal';\nimport { BridgeBase } from './BridgeBase';\nimport type { BridgeOptions } from './types';\n\n/**\n * AspectlyBridge is the main entry point for bridge communication.\n * Use this class when running inside a WebView or iframe that needs\n * to communicate with its parent container.\n *\n * @example\n * ```typescript\n * // Inside a WebView or iframe\n * const bridge = new AspectlyBridge();\n *\n * // Initialize with handlers\n * await bridge.init({\n * greet: async (params) => {\n * return { message: `Hello, ${params.name}!` };\n * }\n * });\n *\n * // Send messages to parent\n * const result = await bridge.send('someMethod', { data: 'value' });\n * ```\n */\nexport class AspectlyBridge extends BridgeBase {\n private cleanupSubscription: VoidFunction;\n\n constructor(options?: BridgeOptions) {\n const bridge = new BridgeInternal(BridgeCore.sendEvent, options);\n super(bridge);\n this.cleanupSubscription = BridgeCore.subscribe(\n bridge.handleCoreEvent as (event: unknown) => void\n );\n }\n\n /**\n * Cleanup bridge subscriptions\n */\n public destroy = (): void => {\n this.cleanupSubscription();\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/BridgeCore.ts","../src/types.ts","../src/BridgeInternal.ts","../src/BridgeBase.ts","../src/AspectlyBridge.ts"],"names":["detectTransport","BridgeEventType","BridgeResultType","BridgeErrorType"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Low-level bridge core handling platform-specific message passing\n * Now delegates to @aspectly/transports for platform detection\n */\n\nimport { detectTransport, type Transport } from '@aspectly/transports';\n\nexport type Event = unknown;\n\ninterface BridgeCoreEvent {\n type: string;\n event: Event;\n}\n\nexport type BridgeCoreListener = (event: Event) => void;\n\n/**\n * BridgeCore handles the low-level platform detection and message serialization.\n * It provides static methods for wrapping events, creating listeners, and sending messages.\n *\n * Platform detection is now handled by @aspectly/transports which supports:\n * - CefSharp (Chromium Embedded Framework for .NET)\n * - React Native WebView\n * - Iframe (window.parent.postMessage)\n * - Custom transports via TransportRegistry\n */\nexport class BridgeCore {\n private static BRIDGE_EVENT_TYPE = 'BridgeEvent';\n private static transport: Transport | null = null;\n\n private static isJSONObject = (str: string): boolean => {\n return str.startsWith('{') && str.endsWith('}');\n };\n\n /**\n * Get the current transport (lazy initialization)\n */\n private static getTransport(): Transport {\n if (!BridgeCore.transport) {\n BridgeCore.transport = detectTransport();\n }\n return BridgeCore.transport;\n }\n\n /**\n * Set a custom transport (useful for testing or manual configuration)\n */\n public static setTransport(transport: Transport): void {\n BridgeCore.transport = transport;\n }\n\n /**\n * Reset transport to auto-detect on next use\n */\n public static resetTransport(): void {\n BridgeCore.transport = null;\n }\n\n /**\n * Get the name of the current transport\n */\n public static getTransportName(): string {\n return BridgeCore.getTransport().name;\n }\n\n /**\n * Wraps an event in the bridge protocol format\n */\n public static wrapBridgeEvent = (event: Event): string => {\n return JSON.stringify({\n event,\n type: BridgeCore.BRIDGE_EVENT_TYPE,\n });\n };\n\n /**\n * Creates a listener wrapper that parses incoming messages\n */\n static wrapListener =\n (listener: BridgeCoreListener) =>\n (data?: string): void => {\n if (typeof data !== 'string') {\n return;\n }\n if (!data) {\n return;\n }\n let processedData = data;\n // iOS wraps JSON with additional quotes\n if (processedData.startsWith(\"'\") && processedData.endsWith(\"'\")) {\n processedData = processedData.substring(1, processedData.length - 1);\n }\n if (!BridgeCore.isJSONObject(processedData)) {\n return;\n }\n try {\n const eventData: BridgeCoreEvent = JSON.parse(processedData);\n if (!eventData || eventData.type !== BridgeCore.BRIDGE_EVENT_TYPE) {\n return;\n }\n listener(eventData.event);\n } catch {\n // Ignore parse errors\n }\n };\n\n /**\n * Sends an event to the parent context using the detected transport\n */\n static sendEvent = (event: Event): void => {\n const bridgeEvent = BridgeCore.wrapBridgeEvent(event);\n const transport = BridgeCore.getTransport();\n transport.send(bridgeEvent);\n };\n\n /**\n * Subscribes to incoming messages via the detected transport\n * @returns Cleanup function to unsubscribe\n */\n static subscribe = (listener: BridgeCoreListener): VoidFunction => {\n const transport = BridgeCore.getTransport();\n const wrappedListener = BridgeCore.wrapListener(listener);\n return transport.subscribe(wrappedListener);\n };\n}\n","/**\n * Event types used in bridge communication protocol\n */\nexport enum BridgeEventType {\n /** Request to invoke a method on the other side */\n Request = 'Request',\n /** Response to a request */\n Result = 'Result',\n /** Initialization handshake */\n Init = 'Init',\n /** Response to initialization */\n InitResult = 'InitResult',\n}\n\n/**\n * Result types for bridge responses\n */\nexport enum BridgeResultType {\n /** Successful response */\n Success = 'Success',\n /** Error response */\n Error = 'Error',\n}\n\n/**\n * Error types that can occur during bridge communication\n */\nexport enum BridgeErrorType {\n /** Handler took longer than timeout (default: 100s) */\n METHOD_EXECUTION_TIMEOUT = 'METHOD_EXECUTION_TIMEOUT',\n /** Method is not registered on the receiving side */\n UNSUPPORTED_METHOD = 'UNSUPPORTED_METHOD',\n /** Handler threw an error */\n REJECTED = 'REJECTED',\n /** Bridge is not initialized or unavailable */\n BRIDGE_NOT_AVAILABLE = 'BRIDGE_NOT_AVAILABLE',\n}\n\n/**\n * Error data returned when a bridge call fails\n */\nexport interface BridgeResultError {\n error_type: BridgeErrorType;\n error_message?: string;\n}\n\n/**\n * Successful result data (any object)\n */\nexport type BridgeResultSuccess = object;\n\n/**\n * Union type for result data\n */\nexport type BridgeResultData =\n | BridgeResultError\n | undefined\n | BridgeResultSuccess;\n\n/**\n * Result event sent back after processing a request\n */\nexport interface BridgeResultEvent {\n type?: BridgeResultType;\n method?: string;\n request_id?: string;\n data?: BridgeResultData;\n}\n\n/**\n * Request event sent to invoke a method\n */\nexport interface BridgeRequestEvent {\n method: string;\n params: object;\n request_id?: string;\n}\n\n/**\n * Initialization event with available methods\n */\nexport interface BridgeInitEvent {\n methods: string[];\n}\n\n/**\n * Initialization result (success/failure)\n */\nexport type BridgeInitResultEvent = boolean;\n\n/**\n * Union of all possible bridge data payloads\n */\nexport type BridgeData =\n | BridgeResultEvent\n | BridgeInitEvent\n | BridgeInitResultEvent\n | BridgeRequestEvent;\n\n/**\n * Complete bridge event with type and data\n */\nexport interface BridgeEvent {\n type: BridgeEventType;\n data: BridgeData;\n}\n\n/**\n * Handler function for processing incoming requests\n */\nexport type BridgeHandler<TParams = object, TResult = unknown> = (\n params: TParams\n) => Promise<TResult>;\n\n/**\n * Map of method names to their handlers\n */\nexport interface BridgeHandlers {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: BridgeHandler<any, any>;\n}\n\n/**\n * Listener function for bridge result events\n */\nexport type BridgeListener = (result: BridgeResultEvent) => void;\n\n/**\n * Options for bridge initialization\n */\nexport interface BridgeOptions {\n /** Timeout for method execution in milliseconds (default: 100000) */\n timeout?: number;\n}\n","import type {\n BridgeData,\n BridgeEvent,\n BridgeHandlers,\n BridgeInitEvent,\n BridgeInitResultEvent,\n BridgeListener,\n BridgeOptions,\n BridgeRequestEvent,\n BridgeResultData,\n BridgeResultError,\n BridgeResultEvent,\n} from './types';\nimport {\n BridgeErrorType,\n BridgeEventType,\n BridgeResultType,\n} from './types';\n\n/**\n * Creates a bridge event with the specified type and data\n */\nexport const internalEvent = (\n type: BridgeEventType,\n data: BridgeData\n): BridgeEvent => ({\n type,\n data,\n});\n\n/**\n * Creates a result event\n */\nexport const internalResultEvent = (data: BridgeData): BridgeEvent =>\n internalEvent(BridgeEventType.Result, data);\n\ninterface InternalRequestPromise {\n reject: (error: BridgeResultError) => void;\n resolve: (result: BridgeResultData) => void;\n}\n\ninterface InitPromise {\n reject: () => void;\n resolve: (success: boolean) => void;\n}\n\ntype InternalEventSender = (event: BridgeEvent) => void;\n\nconst DEFAULT_TIMEOUT = 100000;\n\n/**\n * BridgeInternal handles the business logic of the bridge protocol.\n * It manages request/response lifecycle, handler registration, and event routing.\n */\nexport class BridgeInternal {\n private requests: InternalRequestPromise[] = [];\n private handlers: BridgeHandlers = {};\n private available = false;\n private supportedMethods: string[] = [];\n private listeners: BridgeListener[] = [];\n private initPromise?: InitPromise;\n private readonly sendEvent: InternalEventSender;\n private readonly timeout: number;\n\n constructor(sendEvent: InternalEventSender, options?: BridgeOptions) {\n this.sendEvent = sendEvent;\n this.timeout = options?.timeout ?? DEFAULT_TIMEOUT;\n }\n\n /**\n * Reset bridge state for a new connection context.\n * Call this when the remote side has changed (e.g., new popup window).\n */\n public reset = (): void => {\n this.handlers = {};\n this.available = false;\n this.supportedMethods = [];\n this.initPromise = undefined;\n };\n\n /**\n * Subscribe to all result events\n */\n public subscribe = (listener: BridgeListener): number => {\n return this.listeners.push(listener);\n };\n\n /**\n * Unsubscribe from result events\n */\n public unsubscribe = (listener: BridgeListener): void => {\n this.listeners = this.listeners.filter(\n (oldListener) => oldListener !== listener\n );\n };\n\n private checkDiff = (a: string[], b: string[]): boolean => {\n return (\n a.filter((x) => !b.includes(x)).length > 0 ||\n b.filter((x) => !a.includes(x)).length > 0\n );\n };\n\n /**\n * Initialize the bridge with handlers\n * @param handlers Map of method names to handler functions\n * @returns Promise that resolves when the other side acknowledges\n */\n public init = (handlers: BridgeHandlers = {}): Promise<boolean> => {\n const oldMethods = Object.keys(this.handlers);\n const newMethods = Object.keys(handlers);\n this.handlers = handlers;\n if (!this.checkDiff(oldMethods, newMethods)) {\n return Promise.resolve(true);\n }\n return new Promise((resolve, reject) => {\n this.initPromise = { resolve, reject };\n this.sendEvent(\n internalEvent(BridgeEventType.Init, {\n methods: newMethods,\n })\n );\n });\n };\n\n /**\n * Handle incoming bridge events\n */\n public handleCoreEvent = (event: BridgeEvent): void => {\n const { type, data } = event;\n switch (type) {\n case BridgeEventType.Init:\n this.handleInit(data as BridgeInitEvent);\n break;\n case BridgeEventType.InitResult:\n this.handleInitResult(data as BridgeInitResultEvent);\n break;\n case BridgeEventType.Request:\n this.handleRequest(data as BridgeRequestEvent);\n break;\n case BridgeEventType.Result:\n this.handleResult(data as BridgeResultEvent);\n break;\n }\n };\n\n /**\n * Handle incoming requests and execute the appropriate handler\n */\n public handleRequest = (request: BridgeRequestEvent): void => {\n const { method, params, request_id } = request;\n new Promise<BridgeResultData>((resolve, reject) => {\n let timeout = false;\n if (!Object.prototype.hasOwnProperty.call(this.handlers, method)) {\n reject({\n error_type: BridgeErrorType.UNSUPPORTED_METHOD,\n error: new Error(`Handler for «${method}» is not registered`),\n });\n return;\n }\n const timer = setTimeout(() => {\n timeout = true;\n reject({\n error_type: BridgeErrorType.METHOD_EXECUTION_TIMEOUT,\n error: new Error('Execution timeout exceeded'),\n });\n }, this.timeout);\n const handler = this.handlers[method];\n if (!handler) {\n reject({\n error_type: BridgeErrorType.UNSUPPORTED_METHOD,\n error: new Error(`Handler for «${method}» is undefined`),\n });\n return;\n }\n handler(params)\n .then((result) => {\n if (timeout) {\n return;\n }\n clearTimeout(timer);\n resolve(result as BridgeResultData);\n })\n .catch((error: Error) => {\n if (timeout) {\n return;\n }\n clearTimeout(timer);\n reject({\n error_type: BridgeErrorType.REJECTED,\n error: error,\n });\n });\n })\n .then((data: BridgeResultData) => {\n this.sendEvent(\n internalResultEvent({\n type: BridgeResultType.Success,\n data,\n method,\n request_id,\n })\n );\n })\n .catch(\n ({\n error_type,\n error,\n }: {\n error_type: BridgeErrorType;\n error: Error;\n }) => {\n this.sendEvent(\n internalResultEvent({\n type: BridgeResultType.Error,\n request_id,\n method,\n data: {\n error_message: error.message,\n error_type,\n },\n })\n );\n }\n );\n };\n\n private handleResult = (result: BridgeResultEvent): void => {\n this.handleRequestResult(result);\n this.listeners.forEach((listener) => listener(result));\n };\n\n private handleRequestResult = (result: BridgeResultEvent): void => {\n if (!result || !Object.prototype.hasOwnProperty.call(result, 'request_id')) {\n return;\n }\n if (!Object.prototype.hasOwnProperty.call(result, 'type')) {\n console.warn('unknown result', result);\n return;\n }\n const { request_id, data, type } = result;\n const request = this.requests[Number(request_id)];\n if (!request) {\n return;\n }\n if (type === BridgeResultType.Success) {\n request.resolve(data);\n return;\n }\n if (type === BridgeResultType.Error) {\n request.reject(data as BridgeResultError);\n }\n };\n\n private handleInit = (data: BridgeInitEvent): void => {\n this.available = true;\n this.supportedMethods = data.methods;\n this.sendEvent(internalEvent(BridgeEventType.InitResult, true));\n };\n\n private handleInitResult = (success: BridgeInitResultEvent): void => {\n if (success) {\n this.initPromise?.resolve(true);\n } else {\n this.initPromise?.reject();\n }\n };\n\n /**\n * Send a request to the other side\n * @param method Method name to invoke\n * @param params Parameters to pass to the method\n * @returns Promise that resolves with the result\n */\n public send = <TResult = unknown>(\n method: string,\n params: object\n ): Promise<TResult> =>\n new Promise((resolve, reject) => {\n const request_id = (\n this.requests.push({ resolve: resolve as (result: BridgeResultData) => void, reject }) - 1\n ).toString();\n if (!this.isAvailable()) {\n this.handleCoreEvent(\n internalResultEvent({\n type: BridgeResultType.Error,\n request_id,\n method,\n data: {\n error_message: 'Bridge is not available',\n error_type: BridgeErrorType.BRIDGE_NOT_AVAILABLE,\n },\n })\n );\n return;\n }\n this.sendEvent(\n internalEvent(BridgeEventType.Request, {\n method,\n params,\n request_id,\n })\n );\n });\n\n /**\n * Check if a method is supported by the other side\n */\n public supports = (method: string): boolean =>\n this.supportedMethods.includes(method);\n\n /**\n * Check if the bridge is available (initialized)\n */\n public isAvailable = (): boolean => this.available;\n}\n","import type { BridgeHandlers, BridgeListener } from './types';\nimport type { BridgeInternal } from './BridgeInternal';\n\n/**\n * BridgeBase provides the public API for bridge communication.\n * It wraps BridgeInternal and exposes a clean interface for consumers.\n */\nexport class BridgeBase {\n protected bridge: BridgeInternal;\n\n constructor(bridge: BridgeInternal) {\n this.bridge = bridge;\n }\n\n /**\n * Check if a method is supported by the other side\n * @param method Method name to check\n */\n public supports = (method: string): boolean => this.bridge.supports(method);\n\n /**\n * Check if the bridge is available (initialized)\n */\n public isAvailable = (): boolean => this.bridge.isAvailable();\n\n /**\n * Send a request to invoke a method on the other side\n * @param method Method name to invoke\n * @param params Parameters to pass\n * @returns Promise resolving with the result\n */\n public send = <TResult = unknown>(\n method: string,\n params: object = {}\n ): Promise<TResult> => {\n return this.bridge.send<TResult>(method, params);\n };\n\n /**\n * Subscribe to all result events\n * @param listener Callback for result events\n * @returns Subscription index\n */\n public subscribe = (listener: BridgeListener): number => {\n return this.bridge.subscribe(listener);\n };\n\n /**\n * Unsubscribe from result events\n * @param listener The listener to remove\n */\n public unsubscribe = (listener: BridgeListener): void => {\n return this.bridge.unsubscribe(listener);\n };\n\n /**\n * Initialize the bridge with handlers\n * @param handlers Map of method names to handler functions\n * @returns Promise resolving when initialization is complete\n */\n public init = (handlers?: BridgeHandlers): Promise<boolean> =>\n this.bridge.init(handlers);\n\n /**\n * Reset bridge state for a new connection context\n */\n public reset = (): void => this.bridge.reset();\n}\n","import { BridgeCore } from './BridgeCore';\nimport { BridgeInternal } from './BridgeInternal';\nimport { BridgeBase } from './BridgeBase';\nimport type { BridgeOptions } from './types';\n\n/**\n * AspectlyBridge is the main entry point for bridge communication.\n * Use this class when running inside a WebView or iframe that needs\n * to communicate with its parent container.\n *\n * @example\n * ```typescript\n * // Inside a WebView or iframe\n * const bridge = new AspectlyBridge();\n *\n * // Initialize with handlers\n * await bridge.init({\n * greet: async (params) => {\n * return { message: `Hello, ${params.name}!` };\n * }\n * });\n *\n * // Send messages to parent\n * const result = await bridge.send('someMethod', { data: 'value' });\n * ```\n */\nexport class AspectlyBridge extends BridgeBase {\n private cleanupSubscription: VoidFunction;\n\n constructor(options?: BridgeOptions) {\n const bridge = new BridgeInternal(BridgeCore.sendEvent, options);\n super(bridge);\n this.cleanupSubscription = BridgeCore.subscribe(\n bridge.handleCoreEvent as (event: unknown) => void\n );\n }\n\n /**\n * Cleanup bridge subscriptions\n */\n public destroy = (): void => {\n this.cleanupSubscription();\n };\n}\n"]}
package/dist/index.mjs CHANGED
@@ -1,7 +1,38 @@
1
+ import { detectTransport } from '@aspectly/transports';
2
+ export { CefSharpTransport, IframeTransport, NullTransport, ReactNativeTransport, TransportRegistry, detectTransport, registerTransport } from '@aspectly/transports';
3
+
1
4
  // src/BridgeCore.ts
2
5
  var _BridgeCore = class _BridgeCore {
6
+ /**
7
+ * Get the current transport (lazy initialization)
8
+ */
9
+ static getTransport() {
10
+ if (!_BridgeCore.transport) {
11
+ _BridgeCore.transport = detectTransport();
12
+ }
13
+ return _BridgeCore.transport;
14
+ }
15
+ /**
16
+ * Set a custom transport (useful for testing or manual configuration)
17
+ */
18
+ static setTransport(transport) {
19
+ _BridgeCore.transport = transport;
20
+ }
21
+ /**
22
+ * Reset transport to auto-detect on next use
23
+ */
24
+ static resetTransport() {
25
+ _BridgeCore.transport = null;
26
+ }
27
+ /**
28
+ * Get the name of the current transport
29
+ */
30
+ static getTransportName() {
31
+ return _BridgeCore.getTransport().name;
32
+ }
3
33
  };
4
34
  _BridgeCore.BRIDGE_EVENT_TYPE = "BridgeEvent";
35
+ _BridgeCore.transport = null;
5
36
  _BridgeCore.isJSONObject = (str) => {
6
37
  return str.startsWith("{") && str.endsWith("}");
7
38
  };
@@ -41,60 +72,21 @@ _BridgeCore.wrapListener = (listener) => (data) => {
41
72
  }
42
73
  };
43
74
  /**
44
- * Creates a browser-specific message event listener
45
- */
46
- _BridgeCore.browserListener = (listener) => {
47
- const triggerEvent = _BridgeCore.wrapListener(listener);
48
- return (originalEvent) => {
49
- if (!originalEvent?.data) {
50
- return;
51
- }
52
- triggerEvent(originalEvent.data);
53
- };
54
- };
55
- /**
56
- * Creates a React Native WebView message listener
57
- */
58
- _BridgeCore.webViewListener = (listener) => {
59
- const triggerEvent = _BridgeCore.wrapListener(listener);
60
- return (originalEvent) => {
61
- if (!originalEvent?.nativeEvent?.data) {
62
- return;
63
- }
64
- triggerEvent(originalEvent.nativeEvent.data);
65
- };
66
- };
67
- /**
68
- * Sends an event to the parent context (WebView or iframe parent)
75
+ * Sends an event to the parent context using the detected transport
69
76
  */
70
77
  _BridgeCore.sendEvent = (event) => {
71
78
  const bridgeEvent = _BridgeCore.wrapBridgeEvent(event);
72
- if (typeof window === "undefined") {
73
- console.warn("Window is undefined");
74
- return;
75
- }
76
- const RNW = window.ReactNativeWebView;
77
- if (typeof RNW?.postMessage === "function") {
78
- RNW.postMessage(`'${bridgeEvent}'`);
79
- return;
80
- }
81
- if (window.parent === window) {
82
- return;
83
- }
84
- window.parent.postMessage(bridgeEvent, "*");
79
+ const transport = _BridgeCore.getTransport();
80
+ transport.send(bridgeEvent);
85
81
  };
86
82
  /**
87
- * Subscribes to window message events
83
+ * Subscribes to incoming messages via the detected transport
88
84
  * @returns Cleanup function to unsubscribe
89
85
  */
90
86
  _BridgeCore.subscribe = (listener) => {
91
- const browserListener = _BridgeCore.browserListener(listener);
92
- if (typeof window === "undefined" || !window.addEventListener) {
93
- return () => {
94
- };
95
- }
96
- window.addEventListener("message", browserListener);
97
- return () => window.removeEventListener("message", browserListener);
87
+ const transport = _BridgeCore.getTransport();
88
+ const wrappedListener = _BridgeCore.wrapListener(listener);
89
+ return transport.subscribe(wrappedListener);
98
90
  };
99
91
  var BridgeCore = _BridgeCore;
100
92
 
@@ -133,6 +125,16 @@ var BridgeInternal = class {
133
125
  this.available = false;
134
126
  this.supportedMethods = [];
135
127
  this.listeners = [];
128
+ /**
129
+ * Reset bridge state for a new connection context.
130
+ * Call this when the remote side has changed (e.g., new popup window).
131
+ */
132
+ this.reset = () => {
133
+ this.handlers = {};
134
+ this.available = false;
135
+ this.supportedMethods = [];
136
+ this.initPromise = void 0;
137
+ };
136
138
  /**
137
139
  * Subscribe to all result events
138
140
  */
@@ -386,6 +388,10 @@ var BridgeBase = class {
386
388
  * @returns Promise resolving when initialization is complete
387
389
  */
388
390
  this.init = (handlers) => this.bridge.init(handlers);
391
+ /**
392
+ * Reset bridge state for a new connection context
393
+ */
394
+ this.reset = () => this.bridge.reset();
389
395
  this.bridge = bridge;
390
396
  }
391
397
  };