@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.
- package/dist/bridgeBase.d.ts +8 -13
- package/dist/bridgeBase.d.ts.map +1 -1
- package/dist/bridgeBase.js +38 -30
- package/dist/bridgeBase.js.map +1 -1
- package/dist/errors.d.ts +5 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +7 -0
- package/dist/errors.js.map +1 -0
- package/dist/hostBridge.d.ts +9 -6
- package/dist/hostBridge.d.ts.map +1 -1
- package/dist/hostBridge.js +77 -20
- package/dist/hostBridge.js.map +1 -1
- package/dist/logger.d.ts +2 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +4 -0
- package/dist/logger.js.map +1 -0
- package/dist/messageTypes.d.ts +2 -1
- package/dist/messageTypes.d.ts.map +1 -1
- package/dist/messageTypes.js +2 -0
- package/dist/messageTypes.js.map +1 -1
- package/dist/moduleBridge.d.ts +3 -10
- package/dist/moduleBridge.d.ts.map +1 -1
- package/dist/moduleBridge.js +47 -16
- package/dist/moduleBridge.js.map +1 -1
- package/dist/payloadSchemas.d.ts +21 -34
- package/dist/payloadSchemas.d.ts.map +1 -1
- package/dist/payloadSchemas.js +1 -1
- package/dist/payloadSchemas.js.map +1 -1
- package/dist/protocol.d.ts +8 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +10 -0
- package/dist/protocol.js.map +1 -0
- package/package.json +1 -1
package/dist/bridgeBase.d.ts
CHANGED
|
@@ -1,23 +1,18 @@
|
|
|
1
1
|
import { MessageType } from './messageTypes';
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
type MessageHandler<T
|
|
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
|
|
18
|
-
request<
|
|
19
|
-
on<T extends
|
|
20
|
-
protected
|
|
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 {};
|
package/dist/bridgeBase.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridgeBase.d.ts","sourceRoot":"","sources":["../src/bridgeBase.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/bridgeBase.js
CHANGED
|
@@ -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
|
-
|
|
8
|
+
this.boundHandler = this.handleMessage.bind(this);
|
|
9
|
+
window.addEventListener('message', this.boundHandler);
|
|
16
10
|
}
|
|
17
|
-
//
|
|
11
|
+
// --------------------
|
|
12
|
+
// Send (typed)
|
|
13
|
+
// --------------------
|
|
18
14
|
send(type, payload) {
|
|
19
15
|
this.targetWindow.postMessage({ type, payload }, this.targetOrigin);
|
|
20
16
|
}
|
|
21
|
-
//
|
|
17
|
+
// --------------------
|
|
18
|
+
// Request / Response
|
|
19
|
+
// --------------------
|
|
22
20
|
request(type, payload, timeout = 5000) {
|
|
23
21
|
return new Promise((resolve, reject) => {
|
|
24
|
-
const requestId =
|
|
25
|
-
this.pendingRequests.set(requestId,
|
|
26
|
-
|
|
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
|
-
//
|
|
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
|
-
|
|
46
|
+
}
|
|
47
|
+
this.listeners.get(type).push(callback);
|
|
40
48
|
}
|
|
41
|
-
|
|
42
|
-
|
|
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
|
|
49
|
-
if (type === MessageType.DATA_RESPONSE
|
|
50
|
-
const
|
|
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(
|
|
53
|
-
this.pendingRequests.delete(
|
|
63
|
+
resolver(response);
|
|
64
|
+
this.pendingRequests.delete(response.requestId);
|
|
54
65
|
return;
|
|
55
66
|
}
|
|
56
67
|
}
|
|
57
|
-
|
|
58
|
-
|
|
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.
|
|
72
|
+
window.removeEventListener('message', this.boundHandler);
|
|
65
73
|
this.listeners.clear();
|
|
66
74
|
this.pendingRequests.clear();
|
|
67
75
|
}
|
package/dist/bridgeBase.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridgeBase.js","sourceRoot":"","sources":["../src/bridgeBase.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"bridgeBase.js","sourceRoot":"","sources":["../src/bridgeBase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAM5C,MAAM,OAAO,UAAU;IAQrB,YAAY,YAAoB,EAAE,eAAuB,GAAG;QAJpD,cAAS,GAAG,IAAI,GAAG,EAAsC,CAAA;QACzD,oBAAe,GAAG,IAAI,GAAG,EAAkC,CAAA;QAIjE,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;QAChC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;QAEhC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACjD,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAA;IACvD,CAAC;IAED,uBAAuB;IACvB,eAAe;IACf,uBAAuB;IACvB,IAAI,CACF,IAAO,EACP,OAA6B;QAE7B,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,CAAA;IACrE,CAAC;IAED,uBAAuB;IACvB,qBAAqB;IACrB,uBAAuB;IACxB,OAAO,CACN,IAAiB,EACjB,OAAuB,EACvB,OAAO,GAAG,IAAI;QAEd,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAA;YAEnC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,QAAyB,EAAE,EAAE;gBAChE,IAAI,QAAQ,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;oBAChC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,eAAe,CAAC,CAAC,CAAA;gBACtD,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,QAAQ,CAAC,OAAY,CAAC,CAAA;gBAChC,CAAC;YACH,CAAC,CAAC,CAAA;YAEF,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;YAExB,UAAU,CAAC,GAAG,EAAE;gBACd,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;oBACxC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;oBACtC,MAAM,CAAC,IAAI,KAAK,CAAC,WAAW,OAAO,CAAC,IAAI,YAAY,CAAC,CAAC,CAAA;gBACxD,CAAC;YACH,CAAC,EAAE,OAAO,CAAC,CAAA;QACb,CAAC,CAAC,CAAA;IACJ,CAAC;IAGC,uBAAuB;IACvB,oBAAoB;IACpB,uBAAuB;IACvB,EAAE,CACA,IAAO,EACP,QAA8C;QAE9C,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;QAC9B,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC1C,CAAC;IAED,uBAAuB;IACvB,aAAa;IACb,uBAAuB;IACb,aAAa,CAAC,KAAmB;QACzC,IAAI,IAAI,CAAC,YAAY,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,YAAY;YAAE,OAAM;QAE3E,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE,CAAA;QAC1C,IAAI,CAAC,IAAI;YAAE,OAAM;QAEjB,mBAAmB;QACnB,IAAI,IAAI,KAAK,WAAW,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,QAAQ,GAAG,OAA0B,CAAA;YAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;YAC7D,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,QAAQ,CAAC,CAAA;gBAClB,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;gBAC/C,OAAM;YACR,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACzC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAA;IACtC,CAAC;IAED,OAAO;QACL,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAA;QACxD,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAA;QACtB,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAA;IAC9B,CAAC;CACF"}
|
package/dist/errors.d.ts
ADDED
|
@@ -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 @@
|
|
|
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"}
|
package/dist/hostBridge.d.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
package/dist/hostBridge.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hostBridge.d.ts","sourceRoot":"","sources":["../src/hostBridge.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/hostBridge.js
CHANGED
|
@@ -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
|
-
//
|
|
15
|
+
// --------------------
|
|
16
|
+
// Handshake (sticky)
|
|
17
|
+
// --------------------
|
|
15
18
|
onHandshakeReady(callback) {
|
|
16
|
-
this.
|
|
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
|
-
|
|
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
|
-
//
|
|
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
|
-
//
|
|
89
|
+
// --------------------
|
|
90
|
+
// Context sync
|
|
91
|
+
// --------------------
|
|
45
92
|
sendContextUpdate(payload) {
|
|
46
93
|
this.send(MessageType.CONTEXT_UPDATE, payload);
|
|
47
94
|
}
|
|
48
|
-
//
|
|
95
|
+
// --------------------
|
|
96
|
+
// Requests
|
|
97
|
+
// --------------------
|
|
49
98
|
requestData(type, payload, timeout = 5000) {
|
|
50
|
-
const
|
|
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,
|
|
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
|
package/dist/hostBridge.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hostBridge.js","sourceRoot":"","sources":["../src/hostBridge.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"hostBridge.js","sourceRoot":"","sources":["../src/hostBridge.ts"],"names":[],"mappings":"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"}
|
package/dist/logger.d.ts
ADDED
|
@@ -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 @@
|
|
|
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"}
|
package/dist/messageTypes.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/messageTypes.js
CHANGED
|
@@ -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
|
package/dist/messageTypes.js.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/moduleBridge.d.ts
CHANGED
|
@@ -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":"
|
|
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"}
|
package/dist/moduleBridge.js
CHANGED
|
@@ -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
|
-
//
|
|
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.
|
|
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
|
-
//
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
|
|
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
|
-
|
|
38
|
-
|
|
67
|
+
// --------------------
|
|
68
|
+
// Respond to host requests
|
|
69
|
+
// --------------------
|
|
39
70
|
respondData(requestId, data, status = 'success') {
|
|
40
71
|
const response = {
|
|
41
72
|
requestId,
|
package/dist/moduleBridge.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"moduleBridge.js","sourceRoot":"","sources":["../src/moduleBridge.ts"],"names":[],"mappings":"AAAA,
|
|
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"}
|
package/dist/payloadSchemas.d.ts
CHANGED
|
@@ -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?:
|
|
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
|
-
*
|
|
43
|
+
* Payload for heartbeat messages.
|
|
44
|
+
* Host ↔ Module
|
|
74
45
|
*/
|
|
75
|
-
export
|
|
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":"
|
|
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"}
|
package/dist/payloadSchemas.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
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 @@
|
|
|
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"}
|
package/dist/protocol.js
ADDED
|
@@ -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