cloudflare/ts/cloudflare.classes.worker.ts

101 lines
3.4 KiB
TypeScript
Raw Normal View History

2022-09-27 19:23:20 +02:00
import * as plugins from './cloudflare.plugins.js';
import * as interfaces from './interfaces/index.js';
import { WorkerManager } from './cloudflare.classes.workermanager.js';
import { logger } from './cloudflare.logger.js';
2019-07-18 14:25:10 +02:00
2019-07-18 17:12:03 +02:00
export interface IWorkerRoute extends interfaces.ICflareWorkerRoute {
zoneName: string;
}
export interface IWorkerRouteDefinition {
zoneName: string;
pattern: string;
}
2019-07-19 12:39:39 +02:00
export class CloudflareWorker {
2019-07-18 14:25:10 +02:00
// STATIC
2020-02-09 17:36:29 +00:00
public static async fromApiObject(
workerManager: WorkerManager,
apiObject
): Promise<CloudflareWorker> {
2019-07-19 12:39:39 +02:00
const newWorker = new CloudflareWorker(workerManager);
2020-02-09 17:54:33 +00:00
Object.assign(newWorker, apiObject);
2019-07-18 17:12:03 +02:00
await newWorker.getRoutes();
return newWorker;
2019-07-18 14:25:10 +02:00
}
2019-07-18 17:12:03 +02:00
2019-07-18 14:25:10 +02:00
// INSTANCE
private workerManager: WorkerManager;
2020-02-09 17:36:29 +00:00
2019-07-18 17:12:03 +02:00
public script: string;
2019-07-18 14:25:10 +02:00
public id: string;
public etag: string;
2019-07-18 17:12:03 +02:00
// tslint:disable-next-line: variable-name
public created_on: string;
// tslint:disable-next-line: variable-name
public modified_on: string;
2019-07-18 14:25:10 +02:00
2019-07-18 17:12:03 +02:00
public routes: IWorkerRoute[] = [];
2019-07-18 14:25:10 +02:00
constructor(workerManagerArg: WorkerManager) {
this.workerManager = workerManagerArg;
}
2019-07-18 14:44:45 +02:00
/**
* gets all routes for a worker
*/
2019-07-18 17:12:03 +02:00
public async getRoutes() {
const zones = await this.workerManager.cfAccount.convenience.listZones();
2019-07-18 17:12:03 +02:00
for (const zone of zones) {
const requestRoute = `/zones/${zone.id}/workers/routes`;
2020-02-09 17:36:29 +00:00
const response: {
result: interfaces.ICflareWorkerRoute[];
} = await this.workerManager.cfAccount.request('GET', requestRoute);
2019-07-18 17:12:03 +02:00
for (const route of response.result) {
logger.log('debug', `Processing route: ${route.pattern}`);
logger.log('debug', `Comparing script: ${route.script} with worker ID: ${this.id}`);
2019-07-18 17:12:03 +02:00
if (route.script === this.id) {
2020-02-09 17:36:29 +00:00
this.routes.push({ ...route, zoneName: zone.name });
2019-07-18 17:12:03 +02:00
}
}
}
2019-07-18 14:44:45 +02:00
}
2019-07-18 14:25:10 +02:00
/**
* Sets routes for this worker
* @param routeArray Array of route definitions
*/
public async setRoutes(routeArray: IWorkerRouteDefinition[]) {
2019-07-18 17:12:03 +02:00
for (const newRoute of routeArray) {
// lets determine wether a route is new, needs an update or already up to date.
let routeStatus: 'new' | 'needsUpdate' | 'alreadyUpToDate' = 'new';
let routeIdForUpdate: string;
for (const existingRoute of this.routes) {
if (existingRoute.pattern === newRoute.pattern) {
routeStatus = 'needsUpdate';
routeIdForUpdate = existingRoute.id;
if (existingRoute.script === this.id) {
routeStatus = 'alreadyUpToDate';
2020-06-10 05:15:22 +00:00
logger.log('info', `route already exists, no update needed`);
2019-07-18 17:12:03 +02:00
}
}
}
// lets care about actually setting routes
if (routeStatus === 'new') {
2020-02-28 14:24:36 +00:00
const zoneId = await this.workerManager.cfAccount.convenience.getZoneId(newRoute.zoneName);
2019-07-18 17:12:03 +02:00
const requestRoute = `/zones/${zoneId}/workers/routes`;
await this.workerManager.cfAccount.request('POST', requestRoute, {
pattern: newRoute.pattern,
2021-01-22 20:46:26 +00:00
script: this.id,
2019-07-18 17:12:03 +02:00
});
} else if (routeStatus === 'needsUpdate') {
2020-02-28 14:24:36 +00:00
const zoneId = await this.workerManager.cfAccount.convenience.getZoneId(newRoute.zoneName);
2019-07-18 17:12:03 +02:00
const requestRoute = `/zones/${zoneId}/workers/routes/${routeIdForUpdate}`;
await this.workerManager.cfAccount.request('PUT', requestRoute, {
pattern: newRoute.pattern,
2021-01-22 20:46:26 +00:00
script: this.id,
2019-07-18 17:12:03 +02:00
});
}
}
2019-07-18 14:25:10 +02:00
}
}