@agentstage/bridge 0.1.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/counter/store.json +8 -0
- package/dist/browser/createBridgeStore.d.ts +5 -0
- package/dist/browser/createBridgeStore.d.ts.map +1 -0
- package/dist/browser/createBridgeStore.js +232 -0
- package/dist/browser/createBridgeStore.js.map +1 -0
- package/dist/browser/index.d.ts +4 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +2 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/types.d.ts +36 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/gateway/apiHandler.d.ts +10 -0
- package/dist/gateway/apiHandler.d.ts.map +1 -0
- package/dist/gateway/apiHandler.js +91 -0
- package/dist/gateway/apiHandler.js.map +1 -0
- package/dist/gateway/createBridgeGateway.d.ts +3 -0
- package/dist/gateway/createBridgeGateway.d.ts.map +1 -0
- package/dist/gateway/createBridgeGateway.js +689 -0
- package/dist/gateway/createBridgeGateway.js.map +1 -0
- package/dist/gateway/fileStore.d.ts +39 -0
- package/dist/gateway/fileStore.d.ts.map +1 -0
- package/dist/gateway/fileStore.js +189 -0
- package/dist/gateway/fileStore.js.map +1 -0
- package/dist/gateway/index.d.ts +6 -0
- package/dist/gateway/index.d.ts.map +1 -0
- package/dist/gateway/index.js +5 -0
- package/dist/gateway/index.js.map +1 -0
- package/dist/gateway/registry.d.ts +21 -0
- package/dist/gateway/registry.d.ts.map +1 -0
- package/dist/gateway/registry.js +136 -0
- package/dist/gateway/registry.js.map +1 -0
- package/dist/gateway/types.d.ts +50 -0
- package/dist/gateway/types.d.ts.map +1 -0
- package/dist/gateway/types.js +2 -0
- package/dist/gateway/types.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/sdk/BridgeClient.d.ts +38 -0
- package/dist/sdk/BridgeClient.d.ts.map +1 -0
- package/dist/sdk/BridgeClient.js +163 -0
- package/dist/sdk/BridgeClient.js.map +1 -0
- package/dist/sdk/index.d.ts +3 -0
- package/dist/sdk/index.d.ts.map +1 -0
- package/dist/sdk/index.js +2 -0
- package/dist/sdk/index.js.map +1 -0
- package/dist/shared/types.d.ts +154 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +5 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/utils/logger.d.ts +33 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +206 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/vite/index.d.ts +6 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +23 -0
- package/dist/vite/index.js.map +1 -0
- package/package.json +60 -0
- package/src/browser/createBridgeStore.ts +276 -0
- package/src/browser/index.ts +6 -0
- package/src/browser/types.ts +36 -0
- package/src/gateway/apiHandler.ts +107 -0
- package/src/gateway/createBridgeGateway.ts +854 -0
- package/src/gateway/fileStore.ts +244 -0
- package/src/gateway/index.ts +12 -0
- package/src/gateway/registry.ts +166 -0
- package/src/gateway/types.ts +65 -0
- package/src/index.ts +33 -0
- package/src/sdk/BridgeClient.ts +203 -0
- package/src/sdk/index.ts +2 -0
- package/src/shared/types.ts +117 -0
- package/src/utils/logger.ts +262 -0
- package/src/vite/index.ts +31 -0
- package/test/e2e/bridge.test.ts +386 -0
- package/test/integration/gateway.test.ts +485 -0
- package/test/mocks/mockWebSocket.ts +49 -0
- package/test/unit/browser.test.ts +267 -0
- package/test/unit/fileStore.test.ts +98 -0
- package/test/unit/registry.test.ts +345 -0
- package/test-page/store.json +8 -0
- package/tsconfig.json +20 -0
- package/tsconfig.tsbuildinfo +1 -0
- package/vitest.config.ts +17 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { BridgeEvent, SetStateOptions, StateSnapshot, StoreDescription, StoreSummary } from '../shared/types.js';
|
|
2
|
+
export type { BridgeEvent, StoreDescription, StoreSummary, StateSnapshot };
|
|
3
|
+
export declare class BridgeClient {
|
|
4
|
+
private ws;
|
|
5
|
+
private url;
|
|
6
|
+
private reconnectAttempts;
|
|
7
|
+
private maxReconnectAttempts;
|
|
8
|
+
private reconnectDelay;
|
|
9
|
+
private eventHandlers;
|
|
10
|
+
private pendingRequests;
|
|
11
|
+
private requestId;
|
|
12
|
+
private subscribedStores;
|
|
13
|
+
constructor(url: string);
|
|
14
|
+
connect(): Promise<void>;
|
|
15
|
+
private attemptReconnect;
|
|
16
|
+
private send;
|
|
17
|
+
private handleMessage;
|
|
18
|
+
private emit;
|
|
19
|
+
onEvent(handler: (event: BridgeEvent) => void): () => void;
|
|
20
|
+
private request;
|
|
21
|
+
listStores(): Promise<StoreSummary[]>;
|
|
22
|
+
describe(storeId: string): Promise<StoreDescription | undefined>;
|
|
23
|
+
getState(storeId: string): Promise<StateSnapshot | undefined>;
|
|
24
|
+
findStoreByKey(pageId: string, storeKey: string): Promise<StoreSummary | undefined>;
|
|
25
|
+
getStateByKey(pageId: string, storeKey?: string): Promise<StateSnapshot | undefined>;
|
|
26
|
+
subscribe(storeId: string): void;
|
|
27
|
+
unsubscribe(storeId: string): void;
|
|
28
|
+
setState(storeId: string, state: unknown, options?: SetStateOptions): Promise<void>;
|
|
29
|
+
setStateByKey(pageId: string, storeKey: string, state: unknown, options?: SetStateOptions): Promise<{
|
|
30
|
+
version: number;
|
|
31
|
+
}>;
|
|
32
|
+
dispatch(storeId: string, action: {
|
|
33
|
+
type: string;
|
|
34
|
+
payload?: unknown;
|
|
35
|
+
}): Promise<void>;
|
|
36
|
+
disconnect(): void;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=BridgeClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BridgeClient.d.ts","sourceRoot":"","sources":["../../src/sdk/BridgeClient.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,aAAa,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEtH,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC;AAE3E,qBAAa,YAAY;IACvB,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,oBAAoB,CAAK;IACjC,OAAO,CAAC,cAAc,CAAQ;IAC9B,OAAO,CAAC,aAAa,CAA2C;IAChE,OAAO,CAAC,eAAe,CAAsF;IAC7G,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,gBAAgB,CAAqB;gBAEjC,GAAG,EAAE,MAAM;IAIjB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA4B9B,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,IAAI;IAMZ,OAAO,CAAC,aAAa;IAoDrB,OAAO,CAAC,IAAI;IAMZ,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,GAAG,MAAM,IAAI;YAK5C,OAAO;IAmBf,UAAU,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAIrC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAKhE,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAK7D,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAKnF,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,SAAS,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAK1F,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKhC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAK5B,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAInF,aAAa,CACjB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,OAAO,EACd,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAIzB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3F,UAAU,IAAI,IAAI;CAGnB"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import WebSocket from 'ws';
|
|
2
|
+
export class BridgeClient {
|
|
3
|
+
ws = null;
|
|
4
|
+
url;
|
|
5
|
+
reconnectAttempts = 0;
|
|
6
|
+
maxReconnectAttempts = 5;
|
|
7
|
+
reconnectDelay = 1000;
|
|
8
|
+
eventHandlers = new Set();
|
|
9
|
+
pendingRequests = new Map();
|
|
10
|
+
requestId = 0;
|
|
11
|
+
subscribedStores = new Set();
|
|
12
|
+
constructor(url) {
|
|
13
|
+
this.url = url;
|
|
14
|
+
}
|
|
15
|
+
async connect() {
|
|
16
|
+
return new Promise((resolve, reject) => {
|
|
17
|
+
this.ws = new WebSocket(this.url + '?type=client');
|
|
18
|
+
this.ws.on('open', () => {
|
|
19
|
+
this.reconnectAttempts = 0;
|
|
20
|
+
for (const storeId of this.subscribedStores) {
|
|
21
|
+
this.send({ type: 'subscribe', payload: { storeId } });
|
|
22
|
+
}
|
|
23
|
+
resolve();
|
|
24
|
+
});
|
|
25
|
+
this.ws.on('message', (data) => {
|
|
26
|
+
this.handleMessage(data.toString());
|
|
27
|
+
});
|
|
28
|
+
this.ws.on('close', () => {
|
|
29
|
+
this.attemptReconnect();
|
|
30
|
+
});
|
|
31
|
+
this.ws.on('error', (err) => {
|
|
32
|
+
reject(err);
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
attemptReconnect() {
|
|
37
|
+
if (this.reconnectAttempts >= this.maxReconnectAttempts) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
this.reconnectAttempts++;
|
|
41
|
+
setTimeout(() => {
|
|
42
|
+
this.connect().catch(() => { });
|
|
43
|
+
}, this.reconnectDelay * this.reconnectAttempts);
|
|
44
|
+
}
|
|
45
|
+
send(message) {
|
|
46
|
+
if (this.ws?.readyState === WebSocket.OPEN) {
|
|
47
|
+
this.ws.send(JSON.stringify(message));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
handleMessage(data) {
|
|
51
|
+
try {
|
|
52
|
+
const msg = JSON.parse(data);
|
|
53
|
+
if (msg.id !== undefined && this.pendingRequests.has(msg.id)) {
|
|
54
|
+
const pending = this.pendingRequests.get(msg.id);
|
|
55
|
+
this.pendingRequests.delete(msg.id);
|
|
56
|
+
if (msg.error) {
|
|
57
|
+
pending.reject(new Error(msg.error.message || msg.error));
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
pending.resolve(msg.result);
|
|
61
|
+
}
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
if (msg.type) {
|
|
65
|
+
switch (msg.type) {
|
|
66
|
+
case 'store.stateChanged':
|
|
67
|
+
this.emit({
|
|
68
|
+
type: 'stateChanged',
|
|
69
|
+
storeId: msg.payload.storeId,
|
|
70
|
+
state: msg.payload.state,
|
|
71
|
+
version: msg.payload.version,
|
|
72
|
+
source: msg.payload.source,
|
|
73
|
+
});
|
|
74
|
+
break;
|
|
75
|
+
case 'store.disconnected':
|
|
76
|
+
this.emit({
|
|
77
|
+
type: 'disconnected',
|
|
78
|
+
storeId: msg.payload.storeId,
|
|
79
|
+
reason: msg.payload.reason,
|
|
80
|
+
});
|
|
81
|
+
this.subscribedStores.delete(msg.payload.storeId);
|
|
82
|
+
break;
|
|
83
|
+
case 'store.registered':
|
|
84
|
+
this.emit({
|
|
85
|
+
type: 'connected',
|
|
86
|
+
storeId: msg.payload.storeId,
|
|
87
|
+
pageId: msg.payload.pageId,
|
|
88
|
+
storeKey: msg.payload.storeKey,
|
|
89
|
+
});
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// Ignore malformed messages from unknown clients.
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
emit(event) {
|
|
99
|
+
for (const handler of this.eventHandlers) {
|
|
100
|
+
handler(event);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
onEvent(handler) {
|
|
104
|
+
this.eventHandlers.add(handler);
|
|
105
|
+
return () => this.eventHandlers.delete(handler);
|
|
106
|
+
}
|
|
107
|
+
async request(method, params) {
|
|
108
|
+
const id = ++this.requestId;
|
|
109
|
+
return new Promise((resolve, reject) => {
|
|
110
|
+
this.pendingRequests.set(id, {
|
|
111
|
+
resolve: (v) => resolve(v),
|
|
112
|
+
reject: (e) => reject(e),
|
|
113
|
+
});
|
|
114
|
+
this.send({ id, method, params });
|
|
115
|
+
setTimeout(() => {
|
|
116
|
+
if (this.pendingRequests.has(id)) {
|
|
117
|
+
this.pendingRequests.delete(id);
|
|
118
|
+
reject(new Error('Request timeout'));
|
|
119
|
+
}
|
|
120
|
+
}, 5000);
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
async listStores() {
|
|
124
|
+
return this.request('listStores', {});
|
|
125
|
+
}
|
|
126
|
+
async describe(storeId) {
|
|
127
|
+
const res = await this.request('describe', { storeId });
|
|
128
|
+
return res ?? undefined;
|
|
129
|
+
}
|
|
130
|
+
async getState(storeId) {
|
|
131
|
+
const res = await this.request('getState', { storeId });
|
|
132
|
+
return res ?? undefined;
|
|
133
|
+
}
|
|
134
|
+
async findStoreByKey(pageId, storeKey) {
|
|
135
|
+
const stores = await this.listStores();
|
|
136
|
+
return stores.find((store) => store.pageId === pageId && store.storeKey === storeKey);
|
|
137
|
+
}
|
|
138
|
+
async getStateByKey(pageId, storeKey = 'main') {
|
|
139
|
+
const res = await this.request('getState', { pageId, storeKey });
|
|
140
|
+
return res ?? undefined;
|
|
141
|
+
}
|
|
142
|
+
subscribe(storeId) {
|
|
143
|
+
this.subscribedStores.add(storeId);
|
|
144
|
+
this.send({ type: 'subscribe', payload: { storeId } });
|
|
145
|
+
}
|
|
146
|
+
unsubscribe(storeId) {
|
|
147
|
+
this.subscribedStores.delete(storeId);
|
|
148
|
+
this.send({ type: 'unsubscribe', payload: { storeId } });
|
|
149
|
+
}
|
|
150
|
+
async setState(storeId, state, options) {
|
|
151
|
+
await this.request('setState', { storeId, state, ...options });
|
|
152
|
+
}
|
|
153
|
+
async setStateByKey(pageId, storeKey, state, options) {
|
|
154
|
+
return this.request('setState', { pageId, storeKey, state, ...options });
|
|
155
|
+
}
|
|
156
|
+
async dispatch(storeId, action) {
|
|
157
|
+
await this.request('dispatch', { storeId, action });
|
|
158
|
+
}
|
|
159
|
+
disconnect() {
|
|
160
|
+
this.ws?.close();
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=BridgeClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BridgeClient.js","sourceRoot":"","sources":["../../src/sdk/BridgeClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sdk/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sdk/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types for Bridge
|
|
3
|
+
*/
|
|
4
|
+
export type StoreId = string;
|
|
5
|
+
export type PageId = string;
|
|
6
|
+
export type StoreKey = string;
|
|
7
|
+
export interface ActionDefinition {
|
|
8
|
+
description: string;
|
|
9
|
+
payload?: unknown;
|
|
10
|
+
}
|
|
11
|
+
export interface EventDefinition {
|
|
12
|
+
description: string;
|
|
13
|
+
payload?: unknown;
|
|
14
|
+
}
|
|
15
|
+
export interface StoreDescription {
|
|
16
|
+
pageId: PageId;
|
|
17
|
+
storeKey: StoreKey;
|
|
18
|
+
schema: unknown;
|
|
19
|
+
actions: Record<string, ActionDefinition>;
|
|
20
|
+
events?: Record<string, EventDefinition>;
|
|
21
|
+
}
|
|
22
|
+
export interface StoreSummary {
|
|
23
|
+
id: StoreId;
|
|
24
|
+
pageId: PageId;
|
|
25
|
+
storeKey: StoreKey;
|
|
26
|
+
version: number;
|
|
27
|
+
connectedAt: Date;
|
|
28
|
+
}
|
|
29
|
+
export interface StateSnapshot {
|
|
30
|
+
state: unknown;
|
|
31
|
+
version: number;
|
|
32
|
+
}
|
|
33
|
+
export interface StoreState<T = unknown> {
|
|
34
|
+
data: T;
|
|
35
|
+
version: number;
|
|
36
|
+
updatedAt: number;
|
|
37
|
+
}
|
|
38
|
+
export interface SetStateOptions {
|
|
39
|
+
expectedVersion?: number;
|
|
40
|
+
waitForAck?: boolean;
|
|
41
|
+
timeoutMs?: number;
|
|
42
|
+
}
|
|
43
|
+
export interface RegisterPayload {
|
|
44
|
+
storeId: StoreId;
|
|
45
|
+
pageId: PageId;
|
|
46
|
+
storeKey: StoreKey;
|
|
47
|
+
description: StoreDescription;
|
|
48
|
+
initialState: unknown;
|
|
49
|
+
}
|
|
50
|
+
export interface StateChangedPayload {
|
|
51
|
+
storeId: StoreId;
|
|
52
|
+
state: unknown;
|
|
53
|
+
version: number;
|
|
54
|
+
source: string;
|
|
55
|
+
}
|
|
56
|
+
export interface StateAppliedPayload {
|
|
57
|
+
storeId: StoreId;
|
|
58
|
+
requestId: string;
|
|
59
|
+
status: 'applied' | 'version_mismatch' | 'failed';
|
|
60
|
+
version: number;
|
|
61
|
+
error?: string;
|
|
62
|
+
}
|
|
63
|
+
export type GatewayMessage = {
|
|
64
|
+
type: 'store.register';
|
|
65
|
+
payload: RegisterPayload;
|
|
66
|
+
} | {
|
|
67
|
+
type: 'store.stateChanged';
|
|
68
|
+
payload: StateChangedPayload;
|
|
69
|
+
} | {
|
|
70
|
+
type: 'store.stateApplied';
|
|
71
|
+
payload: StateAppliedPayload;
|
|
72
|
+
} | {
|
|
73
|
+
type: 'store.heartbeat';
|
|
74
|
+
} | {
|
|
75
|
+
type: 'store.disconnect';
|
|
76
|
+
};
|
|
77
|
+
export interface ClientSetStatePayload {
|
|
78
|
+
storeId?: StoreId;
|
|
79
|
+
state: unknown;
|
|
80
|
+
expectedVersion?: number;
|
|
81
|
+
requestId?: string;
|
|
82
|
+
version?: number;
|
|
83
|
+
}
|
|
84
|
+
export type ServerMessage = {
|
|
85
|
+
type: 'client.setState';
|
|
86
|
+
payload: ClientSetStatePayload;
|
|
87
|
+
} | {
|
|
88
|
+
type: 'client.dispatch';
|
|
89
|
+
payload: {
|
|
90
|
+
action: {
|
|
91
|
+
type: string;
|
|
92
|
+
payload?: unknown;
|
|
93
|
+
};
|
|
94
|
+
};
|
|
95
|
+
} | {
|
|
96
|
+
type: 'client.ping';
|
|
97
|
+
};
|
|
98
|
+
export type SubscriberMessage = {
|
|
99
|
+
type: 'store.registered';
|
|
100
|
+
payload: {
|
|
101
|
+
storeId: StoreId;
|
|
102
|
+
pageId: PageId;
|
|
103
|
+
storeKey: StoreKey;
|
|
104
|
+
};
|
|
105
|
+
} | {
|
|
106
|
+
type: 'store.stateChanged';
|
|
107
|
+
payload: {
|
|
108
|
+
storeId: StoreId;
|
|
109
|
+
state: unknown;
|
|
110
|
+
version: number;
|
|
111
|
+
source: string;
|
|
112
|
+
};
|
|
113
|
+
} | {
|
|
114
|
+
type: 'store.disconnected';
|
|
115
|
+
payload: {
|
|
116
|
+
storeId: StoreId;
|
|
117
|
+
reason: string;
|
|
118
|
+
};
|
|
119
|
+
};
|
|
120
|
+
export type GatewayClientMessage = {
|
|
121
|
+
type: 'subscribe';
|
|
122
|
+
payload: {
|
|
123
|
+
storeId: StoreId;
|
|
124
|
+
};
|
|
125
|
+
} | {
|
|
126
|
+
type: 'unsubscribe';
|
|
127
|
+
payload: {
|
|
128
|
+
storeId: StoreId;
|
|
129
|
+
};
|
|
130
|
+
};
|
|
131
|
+
export interface StoreChangeEvent {
|
|
132
|
+
type: 'stateChanged' | 'disconnected';
|
|
133
|
+
storeId: StoreId;
|
|
134
|
+
state?: unknown;
|
|
135
|
+
version?: number;
|
|
136
|
+
source?: string;
|
|
137
|
+
}
|
|
138
|
+
export type BridgeEvent = {
|
|
139
|
+
type: 'stateChanged';
|
|
140
|
+
storeId: StoreId;
|
|
141
|
+
state: unknown;
|
|
142
|
+
version: number;
|
|
143
|
+
source: string;
|
|
144
|
+
} | {
|
|
145
|
+
type: 'disconnected';
|
|
146
|
+
storeId: StoreId;
|
|
147
|
+
reason: string;
|
|
148
|
+
} | {
|
|
149
|
+
type: 'connected';
|
|
150
|
+
storeId: StoreId;
|
|
151
|
+
pageId: PageId;
|
|
152
|
+
storeKey: StoreKey;
|
|
153
|
+
};
|
|
154
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
type LogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
2
|
+
type SinkMode = 'console' | 'file' | 'both' | 'disabled';
|
|
3
|
+
interface LogEntry {
|
|
4
|
+
level: LogLevel;
|
|
5
|
+
message: string;
|
|
6
|
+
data?: unknown;
|
|
7
|
+
timestamp: string;
|
|
8
|
+
}
|
|
9
|
+
export interface LoggerSink {
|
|
10
|
+
write(entry: LogEntry): Promise<void> | void;
|
|
11
|
+
clear?(): Promise<void>;
|
|
12
|
+
flush?(): Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
interface LoggerRuntimeOptions {
|
|
15
|
+
level: LogLevel;
|
|
16
|
+
mode: SinkMode;
|
|
17
|
+
logDir: string;
|
|
18
|
+
fileName: string;
|
|
19
|
+
}
|
|
20
|
+
export declare const logger: {
|
|
21
|
+
configure(overrides?: Partial<LoggerRuntimeOptions>): void;
|
|
22
|
+
setSink(sink: LoggerSink): void;
|
|
23
|
+
debug(message: string, data?: unknown): void;
|
|
24
|
+
info(message: string, data?: unknown): void;
|
|
25
|
+
warn(message: string, data?: unknown): void;
|
|
26
|
+
error(message: string, data?: unknown): void;
|
|
27
|
+
wsMessage(direction: "in" | "out", clientType: string, data: string): void;
|
|
28
|
+
getLogPath(): string;
|
|
29
|
+
clear(): Promise<void>;
|
|
30
|
+
flush(): Promise<void>;
|
|
31
|
+
};
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAKA,KAAK,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AACpD,KAAK,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;AAEzD,UAAU,QAAQ;IAChB,KAAK,EAAE,QAAQ,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC7C,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB;AAED,UAAU,oBAAoB;IAC5B,KAAK,EAAE,QAAQ,CAAC;IAChB,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAoLD,eAAO,MAAM,MAAM;0BACI,OAAO,CAAC,oBAAoB,CAAC;kBAQpC,UAAU;mBAIT,MAAM,SAAS,OAAO;kBAIvB,MAAM,SAAS,OAAO;kBAItB,MAAM,SAAS,OAAO;mBAIrB,MAAM,SAAS,OAAO;yBAIhB,IAAI,GAAG,KAAK,cAAc,MAAM,QAAQ,MAAM;kBAKrD,MAAM;aAIL,OAAO,CAAC,IAAI,CAAC;aAYb,OAAO,CAAC,IAAI,CAAC;CAK7B,CAAC"}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import { existsSync } from 'fs';
|
|
2
|
+
import { appendFile, mkdir, writeFile } from 'fs/promises';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
import { homedir } from 'os';
|
|
5
|
+
const LEVEL_PRIORITY = {
|
|
6
|
+
debug: 10,
|
|
7
|
+
info: 20,
|
|
8
|
+
warn: 30,
|
|
9
|
+
error: 40,
|
|
10
|
+
};
|
|
11
|
+
const TEST_DEFAULT_DIR = join(process.cwd(), '.agentstage-test-logs');
|
|
12
|
+
function normalizeLogLevel(value) {
|
|
13
|
+
if (!value) {
|
|
14
|
+
return 'info';
|
|
15
|
+
}
|
|
16
|
+
const level = value.toLowerCase();
|
|
17
|
+
if (level === 'debug' || level === 'info' || level === 'warn' || level === 'error') {
|
|
18
|
+
return level;
|
|
19
|
+
}
|
|
20
|
+
return 'info';
|
|
21
|
+
}
|
|
22
|
+
function normalizeSinkMode(value) {
|
|
23
|
+
if (!value) {
|
|
24
|
+
return process.env.NODE_ENV === 'test' ? 'disabled' : 'both';
|
|
25
|
+
}
|
|
26
|
+
const mode = value.toLowerCase();
|
|
27
|
+
if (mode === 'console' || mode === 'file' || mode === 'both' || mode === 'disabled') {
|
|
28
|
+
return mode;
|
|
29
|
+
}
|
|
30
|
+
return process.env.NODE_ENV === 'test' ? 'disabled' : 'both';
|
|
31
|
+
}
|
|
32
|
+
function defaultOptions() {
|
|
33
|
+
return {
|
|
34
|
+
level: normalizeLogLevel(process.env.BRIDGE_LOG_LEVEL),
|
|
35
|
+
mode: normalizeSinkMode(process.env.BRIDGE_LOG_SINK),
|
|
36
|
+
logDir: process.env.BRIDGE_LOG_DIR || (process.env.NODE_ENV === 'test' ? TEST_DEFAULT_DIR : join(homedir(), '.agentstage', 'logs')),
|
|
37
|
+
fileName: process.env.BRIDGE_LOG_FILE || 'bridge.log',
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
function toLine(entry) {
|
|
41
|
+
const dataStr = entry.data !== undefined ? ` ${JSON.stringify(entry.data)}` : '';
|
|
42
|
+
return `[${entry.timestamp}] [${entry.level.toUpperCase()}] ${entry.message}${dataStr}\n`;
|
|
43
|
+
}
|
|
44
|
+
class FileBatchSink {
|
|
45
|
+
path;
|
|
46
|
+
queue = [];
|
|
47
|
+
writing = false;
|
|
48
|
+
flushScheduled = false;
|
|
49
|
+
initialized = false;
|
|
50
|
+
constructor(path) {
|
|
51
|
+
this.path = path;
|
|
52
|
+
}
|
|
53
|
+
async write(entry) {
|
|
54
|
+
this.queue.push(toLine(entry));
|
|
55
|
+
if (!this.flushScheduled) {
|
|
56
|
+
this.flushScheduled = true;
|
|
57
|
+
setTimeout(() => {
|
|
58
|
+
this.flushScheduled = false;
|
|
59
|
+
void this.flush();
|
|
60
|
+
}, 10);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async flush() {
|
|
64
|
+
if (this.writing || this.queue.length === 0) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
this.writing = true;
|
|
68
|
+
try {
|
|
69
|
+
if (!this.initialized) {
|
|
70
|
+
await mkdir(join(this.path, '..'), { recursive: true });
|
|
71
|
+
this.initialized = true;
|
|
72
|
+
}
|
|
73
|
+
while (this.queue.length > 0) {
|
|
74
|
+
const chunk = this.queue.splice(0, this.queue.length).join('');
|
|
75
|
+
await appendFile(this.path, chunk, 'utf8');
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
finally {
|
|
79
|
+
this.writing = false;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
async clear() {
|
|
83
|
+
this.queue = [];
|
|
84
|
+
await mkdir(join(this.path, '..'), { recursive: true });
|
|
85
|
+
await writeFile(this.path, '', 'utf8');
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
class ConsoleSink {
|
|
89
|
+
write(entry) {
|
|
90
|
+
if (entry.level === 'error') {
|
|
91
|
+
console.error(entry.message, entry.data ?? '');
|
|
92
|
+
}
|
|
93
|
+
else if (entry.level === 'warn') {
|
|
94
|
+
console.warn(entry.message, entry.data ?? '');
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
console.log(entry.message, entry.data ?? '');
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
class DisabledSink {
|
|
102
|
+
write() { }
|
|
103
|
+
}
|
|
104
|
+
class CompositeSink {
|
|
105
|
+
sinks;
|
|
106
|
+
constructor(sinks) {
|
|
107
|
+
this.sinks = sinks;
|
|
108
|
+
}
|
|
109
|
+
async write(entry) {
|
|
110
|
+
for (const sink of this.sinks) {
|
|
111
|
+
await sink.write(entry);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
async clear() {
|
|
115
|
+
for (const sink of this.sinks) {
|
|
116
|
+
if (sink.clear) {
|
|
117
|
+
await sink.clear();
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
async flush() {
|
|
122
|
+
for (const sink of this.sinks) {
|
|
123
|
+
if (sink.flush) {
|
|
124
|
+
await sink.flush();
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
function createBuiltinSink(options) {
|
|
130
|
+
const logPath = join(options.logDir, options.fileName);
|
|
131
|
+
switch (options.mode) {
|
|
132
|
+
case 'disabled':
|
|
133
|
+
return new DisabledSink();
|
|
134
|
+
case 'console':
|
|
135
|
+
return new ConsoleSink();
|
|
136
|
+
case 'file':
|
|
137
|
+
return new FileBatchSink(logPath);
|
|
138
|
+
case 'both':
|
|
139
|
+
default:
|
|
140
|
+
return new CompositeSink([new ConsoleSink(), new FileBatchSink(logPath)]);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
let runtimeOptions = defaultOptions();
|
|
144
|
+
let activeSink = createBuiltinSink(runtimeOptions);
|
|
145
|
+
function shouldLog(level) {
|
|
146
|
+
return LEVEL_PRIORITY[level] >= LEVEL_PRIORITY[runtimeOptions.level];
|
|
147
|
+
}
|
|
148
|
+
function write(level, message, data) {
|
|
149
|
+
if (!shouldLog(level)) {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
const entry = {
|
|
153
|
+
level,
|
|
154
|
+
message,
|
|
155
|
+
data,
|
|
156
|
+
timestamp: new Date().toISOString(),
|
|
157
|
+
};
|
|
158
|
+
void activeSink.write(entry);
|
|
159
|
+
}
|
|
160
|
+
export const logger = {
|
|
161
|
+
configure(overrides = {}) {
|
|
162
|
+
runtimeOptions = {
|
|
163
|
+
...runtimeOptions,
|
|
164
|
+
...overrides,
|
|
165
|
+
};
|
|
166
|
+
activeSink = createBuiltinSink(runtimeOptions);
|
|
167
|
+
},
|
|
168
|
+
setSink(sink) {
|
|
169
|
+
activeSink = sink;
|
|
170
|
+
},
|
|
171
|
+
debug(message, data) {
|
|
172
|
+
write('debug', message, data);
|
|
173
|
+
},
|
|
174
|
+
info(message, data) {
|
|
175
|
+
write('info', message, data);
|
|
176
|
+
},
|
|
177
|
+
warn(message, data) {
|
|
178
|
+
write('warn', message, data);
|
|
179
|
+
},
|
|
180
|
+
error(message, data) {
|
|
181
|
+
write('error', message, data);
|
|
182
|
+
},
|
|
183
|
+
wsMessage(direction, clientType, data) {
|
|
184
|
+
const arrow = direction === 'in' ? '->' : '<-';
|
|
185
|
+
write('debug', `[WS] ${arrow} [${clientType}] ${data}`);
|
|
186
|
+
},
|
|
187
|
+
getLogPath() {
|
|
188
|
+
return join(runtimeOptions.logDir, runtimeOptions.fileName);
|
|
189
|
+
},
|
|
190
|
+
async clear() {
|
|
191
|
+
if (activeSink.clear) {
|
|
192
|
+
await activeSink.clear();
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
const logPath = this.getLogPath();
|
|
196
|
+
if (existsSync(logPath)) {
|
|
197
|
+
await writeFile(logPath, '', 'utf8');
|
|
198
|
+
}
|
|
199
|
+
},
|
|
200
|
+
async flush() {
|
|
201
|
+
if (activeSink.flush) {
|
|
202
|
+
await activeSink.flush();
|
|
203
|
+
}
|
|
204
|
+
},
|
|
205
|
+
};
|
|
206
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|