@schoolpalm/message-bridge 1.2.0 → 1.3.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.
@@ -1,23 +1,18 @@
1
1
  import { MessageType } from './messageTypes';
2
- import { MessagePayload } from './payloadSchemas';
3
- /** Type definition for message handler functions */
4
- type MessageHandler<T extends MessagePayload> = (payload: T) => void;
5
- /**
6
- * Base class for Host and Module bridges.
7
- *
8
- * Handles sending, receiving, and dispatching messages via postMessage,
9
- * with type-safe payloads, origin validation, and optional request/response support.
10
- */
2
+ import { MessagePayloadMap } from './payloadSchemas';
3
+ import { RequestPayload } from './payloadSchemas';
4
+ type MessageHandler<T> = (payload: T) => void;
11
5
  export declare class BridgeBase {
12
6
  protected targetWindow: Window;
13
7
  protected targetOrigin: string;
14
8
  private listeners;
15
9
  private pendingRequests;
10
+ private boundHandler;
16
11
  constructor(targetWindow: Window, targetOrigin?: string);
17
- send<T extends MessagePayload>(type: MessageType, payload: T): void;
18
- request<T = any, R = any>(type: MessageType, payload?: T, timeout?: number): Promise<R>;
19
- on<T extends MessagePayload>(type: MessageType, callback: MessageHandler<T>): void;
20
- protected _handleMessage(event: MessageEvent): void;
12
+ send<T extends MessageType>(type: T, payload: MessagePayloadMap[T]): void;
13
+ request<R = any>(type: MessageType, payload: RequestPayload, timeout?: number): Promise<R>;
14
+ on<T extends MessageType>(type: T, callback: MessageHandler<MessagePayloadMap[T]>): void;
15
+ protected handleMessage(event: MessageEvent): void;
21
16
  destroy(): void;
22
17
  }
