diff --git a/ts/classes.typedserver.ts b/ts/classes.typedserver.ts index bace93b..48f0067 100644 --- a/ts/classes.typedserver.ts +++ b/ts/classes.typedserver.ts @@ -3,6 +3,7 @@ import * as paths from './paths.js'; import * as interfaces from '../dist_ts_interfaces/index.js'; import { DevToolsController } from './controllers/controller.devtools.js'; import { TypedRequestController } from './controllers/controller.typedrequest.js'; +import { SwTypedRequestController } from './controllers/controller.swtypedrequest.js'; import { BuiltInRoutesController } from './controllers/controller.builtin.js'; export interface IServerOptions { @@ -95,6 +96,7 @@ export class TypedServer { // Decorated controllers private devToolsController: DevToolsController; private typedRequestController: TypedRequestController; + private swTypedRequestController: SwTypedRequestController; private builtInRoutesController: BuiltInRoutesController; // File server for static files @@ -220,6 +222,7 @@ export class TypedServer { } this.typedRequestController = new TypedRequestController(this.typedrouter); + this.swTypedRequestController = new SwTypedRequestController(this.typedrouter); this.builtInRoutesController = new BuiltInRoutesController({ domain: this.options.domain, @@ -239,6 +242,7 @@ export class TypedServer { plugins.smartserve.ControllerRegistry.registerInstance(this.devToolsController); } plugins.smartserve.ControllerRegistry.registerInstance(this.typedRequestController); + plugins.smartserve.ControllerRegistry.registerInstance(this.swTypedRequestController); plugins.smartserve.ControllerRegistry.registerInstance(this.builtInRoutesController); // Compile routes for fast matching diff --git a/ts/controllers/controller.swtypedrequest.ts b/ts/controllers/controller.swtypedrequest.ts new file mode 100644 index 0000000..5f53665 --- /dev/null +++ b/ts/controllers/controller.swtypedrequest.ts @@ -0,0 +1,46 @@ +import * as plugins from '../plugins.js'; + +/** + * SW-TypedRequest controller for service worker type-safe RPC endpoint + * This provides a separate endpoint for service worker communication + */ +@plugins.smartserve.Route('/sw-typedrequest') +export class SwTypedRequestController { + private typedRouter: plugins.typedrequest.TypedRouter; + + constructor(typedRouter: plugins.typedrequest.TypedRouter) { + this.typedRouter = typedRouter; + } + + @plugins.smartserve.Post('/') + async handleSwTypedRequest(ctx: plugins.smartserve.IRequestContext): Promise { + try { + const response = await this.typedRouter.routeAndAddResponse(ctx.body as plugins.typedrequestInterfaces.ITypedRequest); + + return new Response(plugins.smartjson.stringify(response), { + status: 200, + headers: { + 'Content-Type': 'application/json', + }, + }); + } catch (error) { + return new Response(JSON.stringify({ error: 'Invalid request' }), { + status: 400, + headers: { + 'Content-Type': 'application/json', + }, + }); + } + } + + @plugins.smartserve.Head('/') + async handleSwTypedRequestHead(): Promise { + // HEAD request for online checking from service worker + return new Response(null, { + status: 200, + headers: { + 'Content-Type': 'application/json', + }, + }); + } +} diff --git a/ts/controllers/index.ts b/ts/controllers/index.ts index d553af1..f2e4287 100644 --- a/ts/controllers/index.ts +++ b/ts/controllers/index.ts @@ -1,3 +1,4 @@ export * from './controller.devtools.js'; export * from './controller.typedrequest.js'; +export * from './controller.swtypedrequest.js'; export * from './controller.builtin.js';