feat(core): Release 6.2.0: Improved async iterator support, enhanced error handling and refined API interfaces for better type safety and consistent behavior.
This commit is contained in:
@@ -44,27 +44,52 @@ export class CloudflareWorker {
|
||||
* gets all routes for a worker
|
||||
*/
|
||||
public async getRoutes() {
|
||||
const zones = await this.workerManager.cfAccount.convenience.listZones();
|
||||
|
||||
for (const zone of zones) {
|
||||
try {
|
||||
// The official client doesn't have a direct method to list worker routes
|
||||
// We'll use the custom request method for this specific case
|
||||
const response: {
|
||||
result: interfaces.ICflareWorkerRoute[];
|
||||
} = await this.workerManager.cfAccount.request('GET', `/zones/${zone.id}/workers/routes`);
|
||||
|
||||
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}`);
|
||||
|
||||
if (route.script === this.id) {
|
||||
this.routes.push({ ...route, zoneName: zone.name });
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
logger.log('error', `Failed to get worker routes for zone ${zone.name}: ${error.message}`);
|
||||
try {
|
||||
this.routes = []; // Reset routes before fetching
|
||||
|
||||
// Get all zones using the async iterator
|
||||
const zones: plugins.ICloudflareTypes['Zone'][] = [];
|
||||
for await (const zone of this.workerManager.cfAccount.apiAccount.zones.list()) {
|
||||
zones.push(zone);
|
||||
}
|
||||
|
||||
if (zones.length === 0) {
|
||||
logger.log('warn', 'No zones found for the account');
|
||||
return;
|
||||
}
|
||||
|
||||
for (const zone of zones) {
|
||||
try {
|
||||
if (!zone || !zone.id) {
|
||||
logger.log('warn', 'Zone is missing ID property');
|
||||
continue;
|
||||
}
|
||||
|
||||
// Get worker routes for this zone
|
||||
const apiRoutes = [];
|
||||
for await (const route of this.workerManager.cfAccount.apiAccount.workers.routes.list({
|
||||
zone_id: zone.id
|
||||
})) {
|
||||
apiRoutes.push(route);
|
||||
}
|
||||
|
||||
// Filter for routes that match this worker's ID
|
||||
for (const route of apiRoutes) {
|
||||
if (route.script === this.id) {
|
||||
logger.log('debug', `Found route for worker ${this.id}: ${route.pattern}`);
|
||||
this.routes.push({ ...route, zoneName: zone.name });
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
logger.log('error', `Failed to get worker routes for zone ${zone.name || zone.id}: ${error.message}`);
|
||||
}
|
||||
}
|
||||
|
||||
logger.log('info', `Found ${this.routes.length} routes for worker ${this.id}`);
|
||||
} catch (error) {
|
||||
logger.log('error', `Failed to get routes for worker ${this.id}: ${error.message}`);
|
||||
// Initialize routes as empty array in case of error
|
||||
this.routes = [];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -73,42 +98,49 @@ export class CloudflareWorker {
|
||||
* @param routeArray Array of route definitions
|
||||
*/
|
||||
public async setRoutes(routeArray: IWorkerRouteDefinition[]) {
|
||||
// First get all existing routes to determine what we need to create/update
|
||||
await this.getRoutes();
|
||||
|
||||
for (const newRoute of routeArray) {
|
||||
// Determine whether a route is new, needs an update, or is already up to date
|
||||
let routeStatus: 'new' | 'needsUpdate' | 'alreadyUpToDate' = 'new';
|
||||
let routeIdForUpdate: string;
|
||||
let existingRouteId: string;
|
||||
|
||||
for (const existingRoute of this.routes) {
|
||||
if (existingRoute.pattern === newRoute.pattern) {
|
||||
routeStatus = 'needsUpdate';
|
||||
routeIdForUpdate = existingRoute.id;
|
||||
existingRouteId = existingRoute.id;
|
||||
|
||||
if (existingRoute.script === this.id) {
|
||||
routeStatus = 'alreadyUpToDate';
|
||||
logger.log('info', `Route already exists, no update needed`);
|
||||
logger.log('info', `Route ${newRoute.pattern} already exists, no update needed`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
try {
|
||||
const zoneId = await this.workerManager.cfAccount.convenience.getZoneId(newRoute.zoneName);
|
||||
// Get the zone ID
|
||||
const zone = await this.workerManager.cfAccount.zoneManager.getZoneByName(newRoute.zoneName);
|
||||
|
||||
// Handle route creation or update
|
||||
if (!zone) {
|
||||
logger.log('error', `Zone ${newRoute.zoneName} not found`);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Handle route creation, update, or skip if already up to date
|
||||
if (routeStatus === 'new') {
|
||||
// The official client doesn't have a direct method to create worker routes
|
||||
// We'll use the custom request method for this specific case
|
||||
await this.workerManager.cfAccount.request('POST', `/zones/${zoneId}/workers/routes`, {
|
||||
await this.workerManager.cfAccount.apiAccount.workers.routes.create({
|
||||
zone_id: zone.id,
|
||||
pattern: newRoute.pattern,
|
||||
script: this.id,
|
||||
script: this.id
|
||||
});
|
||||
|
||||
logger.log('info', `Created new route ${newRoute.pattern} for worker ${this.id}`);
|
||||
} else if (routeStatus === 'needsUpdate') {
|
||||
// The official client doesn't have a direct method to update worker routes
|
||||
// We'll use the custom request method for this specific case
|
||||
await this.workerManager.cfAccount.request('PUT', `/zones/${zoneId}/workers/routes/${routeIdForUpdate}`, {
|
||||
await this.workerManager.cfAccount.apiAccount.workers.routes.update(existingRouteId, {
|
||||
zone_id: zone.id,
|
||||
pattern: newRoute.pattern,
|
||||
script: this.id,
|
||||
script: this.id
|
||||
});
|
||||
|
||||
logger.log('info', `Updated route ${newRoute.pattern} for worker ${this.id}`);
|
||||
@@ -117,6 +149,9 @@ export class CloudflareWorker {
|
||||
logger.log('error', `Failed to set route ${newRoute.pattern}: ${error.message}`);
|
||||
}
|
||||
}
|
||||
|
||||
// Refresh routes after all changes
|
||||
await this.getRoutes();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -132,15 +167,20 @@ export class CloudflareWorker {
|
||||
try {
|
||||
logger.log('info', `Updating script for worker ${this.id}`);
|
||||
|
||||
// The official client requires the metadata property
|
||||
// Use the official client to update the script
|
||||
const updatedWorker = await this.workerManager.cfAccount.apiAccount.workers.scripts.content.update(this.id, {
|
||||
account_id: this.workerManager.cfAccount.preselectedAccountId,
|
||||
"CF-WORKER-BODY-PART": scriptContent,
|
||||
metadata: {} // Required empty object
|
||||
metadata: {}
|
||||
});
|
||||
|
||||
// Update this instance with new data
|
||||
Object.assign(this, updatedWorker);
|
||||
if (updatedWorker && typeof updatedWorker === 'object') {
|
||||
Object.assign(this, updatedWorker);
|
||||
}
|
||||
|
||||
// Always ensure the script property is updated
|
||||
this.script = scriptContent;
|
||||
|
||||
return this;
|
||||
} catch (error) {
|
||||
@@ -161,6 +201,7 @@ export class CloudflareWorker {
|
||||
try {
|
||||
logger.log('info', `Deleting worker ${this.id}`);
|
||||
|
||||
// Use the official client to delete the worker
|
||||
await this.workerManager.cfAccount.apiAccount.workers.scripts.delete(this.id, {
|
||||
account_id: this.workerManager.cfAccount.preselectedAccountId
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user