23
18
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"bridgeBase.d.ts","sourceRoot":"","sources":["../src/bridgeBase.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,cAAc,EAAmC,MAAM,kBAAkB,CAAA;AAElF,oDAAoD;AACpD,KAAK,cAAc,CAAC,CAAC,SAAS,cAAc,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,CAAA;AAEpE;;;;;GAKG;AACH,qBAAa,UAAU;IACrB,SAAS,CAAC,YAAY,EAAE,MAAM,CAAA;IAC9B,SAAS,CAAC,YAAY,EAAE,MAAM,CAAA;IAC9B,OAAO,CAAC,SAAS,CAAqD;IACtE,OAAO,CAAC,eAAe,CAAiD;gBAE5D,YAAY,EAAE,MAAM,EAAE,YAAY,GAAE,MAAY;IAO5D,IAAI,CAAC,CAAC,SAAS,cAAc,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;IAK5D,OAAO,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,OAAO,SAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAiBrF,EAAE,CAAC,CAAC,SAAS,cAAc,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC;IAK3E,SAAS,CAAC,cAAc,CAAC,KAAK,EAAE,YAAY;IAwB5C,OAAO;CAKR"}
1
+ {"version":3,"file":"bridgeBase.d.ts","sourceRoot":"","sources":["../src/bridgeBase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,cAAc,EAAmB,MAAM,kBAAkB,CAAA;AAElE,KAAK,cAAc,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,CAAA;AAE7C,qBAAa,UAAU;IACrB,SAAS,CAAC,YAAY,EAAE,MAAM,CAAA;IAC9B,SAAS,CAAC,YAAY,EAAE,MAAM,CAAA;IAE9B,OAAO,CAAC,SAAS,CAAgD;IACjE,OAAO,CAAC,eAAe,CAA4C;IACnE,OAAO,CAAC,YAAY,CAA+B;gBAEvC,YAAY,EAAE,MAAM,EAAE,YAAY,GAAE,MAAY;IAW5D,IAAI,CAAC,CAAC,SAAS,WAAW,EACxB,IAAI,EAAE,CAAC,EACP,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAQhC,OAAO,CAAC,CAAC,GAAG,GAAG,EACd,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,cAAc,EACvB,OAAO,SAAO,GACb,OAAO,CAAC,CAAC,CAAC;IA2BX,EAAE,CAAC,CAAC,SAAS,WAAW,EACtB,IAAI,EAAE,CAAC,EACP,QAAQ,EAAE,cAAc,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAWhD,SAAS,CAAC,aAAa,CAAC,KAAK,EAAE,YAAY;IAqB3C,OAAO;CAKR"}
@@ -1,67 +1,75 @@
1
- // src/bridgeBase.ts
2
1
  import { MessageType } from './messageTypes';
3
- /**
4
- * Base class for Host and Module bridges.
5
- *
6
- * Handles sending, receiving, and dispatching messages via postMessage,
7
- * with type-safe payloads, origin validation, and optional request/response support.
8
- */
9
2
  export class BridgeBase {
10
3
  constructor(targetWindow, targetOrigin = '*') {
11
4
  this.listeners = new Map();
12
5
  this.pendingRequests = new Map();
13
6
  this.targetWindow = targetWindow;
14
7
  this.targetOrigin = targetOrigin;
15
- window.addEventListener('message', this._handleMessage.bind(this));
8
+ this.boundHandler = this.handleMessage.bind(this);
9
+ window.addEventListener('message', this.boundHandler);
16
10
  }
17
- // ---------- Send messages ----------
11
+ // --------------------
12
+ // Send (typed)
13
+ // --------------------
18
14
  send(type, payload) {
19
15
  this.targetWindow.postMessage({ type, payload }, this.targetOrigin);
20
16
  }
21
- // ---------- Request/Response ----------
17
+ // --------------------
18
+ // Request / Response
19
+ // --------------------
22
20
  request(type, payload, timeout = 5000) {
23
21
  return new Promise((resolve, reject) => {
24
- const requestId = crypto.randomUUID();
25
- this.pendingRequests.set(requestId, resolve);
26
- this.send(MessageType.DATA_REQUEST, { requestId, type, payload });
22
+ const requestId = payload.requestId;
23
+ this.pendingRequests.set(requestId, (response) => {
24
+ if (response.status === 'error') {
25
+ reject(new Error(response.error ?? 'Unknown error'));
26
+ }
27
+ else {
28
+ resolve(response.payload);
29
+ }
30
+ });
31
+ this.send(type, payload);
27
32
  setTimeout(() => {
28
33
  if (this.pendingRequests.has(requestId)) {
29
34
  this.pendingRequests.delete(requestId);
30
- reject(new Error(`Request ${type} timed out`));
35
+ reject(new Error(`Request ${payload.type} timed out`));
31
36
  }
32
37
  }, timeout);
33
38
  });
34
39
  }
35
- // ---------- Event handling ----------
40
+ // --------------------
41
+ // Listeners (typed)
42
+ // --------------------
36
43
  on(type, callback) {
37
- if (!this.listeners.has(type))
44
+ if (!this.listeners.has(type)) {
38
45
  this.listeners.set(type, []);
39
- this.listeners.get(type)?.push(callback);
46
+ }
47
+ this.listeners.get(type).push(callback);
40
48
  }
41
- _handleMessage(event) {
42
- // Strict origin check
49
+ // --------------------
50
+ // Dispatcher
51
+ // --------------------
52
+ handleMessage(event) {
43
53
  if (this.targetOrigin !== '*' && event.origin !== this.targetOrigin)
44
54
  return;
45
55
  const { type, payload } = event.data || {};
46
56
  if (!type)
47
57
  return;
48
- // Handle DATA_RESPONSE automatically
49
- if (type === MessageType.DATA_RESPONSE && payload?.requestId) {
50
- const resolver = this.pendingRequests.get(payload.requestId);
58
+ // Handle responses
59
+ if (type === MessageType.DATA_RESPONSE) {
60
+ const response = payload;
61
+ const resolver = this.pendingRequests.get(response.requestId);
51
62
  if (resolver) {
52
- resolver(payload);
53
- this.pendingRequests.delete(payload.requestId);
63
+ resolver(response);
64
+ this.pendingRequests.delete(response.requestId);
54
65
  return;
55
66
  }
56
67
  }
57
- // Dispatch to listeners
58
- if (this.listeners.has(type)) {
59
- this.listeners.get(type)?.forEach(cb => cb(payload));
60
- }
68
+ const handlers = this.listeners.get(type);
69
+ handlers?.forEach(cb => cb(payload));
61
70
  }
62
- // ---------- Cleanup ----------
63
71
  destroy() {
64
- window.removeEventListener('message', this._handleMessage.bind(this));
72
+ window.removeEventListener('message', this.boundHandler);
65
73
  this.listeners.clear();
66
74
  this.pendingRequests.clear();
67
75
  }
@@ -1 +1 @@
1
- {"version":3,"file":"bridgeBase.js","sourceRoot":"","sources":["../src/bridgeBase.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bridgeBase.js","sourceRoot":"","sources":["../src/bridgeBase.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare class BridgeError extends Error {
2
+ code: string;
3
+ constructor(message: string, code: string);
4
+ }
5
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,WAAY,SAAQ,KAAK;IACA,IAAI,EAAE,MAAM;gBAApC,OAAO,EAAE,MAAM,EAAS,IAAI,EAAE,MAAM;CAGjD"}
package/dist/errors.js ADDED
@@ -0,0 +1,7 @@
1
+ export class BridgeError extends Error {
2
+ constructor(message, code) {
3
+ super(message);
4
+ this.code = code;
5
+ }
6
+ }
7
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,WAAY,SAAQ,KAAK;IACpC,YAAY,OAAe,EAAS,IAAY;QAC9C,KAAK,CAAC,OAAO,CAAC,CAAA;QADoB,SAAI,GAAJ,IAAI,CAAQ;IAEhD,CAAC;CACF"}
@@ -1,14 +1,16 @@
1
1
  import { BridgeBase } from './bridgeBase';
2
2
  import { ModuleStartPayload, UIUpdatePayload, ErrorPayload, ModuleContextPayload, HandshakeReadyPayload } from './payloadSchemas';
3
- /**
4
- * HostBridge: communication from Host → Module iframe
5
- */
6
3
  export declare class HostBridge extends BridgeBase {
4
+ private handshakeCompleted;
5
+ private handshakePayload;
6
+ private pendingStartPayload;
7
7
  constructor(iframe: HTMLIFrameElement, targetOrigin?: string);
8
8
  onHandshakeReady(callback: (payload: HandshakeReadyPayload) => void): void;
9
- /**
10
- * Start module safely after handshake
11
- */
9
+ private heartbeatTimer?;
10
+ startHeartbeat(interval?: number): void;
11
+ stopHeartbeat(): void;
12
+ private lastHeartbeat;
13
+ listenHeartbeat(timeout?: number): void;
12
14
  startModule(payload: ModuleStartPayload, timeout?: number): void;
13
15
  sendModuleStart(payload: ModuleStartPayload): void;
14
16
  sendModuleExit(reason?: string): void;
@@ -16,5 +18,6 @@ export declare class HostBridge extends BridgeBase {
16
18
  onError(callback: (payload: ErrorPayload) => void): void;
17
19
  sendContextUpdate(payload: ModuleContextPayload): void;
18
20
  requestData<T = any, R = any>(type: string, payload?: T, timeout?: number): Promise<R>;
21
+ reset(): void;
19
22
  }
20
23
  //# sourceMappingURL=hostBridge.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"hostBridge.d.ts","sourceRoot":"","sources":["../src/hostBridge.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAEzC,OAAO,EACL,kBAAkB,EAElB,eAAe,EACf,YAAY,EACZ,oBAAoB,EACpB,qBAAqB,EAEtB,MAAM,kBAAkB,CAAA;AAEzB;;GAEG;AACH,qBAAa,UAAW,SAAQ,UAAU;gBAC5B,MAAM,EAAE,iBAAiB,EAAE,YAAY,GAAE,MAAY;IAQjE,gBAAgB,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,qBAAqB,KAAK,IAAI;IAInE;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,kBAAkB,EAAE,OAAO,GAAE,MAAa;IAY/D,eAAe,CAAC,OAAO,EAAE,kBAAkB;IAI3C,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM;IAK9B,UAAU,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI;IAIvD,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI;IAKjD,iBAAiB,CAAC,OAAO,EAAE,oBAAoB;IAKhD,WAAW,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,OAAO,SAAO,GAAG,OAAO,CAAC,CAAC,CAAC;CASpF"}
1
+ {"version":3,"file":"hostBridge.d.ts","sourceRoot":"","sources":["../src/hostBridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAEzC,OAAO,EACL,kBAAkB,EAElB,eAAe,EACf,YAAY,EACZ,oBAAoB,EACpB,qBAAqB,EAGtB,MAAM,kBAAkB,CAAA;AAGzB,qBAAa,UAAW,SAAQ,UAAU;IACxC,OAAO,CAAC,kBAAkB,CAAQ;IAClC,OAAO,CAAC,gBAAgB,CAAqC;IAC7D,OAAO,CAAC,mBAAmB,CAAkC;gBAEjD,MAAM,EAAE,iBAAiB,EAAE,YAAY,GAAE,MAAY;IAUnE,gBAAgB,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,qBAAqB,KAAK,IAAI;IA2BnE,OAAO,CAAC,cAAc,CAAC,CAAQ;IAE/B,cAAc,CAAC,QAAQ,SAAO;IAS9B,aAAa;IAOb,OAAO,CAAC,aAAa,CAAa;IAElC,eAAe,CAAC,OAAO,SAAQ;IAiB7B,WAAW,CAAC,OAAO,EAAE,kBAAkB,EAAE,OAAO,SAAO;IAevD,eAAe,CAAC,OAAO,EAAE,kBAAkB;IAI3C,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM;IAO9B,UAAU,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI;IAIvD,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI;IAOjD,iBAAiB,CAAC,OAAO,EAAE,oBAAoB;IAOhD,WAAW,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAC3B,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,CAAC,EACX,OAAO,SAAO,GACb,OAAO,CAAC,CAAC,CAAC;IAiBX,KAAK;CAKN"}
@@ -1,58 +1,115 @@
1
- // src/hostBridge.ts
2
1
  import { BridgeBase } from './bridgeBase';
3
2
  import { MessageType } from './messageTypes';
4
- /**
5
- * HostBridge: communication from Host → Module iframe
6
- */
3
+ import { PROTOCOL_VERSION } from './protocol';
7
4
  export class HostBridge extends BridgeBase {
8
5
  constructor(iframe, targetOrigin = '*') {
9
6
  if (!iframe.contentWindow) {
10
7
  throw new Error('Iframe has no contentWindow');
11
8
  }
12
9
  super(iframe.contentWindow, targetOrigin);
10
+ this.handshakeCompleted = false;
11
+ this.handshakePayload = null;
12
+ this.pendingStartPayload = null;
13
+ this.lastHeartbeat = Date.now();
13
14
  }
14
- // ---------- Lifecycle / handshake ----------
15
+ // --------------------
16
+ // Handshake (sticky)
17
+ // --------------------
15
18
  onHandshakeReady(callback) {
16
- this.on(MessageType.HANDSHAKE_READY, callback);
19
+ if (this.handshakeCompleted && this.handshakePayload) {
20
+ callback(this.handshakePayload);
21
+ return;
22
+ }
23
+ this.on(MessageType.HANDSHAKE_READY, payload => {
24
+ // ✅ payload is HandshakeReadyPayload
25
+ if (payload.version !== PROTOCOL_VERSION) {
26
+ console.warn(`Protocol mismatch: host=${PROTOCOL_VERSION}, module=${payload.version}`);
27
+ }
28
+ this.handshakeCompleted = true;
29
+ this.handshakePayload = payload;
30
+ callback(payload);
31
+ if (this.pendingStartPayload) {
32
+ this.sendModuleStart(this.pendingStartPayload);
33
+ this.pendingStartPayload = null;
34
+ }
35
+ });
17
36
  }
18
- /**
19
- * Start module safely after handshake
20
- */
37
+ startHeartbeat(interval = 5000) {
38
+ this.stopHeartbeat();
39
+ this.heartbeatTimer = window.setInterval(() => {
40
+ this.send(MessageType.HEARTBEAT, { timestamp: Date.now() });
41
+ }, interval);
42
+ }
43
+ stopHeartbeat() {
44
+ if (this.heartbeatTimer) {
45
+ clearInterval(this.heartbeatTimer);
46
+ this.heartbeatTimer = undefined;
47
+ }
48
+ }
49
+ listenHeartbeat(timeout = 15000) {
50
+ this.on(MessageType.HEARTBEAT, () => {
51
+ this.lastHeartbeat = Date.now();
52
+ });
53
+ setInterval(() => {
54
+ if (Date.now() - this.lastHeartbeat > timeout) {
55
+ console.error('Module heartbeat lost');
56
+ this.sendModuleExit('heartbeat-timeout');
57
+ }
58
+ }, timeout);
59
+ }
60
+ // --------------------
61
+ // Start (idempotent)
62
+ // --------------------
21
63
  startModule(payload, timeout = 5000) {
64
+ if (this.handshakeCompleted) {
65
+ this.sendModuleStart(payload);
66
+ return;
67
+ }
68
+ this.pendingStartPayload = payload;
22
69
  const timer = setTimeout(() => {
23
70
  console.error('Module handshake timeout');
24
71
  }, timeout);
25
- this.onHandshakeReady(() => {
26
- clearTimeout(timer);
27
- this.sendModuleStart(payload);
28
- });
72
+ this.onHandshakeReady(() => clearTimeout(timer));
29
73
  }
30
- // ---------- Module control ----------
31
74
  sendModuleStart(payload) {
32
75
  this.send(MessageType.MODULE_START, payload);
33
76
  }
34
77
  sendModuleExit(reason) {
35
78
  this.send(MessageType.MODULE_EXIT, { reason });
36
79
  }
37
- // ---------- UI events ----------
80
+ // --------------------
81
+ // UI / Errors
82
+ // --------------------
38
83
  onUIUpdate(callback) {
39
84
  this.on(MessageType.UI_UPDATE, callback);
40
85
  }
41
86
  onError(callback) {
42
87
  this.on(MessageType.ERROR, callback);
43
88
  }
44
- // ---------- Context / theme sync ----------
89
+ // --------------------
90
+ // Context sync
91
+ // --------------------
45
92
  sendContextUpdate(payload) {
46
93
  this.send(MessageType.CONTEXT_UPDATE, payload);
47
94
  }
48
- // ---------- Request / response ----------
95
+ // --------------------
96
+ // Requests
97
+ // --------------------
49
98
  requestData(type, payload, timeout = 5000) {
50
- const requestPayload = {
99
+ const request = {
51
100
  requestId: crypto.randomUUID(),
52
101
  type,
53
- payload: payload
102
+ payload: payload,
54
103
  };
55
- return this.request(MessageType.DATA_REQUEST, requestPayload, timeout);
104
+ return this.request(MessageType.DATA_REQUEST, request, timeout);
105
+ }
106
+ // --------------------
107
+ // Reset (reconnect)
108
+ // --------------------
109
+ reset() {
110
+ this.handshakeCompleted = false;
111
+ this.handshakePayload = null;
112
+ this.pendingStartPayload = null;
56
113
  }
57
114
  }
58
115
  //# sourceMappingURL=hostBridge.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hostBridge.js","sourceRoot":"","sources":["../src/hostBridge.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAW5C;;GAEG;AACH,MAAM,OAAO,UAAW,SAAQ,UAAU;IACxC,YAAY,MAAyB,EAAE,eAAuB,GAAG;QAC/D,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;QAChD,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,aAAa,EAAE,YAAY,CAAC,CAAA;IAC3C,CAAC;IAED,8CAA8C;IAC9C,gBAAgB,CAAC,QAAkD;QACjE,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAA;IAChD,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,OAA2B,EAAE,UAAkB,IAAI;QAC7D,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAA;QAC3C,CAAC,EAAE,OAAO,CAAC,CAAA;QAEX,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE;YACzB,YAAY,CAAC,KAAK,CAAC,CAAA;YACnB,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAA;QAC/B,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,uCAAuC;IACvC,eAAe,CAAC,OAA2B;QACzC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;IAC9C,CAAC;IAED,cAAc,CAAC,MAAe;QAC5B,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,EAAE,MAAM,EAAuB,CAAC,CAAA;IACrE,CAAC;IAED,kCAAkC;IAClC,UAAU,CAAC,QAA4C;QACrD,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;IAC1C,CAAC;IAED,OAAO,CAAC,QAAyC;QAC/C,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;IACtC,CAAC;IAED,6CAA6C;IAC7C,iBAAiB,CAAC,OAA6B;QAC7C,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,OAAO,CAAC,CAAA;IAChD,CAAC;IAED,2CAA2C;IAC5C,WAAW,CAAmB,IAAY,EAAE,OAAW,EAAE,OAAO,GAAG,IAAI;QACtE,MAAM,cAAc,GAAmB;YACrC,SAAS,EAAE,MAAM,CAAC,UAAU,EAAE;YAC9B,IAAI;YACJ,OAAO,EAAE,OAAc;SACxB,CAAA;QACD,OAAO,IAAI,CAAC,OAAO,CAAoB,WAAW,CAAC,YAAY,EAAE,cAAc,EAAE,OAAO,CAAC,CAAA;IAC3F,CAAC;CAEA"}
1
+ {"version":3,"file":"hostBridge.js","sourceRoot":"","sources":["../src/hostBridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const debug: (...args: any[]) => void;
2
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,KAAK,GAAI,GAAG,MAAM,GAAG,EAAE,SAGnC,CAAA"}
package/dist/logger.js ADDED
@@ -0,0 +1,4 @@
1
+ export const debug = (...args) => {
2
+ console.debug('[MessageBridge]', ...args);
3
+ };
4
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,GAAG,IAAW,EAAE,EAAE;IACpC,OAAO,CAAC,KAAK,CAAC,iBAAiB,EAAE,GAAG,IAAI,CAAC,CAAA;AAE7C,CAAC,CAAA"}
@@ -34,6 +34,7 @@ export declare enum MessageType {
34
34
  ERROR = "error",
35
35
  /** Host → Module: Signals the module to exit and clean up. */
36
36
  MODULE_EXIT = "module:exit",
37
- CONTEXT_UPDATE = "context:update"
37
+ CONTEXT_UPDATE = "context:update",
38
+ HEARTBEAT = "heartbeat"
38
39
  }
39
40
  //# sourceMappingURL=messageTypes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"messageTypes.d.ts","sourceRoot":"","sources":["../src/messageTypes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;;;;;;;;;;;;;;GAgBG;AACH,oBAAY,WAAW;IACrB,sEAAsE;IACtE,eAAe,oBAAoB;IACnC,wEAAwE;IACxE,YAAY,iBAAiB;IAC7B,qEAAqE;IACrE,SAAS,cAAc;IACvB,kDAAkD;IAClD,YAAY,iBAAiB;IAC7B,iDAAiD;IACjD,aAAa,kBAAkB;IAC/B,mDAAmD;IACnD,KAAK,UAAU;IACf,8DAA8D;IAC9D,WAAW,gBAAgB;IAC3B,cAAc,mBAAmB;CAClC"}
1
+ {"version":3,"file":"messageTypes.d.ts","sourceRoot":"","sources":["../src/messageTypes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;;;;;;;;;;;;;;GAgBG;AACH,oBAAY,WAAW;IACrB,sEAAsE;IACtE,eAAe,oBAAoB;IACnC,wEAAwE;IACxE,YAAY,iBAAiB;IAC7B,qEAAqE;IACrE,SAAS,cAAc;IACvB,kDAAkD;IAClD,YAAY,iBAAiB;IAC7B,iDAAiD;IACjD,aAAa,kBAAkB;IAC/B,mDAAmD;IACnD,KAAK,UAAU;IACf,8DAA8D;IAC9D,WAAW,gBAAgB;IAC3B,cAAc,mBAAmB;IAEjC,SAAS,cAAc;CAExB"}
@@ -37,5 +37,7 @@ export var MessageType;
37
37
  /** Host → Module: Signals the module to exit and clean up. */
38
38
  MessageType["MODULE_EXIT"] = "module:exit";
39
39
  MessageType["CONTEXT_UPDATE"] = "context:update";
40
+ // messageTypes.ts
41
+ MessageType["HEARTBEAT"] = "heartbeat";
40
42
  })(MessageType || (MessageType = {}));
41
43
  //# sourceMappingURL=messageTypes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"messageTypes.js","sourceRoot":"","sources":["../src/messageTypes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,sBAAsB;AAEtB;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAN,IAAY,WAgBX;AAhBD,WAAY,WAAW;IACrB,sEAAsE;IACtE,kDAAmC,CAAA;IACnC,wEAAwE;IACxE,4CAA6B,CAAA;IAC7B,qEAAqE;IACrE,sCAAuB,CAAA;IACvB,kDAAkD;IAClD,4CAA6B,CAAA;IAC7B,iDAAiD;IACjD,8CAA+B,CAAA;IAC/B,mDAAmD;IACnD,8BAAe,CAAA;IACf,8DAA8D;IAC9D,0CAA2B,CAAA;IAC3B,gDAAiC,CAAA;AACnC,CAAC,EAhBW,WAAW,KAAX,WAAW,QAgBtB"}
1
+ {"version":3,"file":"messageTypes.js","sourceRoot":"","sources":["../src/messageTypes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,sBAAsB;AAEtB;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAN,IAAY,WAmBX;AAnBD,WAAY,WAAW;IACrB,sEAAsE;IACtE,kDAAmC,CAAA;IACnC,wEAAwE;IACxE,4CAA6B,CAAA;IAC7B,qEAAqE;IACrE,sCAAuB,CAAA;IACvB,kDAAkD;IAClD,4CAA6B,CAAA;IAC7B,iDAAiD;IACjD,8CAA+B,CAAA;IAC/B,mDAAmD;IACnD,8BAAe,CAAA;IACf,8DAA8D;IAC9D,0CAA2B,CAAA;IAC3B,gDAAiC,CAAA;IACjC,kBAAkB;IAClB,sCAAuB,CAAA;AAEzB,CAAC,EAnBW,WAAW,KAAX,WAAW,QAmBtB"}
@@ -1,21 +1,14 @@
1
1
  import { BridgeBase } from './bridgeBase';
2
- import { HandshakeReadyPayload, UIUpdatePayload, ErrorPayload } from './payloadSchemas';
3
- /**
4
- * Module-side bridge for communication with the host application.
5
- */
2
+ import { HandshakeReadyPayload, UIUpdatePayload, ErrorPayload, HeartbeatPayload } from './payloadSchemas';
6
3
  export declare class ModuleBridge extends BridgeBase {
4
+ private startedPayload;
7
5
  constructor(targetOrigin?: string);
8
6
  sendHandshake(payload: HandshakeReadyPayload): void;
9
7
  onModuleStart(callback: (payload: any) => void): void;
8
+ onHeartbeat(callback?: (payload: HeartbeatPayload) => void): void;
10
9
  sendUIUpdate(payload: UIUpdatePayload): void;
11
10
  sendError(payload: ErrorPayload): void;
12
- /**
13
- * Module requests data from host
14
- */
15
11
  requestData<T = any, R = any>(type: string, payload?: T, timeout?: number): Promise<R>;
16
- /**
17
- * Respond to a host request
18
- */
19
12
  respondData(requestId: string, data: any, status?: 'success' | 'error'): void;
20
13
  }
21
14
  //# sourceMappingURL=moduleBridge.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"moduleBridge.d.ts","sourceRoot":"","sources":["../src/moduleBridge.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAEzC,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,YAAY,EAGb,MAAM,kBAAkB,CAAA;AAEzB;;GAEG;AACH,qBAAa,YAAa,SAAQ,UAAU;gBAC9B,YAAY,GAAE,MAAY;IAKtC,aAAa,CAAC,OAAO,EAAE,qBAAqB;IAI5C,aAAa,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI;IAI9C,YAAY,CAAC,OAAO,EAAE,eAAe;IAIrC,SAAS,CAAC,OAAO,EAAE,YAAY;IAK/B;;OAEG;IACH,WAAW,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,OAAO,SAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IASpF;;OAEG;IACJ,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,GAAE,SAAS,GAAG,OAAmB;CASjF"}
1
+ {"version":3,"file":"moduleBridge.d.ts","sourceRoot":"","sources":["../src/moduleBridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAEzC,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,YAAY,EAGZ,gBAAgB,EAEjB,MAAM,kBAAkB,CAAA;AAEzB,qBAAa,YAAa,SAAQ,UAAU;IAC1C,OAAO,CAAC,cAAc,CAAmB;gBAE7B,YAAY,GAAE,MAAY;IAOtC,aAAa,CAAC,OAAO,EAAE,qBAAqB;IAO5C,aAAa,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI;IAc9C,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI;IAmB1D,YAAY,CAAC,OAAO,EAAE,eAAe;IAIrC,SAAS,CAAC,OAAO,EAAE,YAAY;IAO3B,WAAW,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAChC,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,CAAC,EACX,OAAO,SAAO,GACb,OAAO,CAAC,CAAC,CAAC;IAyBX,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,GAAE,SAAS,GAAG,OAAmB;CAQlF"}
@@ -1,41 +1,72 @@
1
- // src/moduleBridge.ts
2
1
  import { BridgeBase } from './bridgeBase';
3
2
  import { MessageType } from './messageTypes';
4
- /**
5
- * Module-side bridge for communication with the host application.
6
- */
7
3
  export class ModuleBridge extends BridgeBase {
8
4
  constructor(targetOrigin = '*') {
9
5
  super(window.parent, targetOrigin);
6
+ this.startedPayload = null;
10
7
  }
11
- // ---------- Lifecycle / handshake ----------
8
+ // --------------------
9
+ // Handshake
10
+ // --------------------
12
11
  sendHandshake(payload) {
13
12
  this.send(MessageType.HANDSHAKE_READY, payload);
14
13
  }
14
+ // --------------------
15
+ // Start (sticky)
16
+ // --------------------
15
17
  onModuleStart(callback) {
16
- this.on(MessageType.MODULE_START, callback);
18
+ if (this.startedPayload) {
19
+ callback(this.startedPayload);
20
+ }
21
+ this.on(MessageType.MODULE_START, payload => {
22
+ this.startedPayload = payload;
23
+ callback(payload);
24
+ });
17
25
  }
26
+ // --------------------
27
+ // Heartbeat
28
+ // --------------------
29
+ onHeartbeat(callback) {
30
+ this.on(MessageType.HEARTBEAT, (payload) => {
31
+ const hb = payload;
32
+ // Ignore ACK-only heartbeats
33
+ if (hb.ack)
34
+ return;
35
+ callback?.(hb);
36
+ this.send(MessageType.HEARTBEAT, {
37
+ timestamp: Date.now(),
38
+ ack: true
39
+ });
40
+ });
41
+ }
42
+ // --------------------
43
+ // UI / Errors
44
+ // --------------------
18
45
  sendUIUpdate(payload) {
19
46
  this.send(MessageType.UI_UPDATE, payload);
20
47
  }
21
48
  sendError(payload) {
22
49
  this.send(MessageType.ERROR, payload);
23
50
  }
24
- // ---------- Request / response ----------
25
- /**
26
- * Module requests data from host
27
- */
28
- requestData(type, payload, timeout = 5000) {
29
- const requestPayload = {
51
+ // --------------------
52
+ // Requests
53
+ // --------------------
54
+ async requestData(type, payload, timeout = 5000) {
55
+ const request = {
30
56
  requestId: crypto.randomUUID(),
31
57
  type,
32
58
  payload: payload
33
59
  };
34
- return this.request(MessageType.DATA_REQUEST, requestPayload, timeout);
60
+ // Call base request (returns generic MessagePayload)
61
+ const response = (await this.request(MessageType.DATA_REQUEST, request, timeout)); // Cast safely here
62
+ if (response.status === 'error') {
63
+ throw new Error(response.error || 'Unknown error from host');
64
+ }
65
+ return response.payload;
35
66
  }
36
- /**
37
- * Respond to a host request
38
- */
67
+ // --------------------
68
+ // Respond to host requests
69
+ // --------------------
39
70
  respondData(requestId, data, status = 'success') {
40
71
  const response = {
41
72
  requestId,
@@ -1 +1 @@
1
- {"version":3,"file":"moduleBridge.js","sourceRoot":"","sources":["../src/moduleBridge.ts"],"names":[],"mappings":"AAAA,sBAAsB;AACtB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAS5C;;GAEG;AACH,MAAM,OAAO,YAAa,SAAQ,UAAU;IAC1C,YAAY,eAAuB,GAAG;QACpC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IACpC,CAAC;IAED,8CAA8C;IAC9C,aAAa,CAAC,OAA8B;QAC1C,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,OAAO,CAAC,CAAA;IACjD,CAAC;IAED,aAAa,CAAC,QAAgC;QAC5C,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAA;IAC7C,CAAC;IAED,YAAY,CAAC,OAAwB;QACnC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;IAC3C,CAAC;IAED,SAAS,CAAC,OAAqB;QAC7B,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IACvC,CAAC;IAED,2CAA2C;IAC3C;;OAEG;IACH,WAAW,CAAmB,IAAY,EAAE,OAAW,EAAE,OAAO,GAAG,IAAI;QACrE,MAAM,cAAc,GAAmB;YACrC,SAAS,EAAE,MAAM,CAAC,UAAU,EAAE;YAC9B,IAAI;YACJ,OAAO,EAAE,OAAc;SACxB,CAAA;QACD,OAAO,IAAI,CAAC,OAAO,CAAoB,WAAW,CAAC,YAAY,EAAE,cAAc,EAAE,OAAO,CAAC,CAAA;IAC3F,CAAC;IAED;;OAEG;IACJ,WAAW,CAAC,SAAiB,EAAE,IAAS,EAAE,SAA8B,SAAS;QAChF,MAAM,QAAQ,GAAoB;YAChC,SAAS;YACT,MAAM;YACN,OAAO,EAAE,IAAI;SACd,CAAA;QACD,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAA;IAChD,CAAC;CAEA"}
1
+ {"version":3,"file":"moduleBridge.js","sourceRoot":"","sources":["../src/moduleBridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAW5C,MAAM,OAAO,YAAa,SAAQ,UAAU;IAG1C,YAAY,eAAuB,GAAG;QACpC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;QAH5B,mBAAc,GAAe,IAAI,CAAA;IAIzC,CAAC;IAED,uBAAuB;IACvB,YAAY;IACZ,uBAAuB;IACvB,aAAa,CAAC,OAA8B;QAC1C,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,OAAO,CAAC,CAAA;IACjD,CAAC;IAED,uBAAuB;IACvB,iBAAiB;IACjB,uBAAuB;IACvB,aAAa,CAAC,QAAgC;QAC5C,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;QAC/B,CAAC;QAED,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE;YAC1C,IAAI,CAAC,cAAc,GAAG,OAAO,CAAA;YAC7B,QAAQ,CAAC,OAAO,CAAC,CAAA;QACnB,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,uBAAuB;IACvB,YAAY;IACZ,uBAAuB;IACvB,WAAW,CAAC,QAA8C;QACxD,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,OAAuB,EAAE,EAAE;YACzD,MAAM,EAAE,GAAG,OAA2B,CAAA;YAEtC,6BAA6B;YAC7B,IAAI,EAAE,CAAC,GAAG;gBAAE,OAAM;YAElB,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAA;YAEd,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE;gBAC/B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,GAAG,EAAE,IAAI;aACU,CAAC,CAAA;QACxB,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,uBAAuB;IACvB,cAAc;IACd,uBAAuB;IACvB,YAAY,CAAC,OAAwB;QACnC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;IAC3C,CAAC;IAED,SAAS,CAAC,OAAqB;QAC7B,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IACvC,CAAC;IAED,uBAAuB;IACvB,WAAW;IACX,uBAAuB;IACzB,KAAK,CAAC,WAAW,CACf,IAAY,EACZ,OAAW,EACX,OAAO,GAAG,IAAI;QAEd,MAAM,OAAO,GAAmB;YAC9B,SAAS,EAAE,MAAM,CAAC,UAAU,EAAE;YAC9B,IAAI;YACJ,OAAO,EAAE,OAAc;SACxB,CAAA;QAED,qDAAqD;QACrD,MAAM,QAAQ,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAClC,WAAW,CAAC,YAAY,EACxB,OAAO,EACP,OAAO,CACR,CAAoB,CAAA,CAAC,mBAAmB;QAEzC,IAAI,QAAQ,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,yBAAyB,CAAC,CAAA;QAC9D,CAAC;QAED,OAAO,QAAQ,CAAC,OAAY,CAAA;IAC9B,CAAC;IAGC,uBAAuB;IACvB,2BAA2B;IAC3B,uBAAuB;IACvB,WAAW,CAAC,SAAiB,EAAE,IAAS,EAAE,SAA8B,SAAS;QAC/E,MAAM,QAAQ,GAAoB;YAChC,SAAS;YACT,MAAM;YACN,OAAO,EAAE,IAAI;SACd,CAAA;QACD,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAA;IAChD,CAAC;CACF"}
@@ -1,68 +1,38 @@
1
- /**
2
- * Payload for handshake ready message.
3
- * Module → Host
4
- */
5
1
  export interface HandshakeReadyPayload {
6
2
  version: string;
7
3
  timestamp: number;
4
+ capabilities?: string[];
8
5
  }
9
- /**
10
- * Payload for starting a module.
11
- * Host → Module
12
- */
13
6
  export interface ModuleStartPayload {
14
7
  moduleId: string;
15
8
  route: string;
16
9
  context: Record<string, any>;
17
10
  timestamp: number;
18
11
  }
19
- /**
20
- * Payload for module exit
21
- * Host → Module
22
- */
23
12
  export interface ModuleExitPayload {
24
13
  reason?: string;
25
14
  }
26
- /**
27
- * Payload for UI updates from module
28
- * Module → Host
29
- */
30
15
  export interface UIUpdatePayload {
31
16
  title: string;
32
17
  breadcrumb: string[];
33
18
  theme?: string;
34
19
  }
35
- /**
36
- * Payload for errors
37
- * Module → Host
38
- */
39
20
  export interface ErrorPayload {
40
21
  code: string;
41
22
  message: string;
42
23
  details?: any;
43
24
  }
44
- /**
45
- * Payload for context updates
46
- * Host → Module
47
- */
48
25
  export interface ModuleContextPayload {
49
26
  user?: Record<string, any>;
50
27
  tenant?: Record<string, any>;
51
28
  permissions?: string[];
52
29
  theme?: string;
53
30
  }
54
- /**
55
- * Request payload (sent by requester)
56
- * Can be Module → Host or Host → Module
57
- */
58
31
  export interface RequestPayload {
59
32
  requestId: string;
60
33
  type: string;
61
- payload?: Record<string, any>;
34
+ payload?: any;
62
35
  }
63
- /**
64
- * Response payload (sent by responder)
65
- */
66
36
  export interface ResponsePayload {
67
37
  requestId: string;
68
38
  status: 'success' | 'error';
@@ -70,7 +40,24 @@ export interface ResponsePayload {
70
40
  error?: string;
71
41
  }
72
42
  /**
73
- * Union type representing all payloads
43
+ * Payload for heartbeat messages.
44
+ * Host ↔ Module
74
45
  */
75
- export type MessagePayload = HandshakeReadyPayload | ModuleStartPayload | ModuleExitPayload | UIUpdatePayload | ErrorPayload | ModuleContextPayload | RequestPayload | ResponsePayload;
46
+ export interface HeartbeatPayload {
47
+ timestamp: number;
48
+ ack?: boolean;
49
+ }
50
+ export type MessagePayload = HandshakeReadyPayload | ModuleStartPayload | ModuleExitPayload | UIUpdatePayload | ErrorPayload | ModuleContextPayload | RequestPayload | ResponsePayload | HeartbeatPayload;
51
+ import { MessageType } from './messageTypes';
52
+ export interface MessagePayloadMap {
53
+ [MessageType.HANDSHAKE_READY]: HandshakeReadyPayload;
54
+ [MessageType.MODULE_START]: ModuleStartPayload;
55
+ [MessageType.MODULE_EXIT]: ModuleExitPayload;
56
+ [MessageType.UI_UPDATE]: UIUpdatePayload;
57
+ [MessageType.ERROR]: ErrorPayload;
58
+ [MessageType.CONTEXT_UPDATE]: ModuleContextPayload;
59
+ [MessageType.DATA_REQUEST]: RequestPayload;
60
+ [MessageType.DATA_RESPONSE]: ResponsePayload;
61
+ [MessageType.HEARTBEAT]: HeartbeatPayload;
62
+ }
76
63
  //# sourceMappingURL=payloadSchemas.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"payloadSchemas.d.ts","sourceRoot":"","sources":["../src/payloadSchemas.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC5B,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,GAAG,CAAA;CACd;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC5B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,SAAS,GAAG,OAAO,CAAA;IAC3B,OAAO,CAAC,EAAE,GAAG,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GACtB,qBAAqB,GACrB,kBAAkB,GAClB,iBAAiB,GACjB,eAAe,GACf,YAAY,GACZ,oBAAoB,GACpB,cAAc,GACd,eAAe,CAAA"}
1
+ {"version":3,"file":"payloadSchemas.d.ts","sourceRoot":"","sources":["../src/payloadSchemas.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACf,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC5B,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,GAAG,CAAA;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC5B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,GAAG,CAAA;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,SAAS,GAAG,OAAO,CAAA;IAC3B,OAAO,CAAC,EAAE,GAAG,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAGD;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAA;IACjB,GAAG,CAAC,EAAE,OAAO,CAAA;CACd;AAED,MAAM,MAAM,cAAc,GACtB,qBAAqB,GACrB,kBAAkB,GAClB,iBAAiB,GACjB,eAAe,GACf,YAAY,GACZ,oBAAoB,GACpB,cAAc,GACd,eAAe,GACf,gBAAgB,CAAA;AAGpB,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAE5C,MAAM,WAAW,iBAAiB;IAChC,CAAC,WAAW,CAAC,eAAe,CAAC,EAAE,qBAAqB,CAAA;IACpD,CAAC,WAAW,CAAC,YAAY,CAAC,EAAE,kBAAkB,CAAA;IAC9C,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,iBAAiB,CAAA;IAC5C,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,eAAe,CAAA;IACxC,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,YAAY,CAAA;IACjC,CAAC,WAAW,CAAC,cAAc,CAAC,EAAE,oBAAoB,CAAA;IAClD,CAAC,WAAW,CAAC,YAAY,CAAC,EAAE,cAAc,CAAA;IAC1C,CAAC,WAAW,CAAC,aAAa,CAAC,EAAE,eAAe,CAAA;IAC5C,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,gBAAgB,CAAA;CAC1C"}
@@ -1,2 +1,2 @@
1
- export {};
1
+ import { MessageType } from './messageTypes';
2
2
  //# sourceMappingURL=payloadSchemas.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"payloadSchemas.js","sourceRoot":"","sources":["../src/payloadSchemas.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"payloadSchemas.js","sourceRoot":"","sources":["../src/payloadSchemas.ts"],"names":[],"mappings":"AAuEA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1,8 @@
1
+ export declare enum ProtocolState {
2
+ INIT = "init",
3
+ HANDSHAKEN = "handshaken",
4
+ STARTED = "started",
5
+ EXITED = "exited"
6
+ }
7
+ export declare const PROTOCOL_VERSION = "1.0.0";
8
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAEA,oBAAY,aAAa;IACvB,IAAI,SAAS;IACb,UAAU,eAAe;IACzB,OAAO,YAAY;IACnB,MAAM,WAAW;CAClB;AAED,eAAO,MAAM,gBAAgB,UAAU,CAAA"}
@@ -0,0 +1,10 @@
1
+ // src/protocol.ts
2
+ export var ProtocolState;
3
+ (function (ProtocolState) {
4
+ ProtocolState["INIT"] = "init";
5
+ ProtocolState["HANDSHAKEN"] = "handshaken";
6
+ ProtocolState["STARTED"] = "started";
7
+ ProtocolState["EXITED"] = "exited";
8
+ })(ProtocolState || (ProtocolState = {}));
9
+ export const PROTOCOL_VERSION = '1.0.0';
10
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAElB,MAAM,CAAN,IAAY,aAKX;AALD,WAAY,aAAa;IACvB,8BAAa,CAAA;IACb,0CAAyB,CAAA;IACzB,oCAAmB,CAAA;IACnB,kCAAiB,CAAA;AACnB,CAAC,EALW,aAAa,KAAb,aAAa,QAKxB;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@schoolpalm/message-bridge",
3
- "version": "1.2.0",
3
+ "version": "1.3.0",
4
4
  "description": "TypeScript SDK for message-based communication between SchoolPalm host and vendor modules.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",