typedserver/ts_edgeworker/classes.edgeworker.ts
2024-05-13 23:24:08 +02:00

74 lines
2.5 KiB
TypeScript

// imports
import { WorkerEvent } from './classes.workerevent.js';
import { DomainRouter } from './classes.domainrouter.js';
import * as plugins from './plugins.js';
import * as responders from './responders/index.js';
export interface IEdgeWorkerOptions {
smartlogConfig?: {
endpoint: string;
token: string;
}
}
export class EdgeWorker {
public options: IEdgeWorkerOptions;
domainRouter: DomainRouter;
constructor(optionsArg: IEdgeWorkerOptions = {}) {
this.options = optionsArg;
this.domainRouter = new DomainRouter();
addEventListener('fetch', this.fetchFunction as any);
}
public async fetchFunction (eventArg: plugins.cloudflareTypes.FetchEvent) {
if (new URL(eventArg.request.url).pathname.startsWith('/socket.io')) {
return;
}
const cworkerEvent = new WorkerEvent({
edgeWorkerRef: this,
event: eventArg,
passThroughOnException: true
});
// lets answer basic reuest things
responders.timeoutResponder(cworkerEvent);
cworkerEvent.hasResponse ? null : await responders.urlFormattingResponder(cworkerEvent);
// lets route the domain
this.domainRouter.routeToResponder(cworkerEvent);
this.domainRouter.checkWetherReRouteToRendertron(cworkerEvent);
this.domainRouter.checkWetherIsPreflight(cworkerEvent);
// guardresponder
cworkerEvent.hasResponse ? null : await responders.guardResponder(cworkerEvent);
// lets process all requests that need rendertron
cworkerEvent.hasResponse ? null : await responders.rendertronResponder(cworkerEvent);
// lets process all requests that are preflight requests
cworkerEvent.hasResponse ? null : await responders.preflightResponder(cworkerEvent);
switch (cworkerEvent.responderInstruction.type) {
case 'cache':
cworkerEvent.hasResponse ? null : await responders.cacheResponder(cworkerEvent);
break;
case 'origin':
cworkerEvent.hasResponse ? null : await responders.originResponder(cworkerEvent);
break;
case 'redirect':
cworkerEvent.hasResponse ? null : await responders.adsTxtResponder(cworkerEvent);
break;
case 'static':
cworkerEvent.hasResponse ? null : await responders.staticResponder(cworkerEvent);
break;
case 'ads.txt':
cworkerEvent.hasResponse ? null : await responders.adsTxtResponder(cworkerEvent);
break;
}
// cworkerEvent.hasResponse ? null : await responders.kvResponder(cworkerEvent);
cworkerEvent.hasResponse ? null : await responders.errorResponder(cworkerEvent);
};
}