@zhin.js/client 1.1.4 → 1.1.6
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/README.md +94 -432
- package/client/agent-stream.ts +121 -0
- package/client/app.test.ts +37 -0
- package/client/app.ts +130 -138
- package/client/bootstrap/loadConsoleEntries.test.ts +23 -12
- package/client/bootstrap/loadConsoleEntries.ts +40 -27
- package/client/console-client-context.ts +24 -0
- package/client/console-client.test.ts +46 -0
- package/client/console-client.ts +70 -0
- package/client/console-events.ts +38 -0
- package/client/console-utils/remoteApi.test.ts +91 -0
- package/client/console-utils/remoteApi.ts +47 -9
- package/client/index.ts +92 -28
- package/client/mediaSrc.test.ts +49 -0
- package/client/mediaSrc.ts +84 -11
- package/client/message-content/MarkdownContent.tsx +128 -0
- package/client/message-content/markdown.test.ts +48 -0
- package/client/message-content/markdown.ts +247 -0
- package/client/persistence/idb-store.test.ts +121 -0
- package/client/persistence/idb-store.ts +40 -21
- package/client/segments.test.ts +16 -0
- package/client/segments.ts +39 -0
- package/client/transport/console-transport.test.ts +394 -0
- package/client/transport/console-transport.ts +676 -0
- package/client/transport/hooks.test.ts +21 -0
- package/client/transport/hooks.ts +535 -0
- package/client/transport/index.ts +23 -0
- package/client/{websocket → transport}/types.ts +16 -17
- package/client/types.ts +5 -8
- package/client/workroom/WorkroomRunsPage.tsx +355 -0
- package/client/workroom/registerWorkroomConsole.test.ts +25 -0
- package/client/workroom/registerWorkroomConsole.ts +17 -0
- package/dist/agent-stream.d.ts +17 -0
- package/dist/agent-stream.d.ts.map +1 -0
- package/dist/agent-stream.js +73 -0
- package/dist/agent-stream.js.map +1 -0
- package/dist/app.d.ts +17 -52
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +110 -95
- package/dist/app.js.map +1 -1
- package/dist/bootstrap/loadConsoleEntries.d.ts +10 -7
- package/dist/bootstrap/loadConsoleEntries.d.ts.map +1 -1
- package/dist/bootstrap/loadConsoleEntries.js +37 -11
- package/dist/bootstrap/loadConsoleEntries.js.map +1 -1
- package/dist/console-client-context.d.ts +9 -0
- package/dist/console-client-context.d.ts.map +1 -0
- package/dist/console-client-context.js +13 -0
- package/dist/console-client-context.js.map +1 -0
- package/dist/console-client.d.ts +25 -0
- package/dist/console-client.d.ts.map +1 -0
- package/dist/console-client.js +45 -0
- package/dist/console-client.js.map +1 -0
- package/dist/console-events.d.ts +8 -0
- package/dist/console-events.d.ts.map +1 -0
- package/dist/console-events.js +26 -0
- package/dist/console-events.js.map +1 -0
- package/dist/console-utils/remoteApi.d.ts +2 -1
- package/dist/console-utils/remoteApi.d.ts.map +1 -1
- package/dist/console-utils/remoteApi.js +46 -8
- package/dist/console-utils/remoteApi.js.map +1 -1
- package/dist/index.d.ts +14 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -8
- package/dist/index.js.map +1 -1
- package/dist/mediaSrc.d.ts +1 -1
- package/dist/mediaSrc.d.ts.map +1 -1
- package/dist/mediaSrc.js +91 -11
- package/dist/mediaSrc.js.map +1 -1
- package/dist/message-content/MarkdownContent.d.ts +11 -0
- package/dist/message-content/MarkdownContent.d.ts.map +1 -0
- package/dist/message-content/MarkdownContent.js +68 -0
- package/dist/message-content/MarkdownContent.js.map +1 -0
- package/dist/message-content/markdown.d.ts +47 -0
- package/dist/message-content/markdown.d.ts.map +1 -0
- package/dist/message-content/markdown.js +219 -0
- package/dist/message-content/markdown.js.map +1 -0
- package/dist/persistence/idb-store.d.ts +5 -2
- package/dist/persistence/idb-store.d.ts.map +1 -1
- package/dist/persistence/idb-store.js +29 -20
- package/dist/persistence/idb-store.js.map +1 -1
- package/dist/segments.d.ts +9 -0
- package/dist/segments.d.ts.map +1 -0
- package/dist/segments.js +35 -0
- package/dist/segments.js.map +1 -0
- package/dist/transport/console-transport.d.ts +217 -0
- package/dist/transport/console-transport.d.ts.map +1 -0
- package/dist/transport/console-transport.js +563 -0
- package/dist/transport/console-transport.js.map +1 -0
- package/dist/transport/hooks.d.ts +253 -0
- package/dist/transport/hooks.d.ts.map +1 -0
- package/dist/transport/hooks.js +483 -0
- package/dist/transport/hooks.js.map +1 -0
- package/dist/transport/index.d.ts +4 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/index.js +4 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/{websocket → transport}/types.d.ts +14 -13
- package/dist/transport/types.d.ts.map +1 -0
- package/dist/{websocket → transport}/types.js +4 -9
- package/dist/transport/types.js.map +1 -0
- package/dist/types.d.ts +4 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/workroom/WorkroomRunsPage.d.ts +2 -0
- package/dist/workroom/WorkroomRunsPage.d.ts.map +1 -0
- package/dist/workroom/WorkroomRunsPage.js +111 -0
- package/dist/workroom/WorkroomRunsPage.js.map +1 -0
- package/dist/workroom/registerWorkroomConsole.d.ts +4 -0
- package/dist/workroom/registerWorkroomConsole.d.ts.map +1 -0
- package/dist/workroom/registerWorkroomConsole.js +16 -0
- package/dist/workroom/registerWorkroomConsole.js.map +1 -0
- package/package.json +18 -8
- package/client/runtime/index.ts +0 -12
- package/client/websocket/hooks.ts +0 -289
- package/client/websocket/index.ts +0 -6
- package/client/websocket/instance.ts +0 -24
- package/client/websocket/manager.ts +0 -426
- package/client/websocket/remote-settings.ts +0 -25
- package/dist/bootstrap/loadConsoleEntries.test.d.ts +0 -2
- package/dist/bootstrap/loadConsoleEntries.test.d.ts.map +0 -1
- package/dist/bootstrap/loadConsoleEntries.test.js +0 -27
- package/dist/bootstrap/loadConsoleEntries.test.js.map +0 -1
- package/dist/runtime/index.d.ts +0 -6
- package/dist/runtime/index.d.ts.map +0 -1
- package/dist/runtime/index.js +0 -10
- package/dist/runtime/index.js.map +0 -1
- package/dist/websocket/hooks.d.ts +0 -105
- package/dist/websocket/hooks.d.ts.map +0 -1
- package/dist/websocket/hooks.js +0 -247
- package/dist/websocket/hooks.js.map +0 -1
- package/dist/websocket/index.d.ts +0 -7
- package/dist/websocket/index.d.ts.map +0 -1
- package/dist/websocket/index.js +0 -7
- package/dist/websocket/index.js.map +0 -1
- package/dist/websocket/instance.d.ts +0 -5
- package/dist/websocket/instance.d.ts.map +0 -1
- package/dist/websocket/instance.js +0 -21
- package/dist/websocket/instance.js.map +0 -1
- package/dist/websocket/manager.d.ts +0 -113
- package/dist/websocket/manager.d.ts.map +0 -1
- package/dist/websocket/manager.js +0 -403
- package/dist/websocket/manager.js.map +0 -1
- package/dist/websocket/remote-settings.d.ts +0 -5
- package/dist/websocket/remote-settings.d.ts.map +0 -1
- package/dist/websocket/remote-settings.js +0 -23
- package/dist/websocket/remote-settings.js.map +0 -1
- package/dist/websocket/types.d.ts.map +0 -1
- package/dist/websocket/types.js.map +0 -1
package/dist/app.js
CHANGED
|
@@ -1,22 +1,3 @@
|
|
|
1
|
-
const listeners = new Set();
|
|
2
|
-
let version = 0;
|
|
3
|
-
function bump() {
|
|
4
|
-
version++;
|
|
5
|
-
for (const l of listeners)
|
|
6
|
-
l();
|
|
7
|
-
}
|
|
8
|
-
function subscribe(listener) {
|
|
9
|
-
listeners.add(listener);
|
|
10
|
-
return () => listeners.delete(listener);
|
|
11
|
-
}
|
|
12
|
-
function getVersion() {
|
|
13
|
-
return version;
|
|
14
|
-
}
|
|
15
|
-
let routes = [];
|
|
16
|
-
let tools = [];
|
|
17
|
-
let sidebarRenderer = null;
|
|
18
|
-
let toolbarRenderer = null;
|
|
19
|
-
let routeRenderer = null;
|
|
20
1
|
function slugId(name) {
|
|
21
2
|
return (name
|
|
22
3
|
.toLowerCase()
|
|
@@ -65,83 +46,117 @@ function buildToolTree(flatTools) {
|
|
|
65
46
|
}
|
|
66
47
|
return roots;
|
|
67
48
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
49
|
+
/** Owner-scoped registry for one mounted Remote Console application. */
|
|
50
|
+
export class ConsoleApp {
|
|
51
|
+
#listeners = new Set();
|
|
52
|
+
#version = 0;
|
|
53
|
+
#routes = [];
|
|
54
|
+
#tools = [];
|
|
55
|
+
#sidebarRenderer = null;
|
|
56
|
+
#toolbarRenderer = null;
|
|
57
|
+
#routeRenderer = null;
|
|
58
|
+
#disposed = false;
|
|
59
|
+
subscribe = (listener) => {
|
|
60
|
+
this.#assertActive();
|
|
61
|
+
this.#listeners.add(listener);
|
|
62
|
+
return () => this.#listeners.delete(listener);
|
|
63
|
+
};
|
|
64
|
+
getVersion = () => this.#version;
|
|
65
|
+
defineSidebar(render) {
|
|
66
|
+
this.#assertActive();
|
|
67
|
+
this.#sidebarRenderer = render;
|
|
68
|
+
this.#bump();
|
|
69
|
+
}
|
|
70
|
+
defineToolbar(render) {
|
|
71
|
+
this.#assertActive();
|
|
72
|
+
this.#toolbarRenderer = render;
|
|
73
|
+
this.#bump();
|
|
74
|
+
}
|
|
75
|
+
defineRouter(render) {
|
|
76
|
+
this.#assertActive();
|
|
77
|
+
this.#routeRenderer = render;
|
|
78
|
+
this.#bump();
|
|
79
|
+
}
|
|
80
|
+
addRoute(input) {
|
|
81
|
+
this.#assertActive();
|
|
82
|
+
const next = this.#routes.filter((route) => route.path !== input.path);
|
|
83
|
+
next.push({
|
|
84
|
+
path: input.path,
|
|
85
|
+
name: input.name,
|
|
86
|
+
element: input.element,
|
|
87
|
+
parent: input.parent ?? null,
|
|
88
|
+
icon: input.icon,
|
|
89
|
+
requiredPermissions: input.requiredPermissions,
|
|
90
|
+
requiredRoles: input.requiredRoles,
|
|
91
|
+
meta: input.meta,
|
|
92
|
+
});
|
|
93
|
+
this.#routes = next;
|
|
94
|
+
this.#bump();
|
|
95
|
+
}
|
|
96
|
+
removeRoute(path) {
|
|
97
|
+
this.#assertActive();
|
|
98
|
+
this.#routes = this.#routes.filter((route) => route.path !== path);
|
|
99
|
+
this.#bump();
|
|
100
|
+
}
|
|
101
|
+
addTool(input) {
|
|
102
|
+
this.#assertActive();
|
|
103
|
+
const id = input.id ?? `${slugId(input.name)}-${Math.random().toString(36).slice(2, 8)}`;
|
|
104
|
+
if (this.#tools.some((tool) => tool.id === id)) {
|
|
105
|
+
throw new Error(`[zhin-console] addTool: id already exists: ${id}`);
|
|
106
|
+
}
|
|
107
|
+
this.#tools = [
|
|
108
|
+
...this.#tools,
|
|
109
|
+
{
|
|
110
|
+
id,
|
|
93
111
|
name: input.name,
|
|
94
|
-
element: input.element,
|
|
95
|
-
parent: input.parent ?? null,
|
|
96
112
|
icon: input.icon,
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
return
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
113
|
+
parent: input.parent ?? null,
|
|
114
|
+
path: input.path,
|
|
115
|
+
},
|
|
116
|
+
];
|
|
117
|
+
this.#bump();
|
|
118
|
+
return id;
|
|
119
|
+
}
|
|
120
|
+
getRouteTree() {
|
|
121
|
+
return buildRouteTree(this.#routes);
|
|
122
|
+
}
|
|
123
|
+
getToolTree() {
|
|
124
|
+
return buildToolTree(this.#tools);
|
|
125
|
+
}
|
|
126
|
+
getRoutes() {
|
|
127
|
+
return this.#routes;
|
|
128
|
+
}
|
|
129
|
+
getSidebarRenderer() {
|
|
130
|
+
return this.#sidebarRenderer;
|
|
131
|
+
}
|
|
132
|
+
getToolbarRenderer() {
|
|
133
|
+
return this.#toolbarRenderer;
|
|
134
|
+
}
|
|
135
|
+
renderRouteElement(route) {
|
|
136
|
+
return this.#routeRenderer ? this.#routeRenderer(route) : route.element;
|
|
137
|
+
}
|
|
138
|
+
dispose() {
|
|
139
|
+
if (this.#disposed)
|
|
140
|
+
return;
|
|
141
|
+
this.#disposed = true;
|
|
142
|
+
this.#listeners.clear();
|
|
143
|
+
this.#routes = [];
|
|
144
|
+
this.#tools = [];
|
|
145
|
+
this.#sidebarRenderer = null;
|
|
146
|
+
this.#toolbarRenderer = null;
|
|
147
|
+
this.#routeRenderer = null;
|
|
148
|
+
}
|
|
149
|
+
#bump() {
|
|
150
|
+
this.#version += 1;
|
|
151
|
+
for (const listener of this.#listeners)
|
|
152
|
+
listener();
|
|
153
|
+
}
|
|
154
|
+
#assertActive() {
|
|
155
|
+
if (this.#disposed)
|
|
156
|
+
throw new Error('ConsoleApp has been disposed');
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
export function createConsoleApp() {
|
|
160
|
+
return new ConsoleApp();
|
|
145
161
|
}
|
|
146
|
-
export const app = createConsoleApp();
|
|
147
162
|
//# sourceMappingURL=app.js.map
|
package/dist/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../client/app.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../client/app.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type ConsoleClientEntry, type ConsoleEntriesResponse, type ConsolePluginRegister, type PluginRegisterHostApi } from '@zhin.js/contract';
|
|
2
2
|
export type FetchConsoleEntriesOptions = {
|
|
3
3
|
entriesUrl?: string;
|
|
4
4
|
signal?: AbortSignal;
|
|
@@ -13,14 +13,17 @@ export type LoadConsoleEntriesOptions = FetchConsoleEntriesOptions & {
|
|
|
13
13
|
onFetchError?: (status: number) => void;
|
|
14
14
|
onEntryError?: (entry: ConsoleClientEntry, error: unknown) => void;
|
|
15
15
|
};
|
|
16
|
-
export type CreatePluginRegisterHostApiOptions = {
|
|
17
|
-
React: PluginRegisterHostApi["React"];
|
|
18
|
-
addRoute: PluginRegisterHostApi["addRoute"];
|
|
19
|
-
addTool: PluginRegisterHostApi["addTool"];
|
|
20
|
-
};
|
|
21
|
-
export declare function createPluginRegisterHostApi(options: CreatePluginRegisterHostApiOptions): PluginRegisterHostApi;
|
|
22
16
|
export declare function fetchConsoleEntries(options?: FetchConsoleEntriesOptions): Promise<ConsoleEntriesResponse>;
|
|
23
17
|
export declare function getRegisterFn(mod: Record<string, unknown> | null | undefined): ConsolePluginRegister | null;
|
|
18
|
+
/**
|
|
19
|
+
* Convention pages (ADR 0046) export a React component as `default` + optional `meta`,
|
|
20
|
+
* without a legacy `register(api)`. Synthesize register from entry.route / entry meta
|
|
21
|
+
* so Remote Console can still mount them.
|
|
22
|
+
*/
|
|
23
|
+
export declare function resolveEntryRegister(mod: Record<string, unknown> | null | undefined, entry: ConsoleClientEntry & {
|
|
24
|
+
readonly route?: string;
|
|
25
|
+
readonly title?: string;
|
|
26
|
+
}): ConsolePluginRegister | null;
|
|
24
27
|
export declare function registerConsolePluginsFromEntries(entries: ConsoleClientEntry[], hostApi: PluginRegisterHostApi, onEntryError?: (entry: ConsoleClientEntry, error: unknown) => void, assetOrigin?: string): Promise<void>;
|
|
25
28
|
export declare function loadConsoleEntries(options: LoadConsoleEntriesOptions): Promise<void>;
|
|
26
29
|
//# sourceMappingURL=loadConsoleEntries.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loadConsoleEntries.d.ts","sourceRoot":"","sources":["../../client/bootstrap/loadConsoleEntries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"loadConsoleEntries.d.ts","sourceRoot":"","sources":["../../client/bootstrap/loadConsoleEntries.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,kBAAkB,EAAE,KAAK,sBAAsB,EAAE,KAAK,qBAAqB,EAAE,KAAK,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAG5K,MAAM,MAAM,0BAA0B,GAAG;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,SAAS,CAAC,EAAE,WAAW,GAAG,CAAC,MAAM,WAAW,CAAC,CAAC;CAC/C,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG,0BAA0B,GAAG;IACnE,mFAAmF;IACnF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,qBAAqB,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACpE,CAAC;AAoCF,wBAAsB,mBAAmB,CACvC,OAAO,CAAC,EAAE,0BAA0B,GACnC,OAAO,CAAC,sBAAsB,CAAC,CAUjC;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GAAG,qBAAqB,GAAG,IAAI,CAO3G;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,EAC/C,KAAK,EAAE,kBAAkB,GAAG;IAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/E,qBAAqB,GAAG,IAAI,CA2B9B;AAED,wBAAsB,iCAAiC,CACrD,OAAO,EAAE,kBAAkB,EAAE,EAC7B,OAAO,EAAE,qBAAqB,EAC9B,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,EAClE,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyB1F"}
|
|
@@ -1,13 +1,4 @@
|
|
|
1
|
-
import { DEFAULT_CONSOLE_BASE_PATH } from
|
|
2
|
-
export function createPluginRegisterHostApi(options) {
|
|
3
|
-
const addRoute = options.addRoute;
|
|
4
|
-
return {
|
|
5
|
-
React: options.React,
|
|
6
|
-
addRoute,
|
|
7
|
-
addPage: addRoute,
|
|
8
|
-
addTool: options.addTool,
|
|
9
|
-
};
|
|
10
|
-
}
|
|
1
|
+
import { DEFAULT_CONSOLE_BASE_PATH } from '@zhin.js/contract';
|
|
11
2
|
const CONSOLE_API_BASE_STORAGE_KEY = "zhin_api_base";
|
|
12
3
|
function resolveStoredApiBase() {
|
|
13
4
|
if (typeof window === "undefined")
|
|
@@ -65,6 +56,41 @@ export function getRegisterFn(mod) {
|
|
|
65
56
|
return d["register"];
|
|
66
57
|
return null;
|
|
67
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* Convention pages (ADR 0046) export a React component as `default` + optional `meta`,
|
|
61
|
+
* without a legacy `register(api)`. Synthesize register from entry.route / entry meta
|
|
62
|
+
* so Remote Console can still mount them.
|
|
63
|
+
*/
|
|
64
|
+
export function resolveEntryRegister(mod, entry) {
|
|
65
|
+
const named = getRegisterFn(mod);
|
|
66
|
+
if (named)
|
|
67
|
+
return named;
|
|
68
|
+
if (!mod)
|
|
69
|
+
return null;
|
|
70
|
+
const Component = mod["default"];
|
|
71
|
+
if (typeof Component !== "function" && !(Component && typeof Component === "object")) {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
const path = typeof entry.route === "string" && entry.route
|
|
75
|
+
? entry.route
|
|
76
|
+
: `/${entry.id}`;
|
|
77
|
+
const meta = mod["meta"] && typeof mod["meta"] === "object"
|
|
78
|
+
? mod["meta"]
|
|
79
|
+
: undefined;
|
|
80
|
+
const name = (typeof meta?.title === "string" && meta.title)
|
|
81
|
+
|| (typeof entry.title === "string" && entry.title)
|
|
82
|
+
|| entry.meta?.name
|
|
83
|
+
|| entry.id;
|
|
84
|
+
return (api) => {
|
|
85
|
+
api.addRoute({
|
|
86
|
+
path,
|
|
87
|
+
name,
|
|
88
|
+
element: api.React.createElement(Component),
|
|
89
|
+
...(meta?.icon != null ? { icon: meta.icon } : {}),
|
|
90
|
+
meta: { hideInMenu: meta?.hideInNav === true },
|
|
91
|
+
});
|
|
92
|
+
};
|
|
93
|
+
}
|
|
68
94
|
export async function registerConsolePluginsFromEntries(entries, hostApi, onEntryError, assetOrigin) {
|
|
69
95
|
if (!entries.length)
|
|
70
96
|
return;
|
|
@@ -72,7 +98,7 @@ export async function registerConsolePluginsFromEntries(entries, hostApi, onEntr
|
|
|
72
98
|
try {
|
|
73
99
|
const specifier = resolvePluginImportUrl(entry.resolvedModule, assetOrigin);
|
|
74
100
|
const mod = (await import(/* @vite-ignore */ specifier));
|
|
75
|
-
const register =
|
|
101
|
+
const register = resolveEntryRegister(mod, entry);
|
|
76
102
|
if (register)
|
|
77
103
|
await register(hostApi);
|
|
78
104
|
else
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loadConsoleEntries.js","sourceRoot":"","sources":["../../client/bootstrap/loadConsoleEntries.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"loadConsoleEntries.js","sourceRoot":"","sources":["../../client/bootstrap/loadConsoleEntries.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { ConsoleClient } from './console-client.js';
|
|
3
|
+
export interface ConsoleClientProviderProps {
|
|
4
|
+
readonly client: ConsoleClient;
|
|
5
|
+
readonly children?: React.ReactNode;
|
|
6
|
+
}
|
|
7
|
+
export declare function ConsoleClientProvider({ client, children, }: ConsoleClientProviderProps): React.ReactElement;
|
|
8
|
+
export declare function useConsoleClient(): ConsoleClient;
|
|
9
|
+
//# sourceMappingURL=console-client-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console-client-context.d.ts","sourceRoot":"","sources":["../client/console-client-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIzD,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CACrC;AAED,wBAAgB,qBAAqB,CAAC,EACpC,MAAM,EACN,QAAQ,GACT,EAAE,0BAA0B,GAAG,KAAK,CAAC,YAAY,CAEjD;AAED,wBAAgB,gBAAgB,IAAI,aAAa,CAMhD"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
const ConsoleClientContext = React.createContext(null);
|
|
3
|
+
export function ConsoleClientProvider({ client, children, }) {
|
|
4
|
+
return React.createElement(ConsoleClientContext.Provider, { value: client }, children);
|
|
5
|
+
}
|
|
6
|
+
export function useConsoleClient() {
|
|
7
|
+
const client = React.useContext(ConsoleClientContext);
|
|
8
|
+
if (!client) {
|
|
9
|
+
throw new Error('Console hooks require a ConsoleClientProvider');
|
|
10
|
+
}
|
|
11
|
+
return client;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=console-client-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console-client-context.js","sourceRoot":"","sources":["../client/console-client-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,MAAM,oBAAoB,GAAG,KAAK,CAAC,aAAa,CAAuB,IAAI,CAAC,CAAC;AAO7E,MAAM,UAAU,qBAAqB,CAAC,EACpC,MAAM,EACN,QAAQ,GACmB;IAC3B,OAAO,KAAK,CAAC,aAAa,CAAC,oBAAoB,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,QAAQ,CAAC,CAAC;AACzF,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC;IACtD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { PluginRegisterHostApi, RuntimeEnv } from '@zhin.js/contract';
|
|
2
|
+
import type * as React from 'react';
|
|
3
|
+
import { ConsoleApp } from './app.js';
|
|
4
|
+
import { ConsoleTransport } from './transport/console-transport.js';
|
|
5
|
+
import type { ConsoleTransportCallbacks, ConsoleTransportConfig } from './transport/types.js';
|
|
6
|
+
export interface ConsoleClientOptions {
|
|
7
|
+
readonly getRuntimeEnv?: () => RuntimeEnv;
|
|
8
|
+
readonly app?: ConsoleApp;
|
|
9
|
+
readonly transport?: ConsoleTransport;
|
|
10
|
+
readonly transportConfig?: ConsoleTransportConfig;
|
|
11
|
+
readonly transportCallbacks?: ConsoleTransportCallbacks;
|
|
12
|
+
}
|
|
13
|
+
/** Owns all mutable browser-side state for one Remote Console mount. */
|
|
14
|
+
export declare class ConsoleClient {
|
|
15
|
+
#private;
|
|
16
|
+
readonly app: ConsoleApp;
|
|
17
|
+
readonly transport: ConsoleTransport;
|
|
18
|
+
constructor(options?: ConsoleClientOptions);
|
|
19
|
+
getRuntimeEnv(): RuntimeEnv;
|
|
20
|
+
createPluginRegisterHostApi(ReactRuntime: typeof React): PluginRegisterHostApi;
|
|
21
|
+
connect(): void;
|
|
22
|
+
dispose(): void;
|
|
23
|
+
}
|
|
24
|
+
export declare function createConsoleClient(options?: ConsoleClientOptions): ConsoleClient;
|
|
25
|
+
//# sourceMappingURL=console-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console-client.d.ts","sourceRoot":"","sources":["../client/console-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,UAAU,EACX,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AACpC,OAAO,EAAE,UAAU,EAAoB,MAAM,UAAU,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,KAAK,EACV,yBAAyB,EACzB,sBAAsB,EACvB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,UAAU,CAAC;IAC1C,QAAQ,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,gBAAgB,CAAC;IACtC,QAAQ,CAAC,eAAe,CAAC,EAAE,sBAAsB,CAAC;IAClD,QAAQ,CAAC,kBAAkB,CAAC,EAAE,yBAAyB,CAAC;CACzD;AAED,wEAAwE;AACxE,qBAAa,aAAa;;IACxB,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;gBAIzB,OAAO,GAAE,oBAAyB;IAS9C,aAAa,IAAI,UAAU;IAK3B,2BAA2B,CAAC,YAAY,EAAE,OAAO,KAAK,GAAG,qBAAqB;IAS9E,OAAO,IAAI,IAAI;IAKf,OAAO,IAAI,IAAI;CAUhB;AAED,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,aAAa,CAEjF"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { createConsoleApp } from './app.js';
|
|
2
|
+
import { ConsoleTransport } from './transport/console-transport.js';
|
|
3
|
+
/** Owns all mutable browser-side state for one Remote Console mount. */
|
|
4
|
+
export class ConsoleClient {
|
|
5
|
+
app;
|
|
6
|
+
transport;
|
|
7
|
+
#getRuntimeEnv;
|
|
8
|
+
#disposed = false;
|
|
9
|
+
constructor(options = {}) {
|
|
10
|
+
this.app = options.app ?? createConsoleApp();
|
|
11
|
+
this.transport = options.transport ?? new ConsoleTransport(options.transportConfig, options.transportCallbacks);
|
|
12
|
+
this.#getRuntimeEnv = options.getRuntimeEnv ?? (() => 'production');
|
|
13
|
+
}
|
|
14
|
+
getRuntimeEnv() {
|
|
15
|
+
this.#assertActive();
|
|
16
|
+
return this.#getRuntimeEnv();
|
|
17
|
+
}
|
|
18
|
+
createPluginRegisterHostApi(ReactRuntime) {
|
|
19
|
+
this.#assertActive();
|
|
20
|
+
return {
|
|
21
|
+
React: ReactRuntime,
|
|
22
|
+
addRoute: (input) => this.app.addRoute(input),
|
|
23
|
+
addTool: (input) => this.app.addTool(input),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
connect() {
|
|
27
|
+
this.#assertActive();
|
|
28
|
+
this.transport.connect();
|
|
29
|
+
}
|
|
30
|
+
dispose() {
|
|
31
|
+
if (this.#disposed)
|
|
32
|
+
return;
|
|
33
|
+
this.#disposed = true;
|
|
34
|
+
this.transport.dispose();
|
|
35
|
+
this.app.dispose();
|
|
36
|
+
}
|
|
37
|
+
#assertActive() {
|
|
38
|
+
if (this.#disposed)
|
|
39
|
+
throw new Error('ConsoleClient has been disposed');
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export function createConsoleClient(options) {
|
|
43
|
+
return new ConsoleClient(options);
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=console-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console-client.js","sourceRoot":"","sources":["../client/console-client.ts"],"names":[],"mappings":"AAKA,OAAO,EAAc,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAcpE,wEAAwE;AACxE,MAAM,OAAO,aAAa;IACf,GAAG,CAAa;IAChB,SAAS,CAAmB;IAC5B,cAAc,CAAmB;IAC1C,SAAS,GAAG,KAAK,CAAC;IAElB,YAAY,UAAgC,EAAE;QAC5C,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,gBAAgB,EAAE,CAAC;QAC7C,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,gBAAgB,CACxD,OAAO,CAAC,eAAe,EACvB,OAAO,CAAC,kBAAkB,CAC3B,CAAC;QACF,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,aAAa,IAAI,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC;IACtE,CAAC;IAED,aAAa;QACX,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC;IAC/B,CAAC;IAED,2BAA2B,CAAC,YAA0B;QACpD,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,OAAO;YACL,KAAK,EAAE,YAAY;YACnB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;YAC7C,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC;SAC5C,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;QACzB,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACrB,CAAC;IAED,aAAa;QACX,IAAI,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACzE,CAAC;CACF;AAED,MAAM,UAAU,mBAAmB,CAAC,OAA8B;IAChE,OAAO,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ConsoleEventHistoryPage, ConsoleEventHistoryQuery } from '@zhin.js/console-protocol';
|
|
2
|
+
export interface FetchConsoleEventHistoryOptions {
|
|
3
|
+
readonly signal?: AbortSignal;
|
|
4
|
+
readonly fetch?: typeof globalThis.fetch;
|
|
5
|
+
}
|
|
6
|
+
/** Read a typed page from the Host's bounded Console event journal. */
|
|
7
|
+
export declare function fetchConsoleEventHistory(query?: ConsoleEventHistoryQuery, options?: FetchConsoleEventHistoryOptions): Promise<ConsoleEventHistoryPage>;
|
|
8
|
+
//# sourceMappingURL=console-events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console-events.d.ts","sourceRoot":"","sources":["../client/console-events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,uBAAuB,EACvB,wBAAwB,EACzB,MAAM,2BAA2B,CAAC;AAGnC,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CAC1C;AAED,uEAAuE;AACvE,wBAAsB,wBAAwB,CAC5C,KAAK,GAAE,wBAA6B,EACpC,OAAO,GAAE,+BAAoC,GAC5C,OAAO,CAAC,uBAAuB,CAAC,CAsBlC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { getToken, resolveApiUrl } from './console-utils/remoteApi.js';
|
|
2
|
+
/** Read a typed page from the Host's bounded Console event journal. */
|
|
3
|
+
export async function fetchConsoleEventHistory(query = {}, options = {}) {
|
|
4
|
+
const params = new URLSearchParams();
|
|
5
|
+
if (query.runtimeId)
|
|
6
|
+
params.set('runtimeId', query.runtimeId);
|
|
7
|
+
if (query.after !== undefined)
|
|
8
|
+
params.set('after', String(query.after));
|
|
9
|
+
if (query.limit !== undefined)
|
|
10
|
+
params.set('limit', String(query.limit));
|
|
11
|
+
const token = getToken();
|
|
12
|
+
const headers = { Accept: 'application/json' };
|
|
13
|
+
if (token)
|
|
14
|
+
headers.Authorization = `Bearer ${token}`;
|
|
15
|
+
const suffix = params.size ? `?${params}` : '';
|
|
16
|
+
const response = await (options.fetch ?? globalThis.fetch)(resolveApiUrl(`/api/events/history${suffix}`), {
|
|
17
|
+
headers,
|
|
18
|
+
signal: options.signal,
|
|
19
|
+
});
|
|
20
|
+
const body = await response.json();
|
|
21
|
+
if (!response.ok || body.success !== true || !body.data) {
|
|
22
|
+
throw new Error(body.error ?? `Console event history failed: HTTP ${response.status}`);
|
|
23
|
+
}
|
|
24
|
+
return body.data;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=console-events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console-events.js","sourceRoot":"","sources":["../client/console-events.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAOvE,uEAAuE;AACvE,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,QAAkC,EAAE,EACpC,UAA2C,EAAE;IAE7C,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;IACrC,IAAI,KAAK,CAAC,SAAS;QAAE,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAC9D,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;QAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACxE,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;QAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACxE,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,MAAM,OAAO,GAA2B,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;IACvE,IAAI,KAAK;QAAE,OAAO,CAAC,aAAa,GAAG,UAAU,KAAK,EAAE,CAAC;IACrD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/C,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC,sBAAsB,MAAM,EAAE,CAAC,EAAE;QACxG,OAAO;QACP,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAI/B,CAAC;IACF,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,sCAAsC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACzF,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC;AACnB,CAAC"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
export declare function getApiBase(): string;
|
|
2
2
|
export declare function getToken(): string | null;
|
|
3
3
|
export declare function resolveApiUrl(path: string): string;
|
|
4
|
-
export declare function resolveWebSocketUrl(path: string): string;
|
|
5
4
|
/** fetch with Bearer token; relative paths resolve against {@link getApiBase}. */
|
|
6
5
|
export declare function apiFetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response>;
|
|
6
|
+
/** Typed POST adapter for the canonical Plugin Runtime Console RPC endpoint. */
|
|
7
|
+
export declare function consoleRpc<T>(type: string, data?: Readonly<Record<string, unknown>>): Promise<T>;
|
|
7
8
|
//# sourceMappingURL=remoteApi.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remoteApi.d.ts","sourceRoot":"","sources":["../../client/console-utils/remoteApi.ts"],"names":[],"mappings":"AAGA,wBAAgB,UAAU,IAAI,MAAM,CAKnC;AAED,wBAAgB,QAAQ,IAAI,MAAM,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"remoteApi.d.ts","sourceRoot":"","sources":["../../client/console-utils/remoteApi.ts"],"names":[],"mappings":"AAGA,wBAAgB,UAAU,IAAI,MAAM,CAKnC;AAED,wBAAgB,QAAQ,IAAI,MAAM,GAAG,IAAI,CAYxC;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIlD;AAED,kFAAkF;AAClF,wBAAsB,QAAQ,CAC5B,KAAK,EAAE,WAAW,GAAG,GAAG,EACxB,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAAC,QAAQ,CAAC,CAoBnB;AAED,gFAAgF;AAChF,wBAAsB,UAAU,CAAC,CAAC,EAChC,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAM,GAC3C,OAAO,CAAC,CAAC,CAAC,CAUZ"}
|
|
@@ -3,25 +3,32 @@ const API_BASE_KEY = "zhin_api_base";
|
|
|
3
3
|
export function getApiBase() {
|
|
4
4
|
const stored = localStorage.getItem(API_BASE_KEY)?.trim();
|
|
5
5
|
if (stored)
|
|
6
|
-
return stored
|
|
6
|
+
return trimTrailingSlash(stored);
|
|
7
7
|
if (typeof window !== "undefined")
|
|
8
8
|
return window.location.origin;
|
|
9
9
|
return "";
|
|
10
10
|
}
|
|
11
11
|
export function getToken() {
|
|
12
|
-
|
|
12
|
+
const runtime = getRuntimeToken();
|
|
13
|
+
if (runtime)
|
|
14
|
+
return runtime;
|
|
15
|
+
if (typeof localStorage !== "undefined") {
|
|
16
|
+
const local = localStorage.getItem(TOKEN_KEY)?.trim();
|
|
17
|
+
if (local)
|
|
18
|
+
return local;
|
|
19
|
+
}
|
|
20
|
+
if (typeof sessionStorage !== "undefined") {
|
|
21
|
+
const session = sessionStorage.getItem(TOKEN_KEY)?.trim();
|
|
22
|
+
if (session)
|
|
23
|
+
return session;
|
|
24
|
+
}
|
|
25
|
+
return null;
|
|
13
26
|
}
|
|
14
27
|
export function resolveApiUrl(path) {
|
|
15
28
|
const base = getApiBase();
|
|
16
29
|
const p = path.startsWith("/") ? path : `/${path}`;
|
|
17
30
|
return `${base}${p}`;
|
|
18
31
|
}
|
|
19
|
-
export function resolveWebSocketUrl(path) {
|
|
20
|
-
const httpUrl = resolveApiUrl(path);
|
|
21
|
-
const url = new URL(httpUrl);
|
|
22
|
-
url.protocol = url.protocol === "https:" ? "wss:" : "ws:";
|
|
23
|
-
return url.href;
|
|
24
|
-
}
|
|
25
32
|
/** fetch with Bearer token; relative paths resolve against {@link getApiBase}. */
|
|
26
33
|
export async function apiFetch(input, init) {
|
|
27
34
|
const token = getToken();
|
|
@@ -33,9 +40,40 @@ export async function apiFetch(input, init) {
|
|
|
33
40
|
: input;
|
|
34
41
|
const res = await fetch(url, { ...init, headers });
|
|
35
42
|
if (res.status === 401) {
|
|
43
|
+
// runtime token(Demo 预置)过期后也必须失效,否则 getToken() 永远优先命中它,
|
|
44
|
+
// local/sessionStorage 清理不掉,造成 401 死循环。
|
|
45
|
+
clearRuntimeToken();
|
|
46
|
+
sessionStorage.removeItem(TOKEN_KEY);
|
|
36
47
|
localStorage.removeItem(TOKEN_KEY);
|
|
37
48
|
window.dispatchEvent(new CustomEvent("zhin:auth-required"));
|
|
38
49
|
}
|
|
39
50
|
return res;
|
|
40
51
|
}
|
|
52
|
+
/** Typed POST adapter for the canonical Plugin Runtime Console RPC endpoint. */
|
|
53
|
+
export async function consoleRpc(type, data = {}) {
|
|
54
|
+
const requestId = Date.now();
|
|
55
|
+
const res = await apiFetch('/api/console/request', {
|
|
56
|
+
method: 'POST',
|
|
57
|
+
headers: { 'Content-Type': 'application/json' },
|
|
58
|
+
body: JSON.stringify({ type, requestId, ...data }),
|
|
59
|
+
});
|
|
60
|
+
const body = await res.json();
|
|
61
|
+
if (!res.ok || !body.success)
|
|
62
|
+
throw new Error(body.error ?? `HTTP ${res.status}`);
|
|
63
|
+
return body.data;
|
|
64
|
+
}
|
|
65
|
+
function trimTrailingSlash(value) {
|
|
66
|
+
return value.endsWith("/") ? value.slice(0, -1) : value;
|
|
67
|
+
}
|
|
68
|
+
function getRuntimeToken() {
|
|
69
|
+
if (typeof window === "undefined")
|
|
70
|
+
return null;
|
|
71
|
+
const token = window.__ZHIN_API_TOKEN;
|
|
72
|
+
return token?.trim() || null;
|
|
73
|
+
}
|
|
74
|
+
function clearRuntimeToken() {
|
|
75
|
+
if (typeof window === "undefined")
|
|
76
|
+
return;
|
|
77
|
+
delete window.__ZHIN_API_TOKEN;
|
|
78
|
+
}
|
|
41
79
|
//# sourceMappingURL=remoteApi.js.map
|