diff --git a/package.json b/package.json index 0f68aad..e10244e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@kevisual/api", - "version": "0.0.11", + "version": "0.0.12", "description": "", "main": "mod.ts", "scripts": { diff --git a/query/query-proxy/index.ts b/query/query-proxy/index.ts index 63b9265..ae5289e 100644 --- a/query/query-proxy/index.ts +++ b/query/query-proxy/index.ts @@ -5,6 +5,7 @@ import { EventEmitter } from 'eventemitter3'; export type RouterViewItem = RouterViewApi | RouterViewContext | RouterViewWorker; export type RouterViewApi = { + id: string; title: string; description: string; type: 'api', @@ -16,6 +17,7 @@ export type RouterViewApi = { } export type RouterViewContext = { + id: string; title: string; description: string; type: 'context', @@ -26,6 +28,7 @@ export type RouterViewContext = { } } export type RouterViewWorker = { + id: string; title: string; description: string; type: 'worker', @@ -33,7 +36,14 @@ export type RouterViewWorker = { type: 'Worker' | 'SharedWorker' | 'serviceWorker', url: string, // 已初始化的worker实例 - worker?: Worker | SharedWorker | ServiceWorker + worker?: Worker | SharedWorker | ServiceWorker, + /** + * worker选项 + * default: { type: 'module' } + */ + workerOptions?: { + type: 'module' | 'classic' + } } } export type RouterViewQuery = { @@ -51,15 +61,15 @@ export type RouterViewData = { export class QueryProxy { router: QueryRouterServer; token?: string; - routeViewItems: RouterViewItem[]; + routerViewItems: RouterViewItem[]; views: RouterViewQuery[]; emitter: EventEmitter; - constructor(opts?: { query: Query, router?: QueryRouterServer, token?: string, routeViewData?: RouterViewData }) { + constructor(opts?: { router?: QueryRouterServer, token?: string, routerViewData?: RouterViewData }) { this.router = opts?.router || new QueryRouterServer(); this.token = opts?.token || this.getDefulatToken(); - this.routeViewItems = opts?.routeViewData?.data?.items || []; - this.views = opts?.routeViewData?.views || []; - this.initRouteViewQuery(); + this.routerViewItems = opts?.routerViewData?.data?.items || []; + this.views = opts?.routerViewData?.views || []; + this.initRouterViewQuery(); this.emitter = new EventEmitter(); } getDefulatToken() { @@ -71,21 +81,28 @@ export class QueryProxy { return undefined; } } - async initRouteViewQuery() { - this.routeViewItems = this.routeViewItems?.map(item => { + async initRouterViewQuery() { + this.routerViewItems = this.routerViewItems?.map(item => { if (item.type === 'api' && item.api?.url) { const url = item.api.url; + if (item?.api?.query) return item; item['api'] = { url: url, query: new Query({ url: url }) }; } if (item.type === 'worker' && item.worker?.url) { let viewItem = item as RouterViewWorker; + if (!item.worker?.workerOptions?.type) { + item.worker.workerOptions = { ...item.worker.workerOptions, type: 'module' }; + } + if (item.worker.worker) { + return item; + } let worker: Worker | SharedWorker | ServiceWorker | undefined = undefined; if (item.worker.type === 'SharedWorker') { - worker = new SharedWorker(item.worker.url); + worker = new SharedWorker(item.worker.url, item.worker.workerOptions); worker.port.start(); } else if (viewItem.worker.type === 'serviceWorker') { if ('serviceWorker' in navigator) { - navigator.serviceWorker.register(viewItem.worker.url).then(function (registration) { + navigator.serviceWorker.register(viewItem.worker.url, item.worker.workerOptions).then(function (registration) { console.debug('注册serviceWorker成功 ', registration.scope); }, function (err) { console.debug('注册 serviceWorker 失败: ', err); @@ -94,11 +111,14 @@ export class QueryProxy { console.warn('当前浏览器不支持serviceWorker'); } } else { - worker = new Worker(viewItem.worker.url); + worker = new Worker(viewItem.worker.url, item.worker.workerOptions); } viewItem['worker']['worker'] = worker; } if (item.type === 'context' && item.context?.key) { + if (item.context?.router) { + return item; + } // @ts-ignore const context = globalThis['context'] || {} const router = context[item.context.key] as QueryRouterServer; @@ -114,13 +134,13 @@ export class QueryProxy { * 初始化路由 * @returns */ - async init(routeViewData?: RouterViewData) { - const routes = routeViewData?.data?.items || []; - if (routes.length === 0) { + async init() { + const routerViewItems = this.routerViewItems || []; + if (routerViewItems.length === 0) { await this.initApi(); return; } - for (const item of routes) { + for (const item of routerViewItems) { switch (item.type) { case 'api': this.initApi(item); @@ -145,12 +165,14 @@ export class QueryProxy { for (const r of _list) { if (r.path || r.id) { console.debug(`注册路由: [${r.path}] ${r?.key}`, 'API'); + let metadata = r.metadata || {}; + metadata.viewItem = item; this.router.route({ path: r.path, key: r.key || '', id: r.id, description: r.description, - metadata: r.metadata, + metadata: metadata, }).define(async (ctx) => { const msg = { ...ctx.query }; if (msg.token === undefined && that.token !== undefined) { @@ -173,12 +195,14 @@ export class QueryProxy { const routes = router.getList(); for (const r of routes) { console.debug(`注册路由: [${r.path}] ${r?.key}`, 'Context'); + let metadata = r.metadata || {}; + metadata.viewItem = item; this.router.route({ path: r.path, key: r.key || '', id: r.id, description: r.description, - metadata: r.metadata, + metadata: metadata, }).define(async (ctx) => { const res = await router.run({ path: r.path, key: r.key, ...ctx.query }); ctx.forward(res) @@ -200,14 +224,23 @@ export class QueryProxy { console.warn('Worker not initialized'); return; } - if (item.worker.type === 'SharedWorker') { - const port = (worker as SharedWorker).port; - port.onmessage = function (e) { - const msg = e.data; + const callResponse = (e: MessageEvent) => { + const msg = e.data; + if (msg.requestId) { const requestId = msg.requestId; that.emitter.emit(requestId, msg); - }; + } else { + that.router.run(msg); + } + } + if (item.worker.type === 'SharedWorker') { + const port = (worker as SharedWorker).port; + port.onmessage = callResponse; port.start(); + } else if (item.worker.type === 'serviceWorker') { + navigator.serviceWorker.addEventListener('message', callResponse); + } else { + (worker as Worker).onmessage = callResponse; } const callWorker = async (msg: any, viewItem: RouterViewWorker['worker']): Promise => { const requestId = this.generateId(); @@ -236,6 +269,7 @@ export class QueryProxy { }); }); } + const res = await callWorker({ path: "router", key: 'list', @@ -250,12 +284,14 @@ export class QueryProxy { for (const r of _list) { if (r.path || r.id) { console.debug(`注册路由: [${r.path}] ${r?.key}`, 'API'); + let metadata = r.metadata || {}; + metadata.viewItem = item; this.router.route({ path: r.path, key: r.key || '', id: r.id, description: r.description, - metadata: r.metadata, + metadata: metadata, }).define(async (ctx) => { const msg = { ...ctx.query }; if (msg.token === undefined && that.token !== undefined) {