@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kevisual/api",
3
- "version": "0.0.12",
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.26.2",
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.51",
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.2",
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
- export type RouterViewApi = {
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?.map(item => {
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: r.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: r.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
- if (item.worker.type === 'SharedWorker') {
211
- const port = (worker as SharedWorker).port;
212
- port.onmessage = function (e) {
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: r.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