feat(controller): Add SW-TypedRequest controller for service worker communication

This commit is contained in:
2025-12-04 21:04:33 +00:00
parent e1310269fe
commit 6308e0126d
3 changed files with 51 additions and 0 deletions

View File

@@ -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

View File

@@ -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<Response> {
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<Response> {
// HEAD request for online checking from service worker
return new Response(null, {
status: 200,
headers: {
'Content-Type': 'application/json',
},
});
}
}

View File

@@ -1,3 +1,4 @@
export * from './controller.devtools.js';
export * from './controller.typedrequest.js';
export * from './controller.swtypedrequest.js';
export * from './controller.builtin.js';