@kevisual/api 0.0.14 → 0.0.15

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.14",
3
+ "version": "0.0.15",
4
4
  "description": "",
5
5
  "main": "mod.ts",
6
6
  "scripts": {
@@ -3,7 +3,9 @@ import { QueryRouterServer, Route } from '@kevisual/router/src/route.ts';
3
3
  import { filter } from '@kevisual/js-filter'
4
4
  import { EventEmitter } from 'eventemitter3';
5
5
 
6
- export type RouterViewItem = RouterViewApi | RouterViewContext | RouterViewWorker;
6
+ export const RouteTypeList = ['api', 'context', 'worker', 'page'] as const;
7
+ export type RouterViewItem = RouterViewApi | RouterViewContext | RouterViewWorker | RouteViewPage;
8
+
7
9
  type RouteViewBase = {
8
10
  id: string;
9
11
  title: string;
@@ -44,6 +46,16 @@ export type RouterViewWorker = {
44
46
  }
45
47
  } & RouteViewBase;
46
48
 
49
+ /**
50
+ * 注入 js 的url地址,使用importScripts加载
51
+ */
52
+ export type RouteViewPage = {
53
+ type: 'page',
54
+ page: {
55
+ url: string,
56
+ }
57
+ } & RouteViewBase;
58
+
47
59
  export type RouterViewQuery = {
48
60
  id: string,
49
61
  query: string,
@@ -138,21 +150,44 @@ export class QueryProxy {
138
150
  async init() {
139
151
  const routerViewItems = this.routerViewItems || [];
140
152
  if (routerViewItems.length === 0) {
153
+ // 默认初始化api类型路由
141
154
  await this.initApi();
142
155
  return;
143
156
  }
144
157
  for (const item of routerViewItems) {
145
158
  switch (item.type) {
146
159
  case 'api':
147
- this.initApi(item);
160
+ await this.initApi(item);
148
161
  break;
149
162
  case 'context':
163
+ await this.initContext(item);
150
164
  break;
151
165
  case 'worker':
152
- this.initWorker(item);
166
+ await this.initWorker(item);
167
+ break;
168
+ case 'page':
169
+ await this.initPage(item);
153
170
  break;
154
171
  }
155
172
  }
173
+ this.emitter.emit('initComplete');
174
+ }
175
+ /**
176
+ * 监听初始化完成
177
+ * @returns
178
+ */
179
+ async listenInitComplete(): Promise<boolean> {
180
+ return new Promise((resolve) => {
181
+ const timer = setTimeout(() => {
182
+ this.emitter.removeAllListeners('initComplete');
183
+ resolve(false);
184
+ }, 3 * 60000); // 3分钟超时
185
+ const func = () => {
186
+ clearTimeout(timer);
187
+ resolve(true);
188
+ }
189
+ this.emitter.once('initComplete', func);
190
+ });
156
191
  }
157
192
  async initApi(item?: RouterViewApi) {
158
193
  const that = this;
@@ -304,6 +339,23 @@ export class QueryProxy {
304
339
  }
305
340
  }
306
341
  }
342
+ async initPage(item?: RouteViewPage) {
343
+ if (!item?.page?.url) {
344
+ console.warn('Page地址未提供');
345
+ return;
346
+ }
347
+ const url = item.page.url;
348
+ try {
349
+ if (typeof window !== 'undefined') {
350
+ await import(url).then((module) => { }).catch((err) => {
351
+ console.error('引入Page脚本失败:', url, err);
352
+ });
353
+ }
354
+ } catch (e) {
355
+ console.warn('引入Page脚本失败:', url, e);
356
+ return;
357
+ }
358
+ }
307
359
  /**
308
360
  * 列出路由
309
361
  * @param filter