@kevisual/api 0.0.12 → 0.0.14
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/package.json +4 -4
- package/query/query-proxy/index.ts +61 -24
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kevisual/api",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.14",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "mod.ts",
|
|
6
6
|
"scripts": {
|
|
@@ -18,12 +18,12 @@
|
|
|
18
18
|
"keywords": [],
|
|
19
19
|
"author": "abearxiong <xiongxiao@xiongxiao.me> (https://www.xiongxiao.me)",
|
|
20
20
|
"license": "MIT",
|
|
21
|
-
"packageManager": "pnpm@10.
|
|
21
|
+
"packageManager": "pnpm@10.27.0",
|
|
22
22
|
"type": "module",
|
|
23
23
|
"devDependencies": {
|
|
24
24
|
"@kevisual/cache": "^0.0.4",
|
|
25
25
|
"@kevisual/query": "^0.0.33",
|
|
26
|
-
"@kevisual/router": "^0.0.
|
|
26
|
+
"@kevisual/router": "^0.0.52",
|
|
27
27
|
"@kevisual/types": "^0.0.10",
|
|
28
28
|
"@kevisual/use-config": "^1.0.21",
|
|
29
29
|
"@types/bun": "^1.3.5",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"fast-glob": "^3.3.3"
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@kevisual/js-filter": "^0.0.
|
|
35
|
+
"@kevisual/js-filter": "^0.0.3",
|
|
36
36
|
"@kevisual/load": "^0.0.6",
|
|
37
37
|
"es-toolkit": "^1.43.0",
|
|
38
38
|
"eventemitter3": "^5.0.1",
|
|
@@ -4,38 +4,46 @@ import { filter } from '@kevisual/js-filter'
|
|
|
4
4
|
import { EventEmitter } from 'eventemitter3';
|
|
5
5
|
|
|
6
6
|
export type RouterViewItem = RouterViewApi | RouterViewContext | RouterViewWorker;
|
|
7
|
-
|
|
7
|
+
type RouteViewBase = {
|
|
8
|
+
id: string;
|
|
8
9
|
title: string;
|
|
9
10
|
description: string;
|
|
11
|
+
enabled?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export type RouterViewApi = {
|
|
10
14
|
type: 'api',
|
|
11
15
|
api: {
|
|
12
16
|
url: string,
|
|
13
|
-
// 已初始化的query
|
|
17
|
+
// 已初始化的query实例,不需要编辑配置
|
|
14
18
|
query?: Query
|
|
15
19
|
}
|
|
16
|
-
}
|
|
20
|
+
} & RouteViewBase;
|
|
17
21
|
|
|
18
22
|
export type RouterViewContext = {
|
|
19
|
-
title: string;
|
|
20
|
-
description: string;
|
|
21
23
|
type: 'context',
|
|
22
24
|
context: {
|
|
23
25
|
key: string,
|
|
24
|
-
// 从context中获取router
|
|
26
|
+
// 从context中获取router,不需要编辑配置
|
|
25
27
|
router?: QueryRouterServer
|
|
26
28
|
}
|
|
27
|
-
}
|
|
29
|
+
} & RouteViewBase;
|
|
28
30
|
export type RouterViewWorker = {
|
|
29
|
-
title: string;
|
|
30
|
-
description: string;
|
|
31
31
|
type: 'worker',
|
|
32
32
|
worker: {
|
|
33
33
|
type: 'Worker' | 'SharedWorker' | 'serviceWorker',
|
|
34
34
|
url: string,
|
|
35
|
-
// 已初始化的worker
|
|
36
|
-
worker?: Worker | SharedWorker | ServiceWorker
|
|
35
|
+
// 已初始化的worker实例,不需要编辑配置
|
|
36
|
+
worker?: Worker | SharedWorker | ServiceWorker,
|
|
37
|
+
/**
|
|
38
|
+
* worker选项
|
|
39
|
+
* default: { type: 'module' }
|
|
40
|
+
*/
|
|
41
|
+
workerOptions?: {
|
|
42
|
+
type: 'module' | 'classic'
|
|
43
|
+
}
|
|
37
44
|
}
|
|
38
|
-
}
|
|
45
|
+
} & RouteViewBase;
|
|
46
|
+
|
|
39
47
|
export type RouterViewQuery = {
|
|
40
48
|
id: string,
|
|
41
49
|
query: string,
|
|
@@ -72,7 +80,7 @@ export class QueryProxy {
|
|
|
72
80
|
}
|
|
73
81
|
}
|
|
74
82
|
async initRouterViewQuery() {
|
|
75
|
-
this.routerViewItems = this.routerViewItems
|
|
83
|
+
this.routerViewItems = this.routerViewItems.map(item => {
|
|
76
84
|
if (item.type === 'api' && item.api?.url) {
|
|
77
85
|
const url = item.api.url;
|
|
78
86
|
if (item?.api?.query) return item;
|
|
@@ -80,16 +88,19 @@ export class QueryProxy {
|
|
|
80
88
|
}
|
|
81
89
|
if (item.type === 'worker' && item.worker?.url) {
|
|
82
90
|
let viewItem = item as RouterViewWorker;
|
|
91
|
+
if (!item.worker?.workerOptions?.type) {
|
|
92
|
+
item.worker.workerOptions = { ...item.worker.workerOptions, type: 'module' };
|
|
93
|
+
}
|
|
83
94
|
if (item.worker.worker) {
|
|
84
95
|
return item;
|
|
85
96
|
}
|
|
86
97
|
let worker: Worker | SharedWorker | ServiceWorker | undefined = undefined;
|
|
87
98
|
if (item.worker.type === 'SharedWorker') {
|
|
88
|
-
worker = new SharedWorker(item.worker.url);
|
|
99
|
+
worker = new SharedWorker(item.worker.url, item.worker.workerOptions);
|
|
89
100
|
worker.port.start();
|
|
90
101
|
} else if (viewItem.worker.type === 'serviceWorker') {
|
|
91
102
|
if ('serviceWorker' in navigator) {
|
|
92
|
-
navigator.serviceWorker.register(viewItem.worker.url).then(function (registration) {
|
|
103
|
+
navigator.serviceWorker.register(viewItem.worker.url, item.worker.workerOptions).then(function (registration) {
|
|
93
104
|
console.debug('注册serviceWorker成功 ', registration.scope);
|
|
94
105
|
}, function (err) {
|
|
95
106
|
console.debug('注册 serviceWorker 失败: ', err);
|
|
@@ -98,7 +109,7 @@ export class QueryProxy {
|
|
|
98
109
|
console.warn('当前浏览器不支持serviceWorker');
|
|
99
110
|
}
|
|
100
111
|
} else {
|
|
101
|
-
worker = new Worker(viewItem.worker.url);
|
|
112
|
+
worker = new Worker(viewItem.worker.url, item.worker.workerOptions);
|
|
102
113
|
}
|
|
103
114
|
viewItem['worker']['worker'] = worker;
|
|
104
115
|
}
|
|
@@ -114,6 +125,9 @@ export class QueryProxy {
|
|
|
114
125
|
}
|
|
115
126
|
}
|
|
116
127
|
return item;
|
|
128
|
+
}).filter(item => {
|
|
129
|
+
const enabled = item.enabled ?? true;
|
|
130
|
+
return enabled;
|
|
117
131
|
});
|
|
118
132
|
}
|
|
119
133
|
|
|
@@ -152,12 +166,14 @@ export class QueryProxy {
|
|
|
152
166
|
for (const r of _list) {
|
|
153
167
|
if (r.path || r.id) {
|
|
154
168
|
console.debug(`注册路由: [${r.path}] ${r?.key}`, 'API');
|
|
169
|
+
let metadata = r.metadata || {};
|
|
170
|
+
metadata.viewItem = item;
|
|
155
171
|
this.router.route({
|
|
156
172
|
path: r.path,
|
|
157
173
|
key: r.key || '',
|
|
158
174
|
id: r.id,
|
|
159
175
|
description: r.description,
|
|
160
|
-
metadata:
|
|
176
|
+
metadata: metadata,
|
|
161
177
|
}).define(async (ctx) => {
|
|
162
178
|
const msg = { ...ctx.query };
|
|
163
179
|
if (msg.token === undefined && that.token !== undefined) {
|
|
@@ -180,12 +196,14 @@ export class QueryProxy {
|
|
|
180
196
|
const routes = router.getList();
|
|
181
197
|
for (const r of routes) {
|
|
182
198
|
console.debug(`注册路由: [${r.path}] ${r?.key}`, 'Context');
|
|
199
|
+
let metadata = r.metadata || {};
|
|
200
|
+
metadata.viewItem = item;
|
|
183
201
|
this.router.route({
|
|
184
202
|
path: r.path,
|
|
185
203
|
key: r.key || '',
|
|
186
204
|
id: r.id,
|
|
187
205
|
description: r.description,
|
|
188
|
-
metadata:
|
|
206
|
+
metadata: metadata,
|
|
189
207
|
}).define(async (ctx) => {
|
|
190
208
|
const res = await router.run({ path: r.path, key: r.key, ...ctx.query });
|
|
191
209
|
ctx.forward(res)
|
|
@@ -207,14 +225,23 @@ export class QueryProxy {
|
|
|
207
225
|
console.warn('Worker not initialized');
|
|
208
226
|
return;
|
|
209
227
|
}
|
|
210
|
-
|
|
211
|
-
const
|
|
212
|
-
|
|
213
|
-
const msg = e.data;
|
|
228
|
+
const callResponse = (e: MessageEvent) => {
|
|
229
|
+
const msg = e.data;
|
|
230
|
+
if (msg.requestId) {
|
|
214
231
|
const requestId = msg.requestId;
|
|
215
232
|
that.emitter.emit(requestId, msg);
|
|
216
|
-
}
|
|
233
|
+
} else {
|
|
234
|
+
that.router.run(msg);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
if (item.worker.type === 'SharedWorker') {
|
|
238
|
+
const port = (worker as SharedWorker).port;
|
|
239
|
+
port.onmessage = callResponse;
|
|
217
240
|
port.start();
|
|
241
|
+
} else if (item.worker.type === 'serviceWorker') {
|
|
242
|
+
navigator.serviceWorker.addEventListener('message', callResponse);
|
|
243
|
+
} else {
|
|
244
|
+
(worker as Worker).onmessage = callResponse;
|
|
218
245
|
}
|
|
219
246
|
const callWorker = async (msg: any, viewItem: RouterViewWorker['worker']): Promise<Result> => {
|
|
220
247
|
const requestId = this.generateId();
|
|
@@ -243,6 +270,7 @@ export class QueryProxy {
|
|
|
243
270
|
});
|
|
244
271
|
});
|
|
245
272
|
}
|
|
273
|
+
|
|
246
274
|
const res = await callWorker({
|
|
247
275
|
path: "router",
|
|
248
276
|
key: 'list',
|
|
@@ -257,12 +285,14 @@ export class QueryProxy {
|
|
|
257
285
|
for (const r of _list) {
|
|
258
286
|
if (r.path || r.id) {
|
|
259
287
|
console.debug(`注册路由: [${r.path}] ${r?.key}`, 'API');
|
|
288
|
+
let metadata = r.metadata || {};
|
|
289
|
+
metadata.viewItem = item;
|
|
260
290
|
this.router.route({
|
|
261
291
|
path: r.path,
|
|
262
292
|
key: r.key || '',
|
|
263
293
|
id: r.id,
|
|
264
294
|
description: r.description,
|
|
265
|
-
metadata:
|
|
295
|
+
metadata: metadata,
|
|
266
296
|
}).define(async (ctx) => {
|
|
267
297
|
const msg = { ...ctx.query };
|
|
268
298
|
if (msg.token === undefined && that.token !== undefined) {
|
|
@@ -296,6 +326,13 @@ export class QueryProxy {
|
|
|
296
326
|
}
|
|
297
327
|
return routes;
|
|
298
328
|
}
|
|
329
|
+
async getViewQuery(viewId: string) {
|
|
330
|
+
const view = this.views.find(v => v.id === viewId);
|
|
331
|
+
if (view) {
|
|
332
|
+
return view.query;
|
|
333
|
+
}
|
|
334
|
+
return undefined;
|
|
335
|
+
}
|
|
299
336
|
/**
|
|
300
337
|
* 运行路由
|
|
301
338
|
* @param msg
|