@webiny/api-scheduler-aws 6.5.0-beta.4 → 6.5.0-beta.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,7 +7,7 @@ import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/i
7
7
  import { GetTenantByIdUseCase } from "@webiny/api-core/exports/api/tenancy.js";
8
8
  const canHandle = (event)=>{
9
9
  if ("function" != typeof event?.hasOwnProperty) return false;
10
- if (!event.hasOwnProperty(SCHEDULED_ACTION_EVENT_IDENTIFIER)) return false;
10
+ else if (!event.hasOwnProperty(SCHEDULED_ACTION_EVENT_IDENTIFIER)) return false;
11
11
  const value = event[SCHEDULED_ACTION_EVENT_IDENTIFIER];
12
12
  return !!(value?.id && value?.scheduleFor);
13
13
  };
@@ -1 +1 @@
1
- {"version":3,"file":"createEventHandler.js","sources":["../src/createEventHandler.ts"],"sourcesContent":["import { registry } from \"@webiny/handler-aws/registry.js\";\nimport type { HandlerFactoryParams } from \"@webiny/handler-aws/types.js\";\nimport { createSourceHandler } from \"@webiny/handler-aws/sourceHandler.js\";\nimport { createEventHandler, createHandler } from \"@webiny/handler-aws/raw/index.js\";\nimport { SCHEDULED_ACTION_EVENT_IDENTIFIER } from \"@webiny/api-scheduler/constants.js\";\nimport { ExecuteScheduledActionUseCase } from \"@webiny/api-scheduler/features/ExecuteScheduledAction/index.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport { GetTenantByIdUseCase } from \"@webiny/api-core/exports/api/tenancy.js\";\n\nexport interface IScheduledActionEventPayload {\n namespace: string;\n id: string;\n scheduleFor: string;\n tenant: string;\n}\n\nexport interface IScheduledActionEvent {\n [SCHEDULED_ACTION_EVENT_IDENTIFIER]: IScheduledActionEventPayload;\n}\n\nexport interface HandlerParams extends HandlerFactoryParams {\n debug?: boolean;\n}\n\nconst canHandle = (event: Partial<IScheduledActionEvent>): boolean => {\n if (typeof event?.hasOwnProperty !== \"function\") {\n return false;\n } else if (!event.hasOwnProperty(SCHEDULED_ACTION_EVENT_IDENTIFIER)) {\n return false;\n }\n\n const value = event[SCHEDULED_ACTION_EVENT_IDENTIFIER];\n return !!(value?.id && value?.scheduleFor);\n};\n\nconst handler = createSourceHandler<IScheduledActionEvent, HandlerParams>({\n name: \"handler-aws-event-bridge-scheduled-cms-action-event\",\n canUse: canHandle,\n handle: async ({ params, event, context }) => {\n return createHandler(params)(event, context);\n }\n});\n\nregistry.register(handler);\n\nexport const createScheduledActionEventHandler = () => {\n return createEventHandler<IScheduledActionEvent>({\n canHandle,\n handle: async params => {\n const { payload, context } = params;\n const input = payload[SCHEDULED_ACTION_EVENT_IDENTIFIER];\n\n const tenantContext = context.container.resolve(TenantContext);\n /**\n * Use default tenant if tenant is not provided in the payload.\n * This allows backward compatibility with existing scheduled actions that do not have tenant information in their payload.\n */\n if (!input.tenant) {\n input.tenant = tenantContext.getTenant().id;\n }\n const getTenantByIdUseCase = context.container.resolve(GetTenantByIdUseCase);\n const tenantResult = await getTenantByIdUseCase.execute(input.tenant);\n if (tenantResult.isFail()) {\n throw tenantResult.error;\n }\n const tenant = tenantResult.value;\n\n return tenantContext.withTenant(tenant, async () => {\n const executeScheduledAction = context.container.resolve(\n ExecuteScheduledActionUseCase\n );\n const result = await executeScheduledAction.execute(input);\n\n if (result.isFail()) {\n const error = result.error;\n console.error(error.code, error.message);\n throw error;\n }\n return {\n success: true\n };\n });\n }\n });\n};\n"],"names":["canHandle","event","SCHEDULED_ACTION_EVENT_IDENTIFIER","value","handler","createSourceHandler","params","context","createHandler","registry","createScheduledActionEventHandler","createEventHandler","payload","input","tenantContext","TenantContext","getTenantByIdUseCase","GetTenantByIdUseCase","tenantResult","tenant","executeScheduledAction","ExecuteScheduledActionUseCase","result","error","console"],"mappings":";;;;;;;AAwBA,MAAMA,YAAY,CAACC;IACf,IAAI,AAAiC,cAAjC,OAAOA,OAAO,gBACd,OAAO;IACJ,IAAI,CAACA,MAAM,cAAc,CAACC,oCAC7B,OAAO;IAGX,MAAMC,QAAQF,KAAK,CAACC,kCAAkC;IACtD,OAAO,CAAC,CAAEC,CAAAA,OAAO,MAAMA,OAAO,WAAU;AAC5C;AAEA,MAAMC,UAAUC,oBAA0D;IACtE,MAAM;IACN,QAAQL;IACR,QAAQ,OAAO,EAAEM,MAAM,EAAEL,KAAK,EAAEM,OAAO,EAAE,GAC9BC,cAAcF,QAAQL,OAAOM;AAE5C;AAEAE,SAAS,QAAQ,CAACL;AAEX,MAAMM,oCAAoC,IACtCC,mBAA0C;QAC7CX,WAAAA;QACA,QAAQ,OAAMM;YACV,MAAM,EAAEM,OAAO,EAAEL,OAAO,EAAE,GAAGD;YAC7B,MAAMO,QAAQD,OAAO,CAACV,kCAAkC;YAExD,MAAMY,gBAAgBP,QAAQ,SAAS,CAAC,OAAO,CAACQ;YAKhD,IAAI,CAACF,MAAM,MAAM,EACbA,MAAM,MAAM,GAAGC,cAAc,SAAS,GAAG,EAAE;YAE/C,MAAME,uBAAuBT,QAAQ,SAAS,CAAC,OAAO,CAACU;YACvD,MAAMC,eAAe,MAAMF,qBAAqB,OAAO,CAACH,MAAM,MAAM;YACpE,IAAIK,aAAa,MAAM,IACnB,MAAMA,aAAa,KAAK;YAE5B,MAAMC,SAASD,aAAa,KAAK;YAEjC,OAAOJ,cAAc,UAAU,CAACK,QAAQ;gBACpC,MAAMC,yBAAyBb,QAAQ,SAAS,CAAC,OAAO,CACpDc;gBAEJ,MAAMC,SAAS,MAAMF,uBAAuB,OAAO,CAACP;gBAEpD,IAAIS,OAAO,MAAM,IAAI;oBACjB,MAAMC,QAAQD,OAAO,KAAK;oBAC1BE,QAAQ,KAAK,CAACD,MAAM,IAAI,EAAEA,MAAM,OAAO;oBACvC,MAAMA;gBACV;gBACA,OAAO;oBACH,SAAS;gBACb;YACJ;QACJ;IACJ"}
1
+ {"version":3,"file":"createEventHandler.js","sources":["../src/createEventHandler.ts"],"sourcesContent":["import { registry } from \"@webiny/handler-aws/registry.js\";\nimport type { HandlerFactoryParams } from \"@webiny/handler-aws/types.js\";\nimport { createSourceHandler } from \"@webiny/handler-aws/sourceHandler.js\";\nimport { createEventHandler, createHandler } from \"@webiny/handler-aws/raw/index.js\";\nimport { SCHEDULED_ACTION_EVENT_IDENTIFIER } from \"@webiny/api-scheduler/constants.js\";\nimport { ExecuteScheduledActionUseCase } from \"@webiny/api-scheduler/features/ExecuteScheduledAction/index.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport { GetTenantByIdUseCase } from \"@webiny/api-core/exports/api/tenancy.js\";\n\nexport interface IScheduledActionEventPayload {\n namespace: string;\n id: string;\n scheduleFor: string;\n tenant: string;\n}\n\nexport interface IScheduledActionEvent {\n [SCHEDULED_ACTION_EVENT_IDENTIFIER]: IScheduledActionEventPayload;\n}\n\nexport interface HandlerParams extends HandlerFactoryParams {\n debug?: boolean;\n}\n\nconst canHandle = (event: Partial<IScheduledActionEvent>): boolean => {\n if (typeof event?.hasOwnProperty !== \"function\") {\n return false;\n } else if (!event.hasOwnProperty(SCHEDULED_ACTION_EVENT_IDENTIFIER)) {\n return false;\n }\n\n const value = event[SCHEDULED_ACTION_EVENT_IDENTIFIER];\n return !!(value?.id && value?.scheduleFor);\n};\n\nconst handler = createSourceHandler<IScheduledActionEvent, HandlerParams>({\n name: \"handler-aws-event-bridge-scheduled-cms-action-event\",\n canUse: canHandle,\n handle: async ({ params, event, context }) => {\n return createHandler(params)(event, context);\n }\n});\n\nregistry.register(handler);\n\nexport const createScheduledActionEventHandler = () => {\n return createEventHandler<IScheduledActionEvent>({\n canHandle,\n handle: async params => {\n const { payload, context } = params;\n const input = payload[SCHEDULED_ACTION_EVENT_IDENTIFIER];\n\n const tenantContext = context.container.resolve(TenantContext);\n /**\n * Use default tenant if tenant is not provided in the payload.\n * This allows backward compatibility with existing scheduled actions that do not have tenant information in their payload.\n */\n if (!input.tenant) {\n input.tenant = tenantContext.getTenant().id;\n }\n const getTenantByIdUseCase = context.container.resolve(GetTenantByIdUseCase);\n const tenantResult = await getTenantByIdUseCase.execute(input.tenant);\n if (tenantResult.isFail()) {\n throw tenantResult.error;\n }\n const tenant = tenantResult.value;\n\n return tenantContext.withTenant(tenant, async () => {\n const executeScheduledAction = context.container.resolve(\n ExecuteScheduledActionUseCase\n );\n const result = await executeScheduledAction.execute(input);\n\n if (result.isFail()) {\n const error = result.error;\n console.error(error.code, error.message);\n throw error;\n }\n return {\n success: true\n };\n });\n }\n });\n};\n"],"names":["canHandle","event","SCHEDULED_ACTION_EVENT_IDENTIFIER","value","handler","createSourceHandler","params","context","createHandler","registry","createScheduledActionEventHandler","createEventHandler","payload","input","tenantContext","TenantContext","getTenantByIdUseCase","GetTenantByIdUseCase","tenantResult","tenant","executeScheduledAction","ExecuteScheduledActionUseCase","result","error","console"],"mappings":";;;;;;;AAwBA,MAAMA,YAAY,CAACC;IACf,IAAI,AAAiC,cAAjC,OAAOA,OAAO,gBACd,OAAO;SACJ,IAAI,CAACA,MAAM,cAAc,CAACC,oCAC7B,OAAO;IAGX,MAAMC,QAAQF,KAAK,CAACC,kCAAkC;IACtD,OAAO,CAAC,CAAEC,CAAAA,OAAO,MAAMA,OAAO,WAAU;AAC5C;AAEA,MAAMC,UAAUC,oBAA0D;IACtE,MAAM;IACN,QAAQL;IACR,QAAQ,OAAO,EAAEM,MAAM,EAAEL,KAAK,EAAEM,OAAO,EAAE,GAC9BC,cAAcF,QAAQL,OAAOM;AAE5C;AAEAE,SAAS,QAAQ,CAACL;AAEX,MAAMM,oCAAoC,IACtCC,mBAA0C;QAC7CX,WAAAA;QACA,QAAQ,OAAMM;YACV,MAAM,EAAEM,OAAO,EAAEL,OAAO,EAAE,GAAGD;YAC7B,MAAMO,QAAQD,OAAO,CAACV,kCAAkC;YAExD,MAAMY,gBAAgBP,QAAQ,SAAS,CAAC,OAAO,CAACQ;YAKhD,IAAI,CAACF,MAAM,MAAM,EACbA,MAAM,MAAM,GAAGC,cAAc,SAAS,GAAG,EAAE;YAE/C,MAAME,uBAAuBT,QAAQ,SAAS,CAAC,OAAO,CAACU;YACvD,MAAMC,eAAe,MAAMF,qBAAqB,OAAO,CAACH,MAAM,MAAM;YACpE,IAAIK,aAAa,MAAM,IACnB,MAAMA,aAAa,KAAK;YAE5B,MAAMC,SAASD,aAAa,KAAK;YAEjC,OAAOJ,cAAc,UAAU,CAACK,QAAQ;gBACpC,MAAMC,yBAAyBb,QAAQ,SAAS,CAAC,OAAO,CACpDc;gBAEJ,MAAMC,SAAS,MAAMF,uBAAuB,OAAO,CAACP;gBAEpD,IAAIS,OAAO,MAAM,IAAI;oBACjB,MAAMC,QAAQD,OAAO,KAAK;oBAC1BE,QAAQ,KAAK,CAACD,MAAM,IAAI,EAAEA,MAAM,OAAO;oBACvC,MAAMA;gBACV;gBACA,OAAO;oBACH,SAAS;gBACb;YACJ;QACJ;IACJ"}
@@ -12,6 +12,8 @@ export declare class EventBridgeSchedulerService implements SchedulerService.Int
12
12
  update(params: SchedulerService.UpdateParams): Promise<void>;
13
13
  delete(params: SchedulerService.DeleteParams): Promise<void>;
14
14
  exists(params: SchedulerService.ExistsParams): Promise<boolean>;
15
+ private createInternal;
16
+ private updateInternal;
15
17
  private createScheduleExpression;
16
18
  private createScheduledActionEventInput;
17
19
  private createScheduledActionEventPayload;
@@ -1,5 +1,5 @@
1
1
  import { WebinyError } from "@webiny/error";
2
- import { CreateScheduleCommand, DeleteScheduleCommand, GetScheduleCommand, UpdateScheduleCommand } from "@webiny/aws-sdk/client-scheduler/index.js";
2
+ import { CreateScheduleCommand, DeleteScheduleCommand, GetScheduleCommand, ResourceNotFoundException, UpdateScheduleCommand } from "@webiny/aws-sdk/client-scheduler/index.js";
3
3
  import { SCHEDULED_ACTION_EVENT_IDENTIFIER } from "@webiny/api-scheduler/constants.js";
4
4
  class EventBridgeSchedulerService {
5
5
  constructor(getClient, config){
@@ -7,19 +7,52 @@ class EventBridgeSchedulerService {
7
7
  this.config = config;
8
8
  }
9
9
  async create(params) {
10
- const { id, scheduleFor, tenant, namespace } = params;
10
+ const exists = await this.exists(params);
11
+ if (exists) return this.updateInternal(params);
12
+ return await this.createInternal(params);
13
+ }
14
+ async update(params) {
15
+ const exists = await this.exists(params);
16
+ if (exists) return await this.updateInternal(params);
17
+ return await this.create(params);
18
+ }
19
+ async delete(params) {
20
+ const client = this.getClient();
21
+ const exists = await this.exists(params);
22
+ if (!exists) throw new WebinyError(`Cannot delete schedule "${params.id}", tenant "${params.tenant}", because it does not exist.`);
23
+ const name = this.createScheduleName(params);
24
+ try {
25
+ await client.send(new DeleteScheduleCommand({
26
+ Name: name
27
+ }));
28
+ } catch (ex) {
29
+ if (ex instanceof ResourceNotFoundException) return;
30
+ else if ("ResourceNotFoundException" === ex.name) return;
31
+ throw WebinyError.from(ex);
32
+ }
33
+ }
34
+ async exists(params) {
35
+ const client = this.getClient();
36
+ const name = this.createScheduleName(params);
37
+ try {
38
+ await client.send(new GetScheduleCommand({
39
+ Name: name
40
+ }));
41
+ return true;
42
+ } catch (ex) {
43
+ if (ex instanceof ResourceNotFoundException) return false;
44
+ else if ("ResourceNotFoundException" === ex.name) return false;
45
+ throw ex;
46
+ }
47
+ }
48
+ async createInternal(params) {
49
+ const { id, scheduleFor, tenant } = params;
11
50
  if (scheduleFor <= new Date()) throw new WebinyError(`Cannot create a schedule for "${id}" with date in the past`, "INVALID_SCHEDULE_DATE", {
12
51
  scheduleFor,
13
52
  tenant,
14
53
  id
15
54
  });
16
55
  const client = this.getClient();
17
- const exists = await this.exists({
18
- id,
19
- tenant,
20
- namespace
21
- });
22
- if (exists) return this.update(params);
23
56
  await client.send(new CreateScheduleCommand({
24
57
  Name: this.createScheduleName(params),
25
58
  ScheduleExpression: this.createScheduleExpression(scheduleFor),
@@ -34,7 +67,7 @@ class EventBridgeSchedulerService {
34
67
  ActionAfterCompletion: "DELETE"
35
68
  }));
36
69
  }
37
- async update(params) {
70
+ async updateInternal(params) {
38
71
  const { id, scheduleFor } = params;
39
72
  if (scheduleFor <= new Date()) throw new WebinyError(`Cannot update an existing schedule for "${id}" with date in the past`, "INVALID_SCHEDULE_DATE", {
40
73
  scheduleFor,
@@ -55,33 +88,6 @@ class EventBridgeSchedulerService {
55
88
  ActionAfterCompletion: "DELETE"
56
89
  }));
57
90
  }
58
- async delete(params) {
59
- const client = this.getClient();
60
- const exists = await this.exists(params);
61
- if (!exists) throw new WebinyError(`Cannot delete schedule "${params.id}", tenant "${params.tenant}", because it does not exist.`);
62
- const name = this.createScheduleName(params);
63
- try {
64
- await client.send(new DeleteScheduleCommand({
65
- Name: name
66
- }));
67
- } catch (ex) {
68
- if ("ResourceNotFoundException" === ex.name) return;
69
- throw WebinyError.from(ex);
70
- }
71
- }
72
- async exists(params) {
73
- const client = this.getClient();
74
- const name = this.createScheduleName(params);
75
- try {
76
- await client.send(new GetScheduleCommand({
77
- Name: name
78
- }));
79
- return true;
80
- } catch (ex) {
81
- if ("ResourceNotFoundException" === ex.name) return false;
82
- throw ex;
83
- }
84
- }
85
91
  createScheduleExpression(scheduleFor) {
86
92
  return `at(${scheduleFor.toISOString().replace(/\.\d{3}Z$/, "")})`;
87
93
  }
@@ -1 +1 @@
1
- {"version":3,"file":"features/SchedulerService/EventBridgeSchedulerService.js","sources":["../../../src/features/SchedulerService/EventBridgeSchedulerService.ts"],"sourcesContent":["import { WebinyError } from \"@webiny/error\";\nimport {\n type ISchedulerServiceCreateParams,\n type ISchedulerServiceUpdateParams,\n SchedulerService\n} from \"@webiny/api-scheduler/shared/abstractions.js\";\nimport {\n CreateScheduleCommand,\n DeleteScheduleCommand,\n GetScheduleCommand,\n type SchedulerClient,\n UpdateScheduleCommand\n} from \"@webiny/aws-sdk/client-scheduler/index.js\";\nimport { SCHEDULED_ACTION_EVENT_IDENTIFIER } from \"@webiny/api-scheduler/constants.js\";\nimport type { IScheduledActionEventPayload } from \"~/createEventHandler.js\";\n\nexport interface ISchedulerConfig {\n lambdaArn: string;\n roleArn: string;\n}\n\nexport class EventBridgeSchedulerService implements SchedulerService.Interface {\n public constructor(\n private getClient: (config?: any) => Pick<SchedulerClient, \"send\">,\n private config: ISchedulerConfig\n ) {}\n\n public async create(params: SchedulerService.CreateParams): Promise<void> {\n const { id, scheduleFor, tenant, namespace } = params;\n\n if (scheduleFor <= new Date()) {\n throw new WebinyError(\n `Cannot create a schedule for \"${id}\" with date in the past`,\n \"INVALID_SCHEDULE_DATE\",\n {\n scheduleFor,\n tenant,\n id\n }\n );\n }\n\n const client = this.getClient();\n\n const exists = await this.exists({\n id,\n tenant,\n namespace\n });\n if (exists) {\n return this.update(params);\n }\n\n await client.send(\n new CreateScheduleCommand({\n Name: this.createScheduleName(params),\n ScheduleExpression: this.createScheduleExpression(scheduleFor),\n FlexibleTimeWindow: {\n Mode: \"OFF\"\n },\n Target: {\n Arn: this.config.lambdaArn,\n RoleArn: this.config.roleArn,\n Input: this.createScheduledActionEventInput(params)\n },\n ActionAfterCompletion: \"DELETE\"\n })\n );\n }\n\n public async update(params: SchedulerService.UpdateParams): Promise<void> {\n const { id, scheduleFor } = params;\n\n if (scheduleFor <= new Date()) {\n throw new WebinyError(\n `Cannot update an existing schedule for \"${id}\" with date in the past`,\n \"INVALID_SCHEDULE_DATE\",\n {\n scheduleFor,\n id\n }\n );\n }\n\n const client = this.getClient();\n\n await client.send(\n new UpdateScheduleCommand({\n Name: this.createScheduleName(params),\n ScheduleExpression: this.createScheduleExpression(scheduleFor),\n FlexibleTimeWindow: {\n Mode: \"OFF\"\n },\n Target: {\n Arn: this.config.lambdaArn,\n RoleArn: this.config.roleArn,\n Input: this.createScheduledActionEventInput(params)\n },\n ActionAfterCompletion: \"DELETE\"\n })\n );\n }\n\n public async delete(params: SchedulerService.DeleteParams): Promise<void> {\n const client = this.getClient();\n\n const exists = await this.exists(params);\n if (!exists) {\n throw new WebinyError(\n `Cannot delete schedule \"${params.id}\", tenant \"${params.tenant}\", because it does not exist.`\n );\n }\n\n const name = this.createScheduleName(params);\n\n try {\n await client.send(new DeleteScheduleCommand({ Name: name }));\n } catch (ex) {\n if (ex.name === \"ResourceNotFoundException\") {\n return;\n }\n throw WebinyError.from(ex);\n }\n }\n\n public async exists(params: SchedulerService.ExistsParams): Promise<boolean> {\n const client = this.getClient();\n\n const name = this.createScheduleName(params);\n\n try {\n await client.send(new GetScheduleCommand({ Name: name }));\n return true;\n } catch (ex) {\n if (ex.name === \"ResourceNotFoundException\") {\n return false;\n }\n throw ex;\n }\n }\n\n private createScheduleExpression(scheduleFor: Date): string {\n return `at(${scheduleFor.toISOString().replace(/\\.\\d{3}Z$/, \"\")})`;\n }\n\n private createScheduledActionEventInput(\n params: ISchedulerServiceCreateParams | ISchedulerServiceUpdateParams\n ): string {\n return JSON.stringify({\n [SCHEDULED_ACTION_EVENT_IDENTIFIER]: this.createScheduledActionEventPayload(params)\n });\n }\n\n private createScheduledActionEventPayload(\n params: SchedulerService.CreateParams | SchedulerService.UpdateParams\n ): IScheduledActionEventPayload {\n const { id, scheduleFor, tenant, namespace } = params;\n\n return {\n id,\n tenant,\n namespace,\n scheduleFor: scheduleFor.toISOString()\n };\n }\n\n private createScheduleName(params: SchedulerService.ExistsParams): string {\n // AWS EventBridge Scheduler names must match [0-9a-zA-Z-_.]+ and be <= 64 chars. `id`\n // (ScheduledActionId: \"wby-schedule-<hash>\") already satisfies both and is unique per\n // namespace + action type + target, so use it verbatim. Do NOT interpolate `namespace`\n // (contains \"/\", e.g. \"Cms/Entry/<modelId>\") or `tenant` — that produced names with illegal\n // characters that exceeded the length limit (ValidationException).\n return params.id;\n }\n}\n"],"names":["EventBridgeSchedulerService","getClient","config","params","id","scheduleFor","tenant","namespace","Date","WebinyError","client","exists","CreateScheduleCommand","UpdateScheduleCommand","name","DeleteScheduleCommand","ex","GetScheduleCommand","JSON","SCHEDULED_ACTION_EVENT_IDENTIFIER"],"mappings":"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"}
1
+ {"version":3,"file":"features/SchedulerService/EventBridgeSchedulerService.js","sources":["../../../src/features/SchedulerService/EventBridgeSchedulerService.ts"],"sourcesContent":["import { WebinyError } from \"@webiny/error\";\nimport {\n type ISchedulerServiceCreateParams,\n type ISchedulerServiceUpdateParams,\n SchedulerService\n} from \"@webiny/api-scheduler/shared/abstractions.js\";\nimport {\n CreateScheduleCommand,\n DeleteScheduleCommand,\n GetScheduleCommand,\n type SchedulerClient,\n UpdateScheduleCommand,\n ResourceNotFoundException\n} from \"@webiny/aws-sdk/client-scheduler/index.js\";\nimport { SCHEDULED_ACTION_EVENT_IDENTIFIER } from \"@webiny/api-scheduler/constants.js\";\nimport type { IScheduledActionEventPayload } from \"~/createEventHandler.js\";\n\nexport interface ISchedulerConfig {\n lambdaArn: string;\n roleArn: string;\n}\n\nexport class EventBridgeSchedulerService implements SchedulerService.Interface {\n public constructor(\n private getClient: (config?: any) => Pick<SchedulerClient, \"send\">,\n private config: ISchedulerConfig\n ) {}\n\n public async create(params: SchedulerService.CreateParams): Promise<void> {\n // Check if schedule already exists (for auto-update logic)\n const exists = await this.exists(params);\n if (exists) {\n return this.updateInternal(params);\n }\n\n return await this.createInternal(params);\n }\n\n public async update(params: SchedulerService.UpdateParams): Promise<void> {\n const exists = await this.exists(params);\n if (exists) {\n return await this.updateInternal(params);\n }\n return await this.create(params);\n }\n\n public async delete(params: SchedulerService.DeleteParams): Promise<void> {\n const client = this.getClient();\n\n const exists = await this.exists(params);\n if (!exists) {\n throw new WebinyError(\n `Cannot delete schedule \"${params.id}\", tenant \"${params.tenant}\", because it does not exist.`\n );\n }\n\n const name = this.createScheduleName(params);\n\n try {\n await client.send(new DeleteScheduleCommand({ Name: name }));\n } catch (ex) {\n if (ex instanceof ResourceNotFoundException) {\n return;\n } else if (ex.name === \"ResourceNotFoundException\") {\n return;\n }\n throw WebinyError.from(ex);\n }\n }\n\n public async exists(params: SchedulerService.ExistsParams): Promise<boolean> {\n const client = this.getClient();\n\n const name = this.createScheduleName(params);\n\n try {\n await client.send(new GetScheduleCommand({ Name: name }));\n return true;\n } catch (ex) {\n if (ex instanceof ResourceNotFoundException) {\n return false;\n } else if (ex.name === \"ResourceNotFoundException\") {\n return false;\n }\n throw ex;\n }\n }\n\n private async createInternal(params: SchedulerService.CreateParams): Promise<void> {\n const { id, scheduleFor, tenant } = params;\n\n if (scheduleFor <= new Date()) {\n throw new WebinyError(\n `Cannot create a schedule for \"${id}\" with date in the past`,\n \"INVALID_SCHEDULE_DATE\",\n {\n scheduleFor,\n tenant,\n id\n }\n );\n }\n\n const client = this.getClient();\n\n await client.send(\n new CreateScheduleCommand({\n Name: this.createScheduleName(params),\n ScheduleExpression: this.createScheduleExpression(scheduleFor),\n FlexibleTimeWindow: {\n Mode: \"OFF\"\n },\n Target: {\n Arn: this.config.lambdaArn,\n RoleArn: this.config.roleArn,\n Input: this.createScheduledActionEventInput(params)\n },\n ActionAfterCompletion: \"DELETE\"\n })\n );\n }\n\n private async updateInternal(params: SchedulerService.UpdateParams): Promise<void> {\n const { id, scheduleFor } = params;\n\n if (scheduleFor <= new Date()) {\n throw new WebinyError(\n `Cannot update an existing schedule for \"${id}\" with date in the past`,\n \"INVALID_SCHEDULE_DATE\",\n {\n scheduleFor,\n id\n }\n );\n }\n\n const client = this.getClient();\n\n await client.send(\n new UpdateScheduleCommand({\n Name: this.createScheduleName(params),\n ScheduleExpression: this.createScheduleExpression(scheduleFor),\n FlexibleTimeWindow: {\n Mode: \"OFF\"\n },\n Target: {\n Arn: this.config.lambdaArn,\n RoleArn: this.config.roleArn,\n Input: this.createScheduledActionEventInput(params)\n },\n ActionAfterCompletion: \"DELETE\"\n })\n );\n }\n\n private createScheduleExpression(scheduleFor: Date): string {\n return `at(${scheduleFor.toISOString().replace(/\\.\\d{3}Z$/, \"\")})`;\n }\n\n private createScheduledActionEventInput(\n params: ISchedulerServiceCreateParams | ISchedulerServiceUpdateParams\n ): string {\n return JSON.stringify({\n [SCHEDULED_ACTION_EVENT_IDENTIFIER]: this.createScheduledActionEventPayload(params)\n });\n }\n\n private createScheduledActionEventPayload(\n params: SchedulerService.CreateParams | SchedulerService.UpdateParams\n ): IScheduledActionEventPayload {\n const { id, scheduleFor, tenant, namespace } = params;\n\n return {\n id,\n tenant,\n namespace,\n scheduleFor: scheduleFor.toISOString()\n };\n }\n\n private createScheduleName(params: SchedulerService.ExistsParams): string {\n // AWS EventBridge Scheduler names must match [0-9a-zA-Z-_.]+ and be <= 64 chars. `id`\n // (ScheduledActionId: \"wby-schedule-<hash>\") already satisfies both and is unique per\n // namespace + action type + target, so use it verbatim. Do NOT interpolate `namespace`\n // (contains \"/\", e.g. \"Cms/Entry/<modelId>\") or `tenant` — that produced names with illegal\n // characters that exceeded the length limit (ValidationException).\n return params.id;\n }\n}\n"],"names":["EventBridgeSchedulerService","getClient","config","params","exists","client","WebinyError","name","DeleteScheduleCommand","ex","ResourceNotFoundException","GetScheduleCommand","id","scheduleFor","tenant","Date","CreateScheduleCommand","UpdateScheduleCommand","JSON","SCHEDULED_ACTION_EVENT_IDENTIFIER","namespace"],"mappings":"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"}
package/manifest.js CHANGED
@@ -13,7 +13,7 @@ const getManifest = async ()=>{
13
13
  if (!manifest) return {
14
14
  error: new Error("Manifest could not be loaded.")
15
15
  };
16
- if (!manifest.scheduler) return {
16
+ else if (!manifest.scheduler) return {
17
17
  error: new Error("Scheduler not found in the Manifest.")
18
18
  };
19
19
  const result = await schema.safeParseAsync(manifest);
package/manifest.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.js","sources":["../src/manifest.ts"],"sourcesContent":["import { ServiceDiscovery } from \"@webiny/api-core/features/serviceDiscovery/index.js\";\nimport { createZodError } from \"@webiny/utils\";\nimport zod from \"zod\";\n\nconst schema = zod.object({\n scheduler: zod.object({\n lambdaArn: zod.string(),\n roleArn: zod.string()\n })\n});\n\nexport interface IGetManifestErrorResult {\n error: Error;\n data?: never;\n}\n\nexport interface IGetManifestSuccessResult {\n data: {\n lambdaArn: string;\n roleArn: string;\n };\n error?: never;\n}\n\nexport type IGetManifestResult = IGetManifestSuccessResult | IGetManifestErrorResult;\n\nexport const getManifest = async (): Promise<IGetManifestResult> => {\n try {\n const manifest = await ServiceDiscovery.load();\n if (!manifest) {\n return {\n error: new Error(\"Manifest could not be loaded.\")\n };\n } else if (!manifest.scheduler) {\n return {\n error: new Error(\"Scheduler not found in the Manifest.\")\n };\n }\n\n const result = await schema.safeParseAsync(manifest);\n if (!result.success) {\n return {\n error: createZodError(result.error)\n };\n }\n\n return {\n data: result.data.scheduler\n };\n } catch (ex) {\n return {\n error: ex\n };\n }\n};\n"],"names":["schema","zod","getManifest","manifest","ServiceDiscovery","Error","result","createZodError","ex"],"mappings":";;;AAIA,MAAMA,SAASC,IAAI,MAAM,CAAC;IACtB,WAAWA,IAAI,MAAM,CAAC;QAClB,WAAWA,IAAI,MAAM;QACrB,SAASA,IAAI,MAAM;IACvB;AACJ;AAiBO,MAAMC,cAAc;IACvB,IAAI;QACA,MAAMC,WAAW,MAAMC,iBAAiB,IAAI;QAC5C,IAAI,CAACD,UACD,OAAO;YACH,OAAO,IAAIE,MAAM;QACrB;QACG,IAAI,CAACF,SAAS,SAAS,EAC1B,OAAO;YACH,OAAO,IAAIE,MAAM;QACrB;QAGJ,MAAMC,SAAS,MAAMN,OAAO,cAAc,CAACG;QAC3C,IAAI,CAACG,OAAO,OAAO,EACf,OAAO;YACH,OAAOC,eAAeD,OAAO,KAAK;QACtC;QAGJ,OAAO;YACH,MAAMA,OAAO,IAAI,CAAC,SAAS;QAC/B;IACJ,EAAE,OAAOE,IAAI;QACT,OAAO;YACH,OAAOA;QACX;IACJ;AACJ"}
1
+ {"version":3,"file":"manifest.js","sources":["../src/manifest.ts"],"sourcesContent":["import { ServiceDiscovery } from \"@webiny/api-core/features/serviceDiscovery/index.js\";\nimport { createZodError } from \"@webiny/utils\";\nimport zod from \"zod\";\n\nconst schema = zod.object({\n scheduler: zod.object({\n lambdaArn: zod.string(),\n roleArn: zod.string()\n })\n});\n\nexport interface IGetManifestErrorResult {\n error: Error;\n data?: never;\n}\n\nexport interface IGetManifestSuccessResult {\n data: {\n lambdaArn: string;\n roleArn: string;\n };\n error?: never;\n}\n\nexport type IGetManifestResult = IGetManifestSuccessResult | IGetManifestErrorResult;\n\nexport const getManifest = async (): Promise<IGetManifestResult> => {\n try {\n const manifest = await ServiceDiscovery.load();\n if (!manifest) {\n return {\n error: new Error(\"Manifest could not be loaded.\")\n };\n } else if (!manifest.scheduler) {\n return {\n error: new Error(\"Scheduler not found in the Manifest.\")\n };\n }\n\n const result = await schema.safeParseAsync(manifest);\n if (!result.success) {\n return {\n error: createZodError(result.error)\n };\n }\n\n return {\n data: result.data.scheduler\n };\n } catch (ex) {\n return {\n error: ex\n };\n }\n};\n"],"names":["schema","zod","getManifest","manifest","ServiceDiscovery","Error","result","createZodError","ex"],"mappings":";;;AAIA,MAAMA,SAASC,IAAI,MAAM,CAAC;IACtB,WAAWA,IAAI,MAAM,CAAC;QAClB,WAAWA,IAAI,MAAM;QACrB,SAASA,IAAI,MAAM;IACvB;AACJ;AAiBO,MAAMC,cAAc;IACvB,IAAI;QACA,MAAMC,WAAW,MAAMC,iBAAiB,IAAI;QAC5C,IAAI,CAACD,UACD,OAAO;YACH,OAAO,IAAIE,MAAM;QACrB;aACG,IAAI,CAACF,SAAS,SAAS,EAC1B,OAAO;YACH,OAAO,IAAIE,MAAM;QACrB;QAGJ,MAAMC,SAAS,MAAMN,OAAO,cAAc,CAACG;QAC3C,IAAI,CAACG,OAAO,OAAO,EACf,OAAO;YACH,OAAOC,eAAeD,OAAO,KAAK;QACtC;QAGJ,OAAO;YACH,MAAMA,OAAO,IAAI,CAAC,SAAS;QAC/B;IACJ,EAAE,OAAOE,IAAI;QACT,OAAO;YACH,OAAOA;QACX;IACJ;AACJ"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webiny/api-scheduler-aws",
3
- "version": "6.5.0-beta.4",
3
+ "version": "6.5.0-beta.6",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./index.js",
@@ -18,28 +18,28 @@
18
18
  "description": "AWS EventBridge implementation for the Webiny action scheduler.",
19
19
  "license": "MIT",
20
20
  "dependencies": {
21
- "@webiny/api": "6.5.0-beta.4",
22
- "@webiny/api-core": "6.5.0-beta.4",
23
- "@webiny/api-headless-cms": "6.5.0-beta.4",
24
- "@webiny/api-scheduler": "6.5.0-beta.4",
25
- "@webiny/aws-sdk": "6.5.0-beta.4",
26
- "@webiny/error": "6.5.0-beta.4",
27
- "@webiny/handler": "6.5.0-beta.4",
28
- "@webiny/handler-aws": "6.5.0-beta.4",
29
- "@webiny/plugins": "6.5.0-beta.4",
30
- "@webiny/utils": "6.5.0-beta.4",
31
- "zod": "4.4.3"
21
+ "@webiny/api": "6.5.0-beta.6",
22
+ "@webiny/api-core": "6.5.0-beta.6",
23
+ "@webiny/api-headless-cms": "6.5.0-beta.6",
24
+ "@webiny/api-scheduler": "6.5.0-beta.6",
25
+ "@webiny/aws-sdk": "6.5.0-beta.6",
26
+ "@webiny/error": "6.5.0-beta.6",
27
+ "@webiny/handler": "6.5.0-beta.6",
28
+ "@webiny/handler-aws": "6.5.0-beta.6",
29
+ "@webiny/plugins": "6.5.0-beta.6",
30
+ "@webiny/utils": "6.5.0-beta.6",
31
+ "zod": "4.6.5"
32
32
  },
33
33
  "devDependencies": {
34
- "@webiny/build-tools": "6.5.0-beta.4",
35
- "@webiny/feature": "6.5.0-beta.4",
36
- "@webiny/handler-graphql": "6.5.0-beta.4",
37
- "@webiny/project-utils": "6.5.0-beta.4",
38
- "@webiny/testing": "6.5.0-beta.4",
39
- "@webiny/wcp": "6.5.0-beta.4",
34
+ "@webiny/build-tools": "6.5.0-beta.6",
35
+ "@webiny/feature": "6.5.0-beta.6",
36
+ "@webiny/handler-graphql": "6.5.0-beta.6",
37
+ "@webiny/project-utils": "6.5.0-beta.6",
38
+ "@webiny/testing": "6.5.0-beta.6",
39
+ "@webiny/wcp": "6.5.0-beta.6",
40
40
  "aws-sdk-client-mock": "4.1.0",
41
41
  "typescript": "7.0.2",
42
- "vitest": "4.1.10"
42
+ "vitest": "5.0.2"
43
43
  },
44
44
  "publishConfig": {
45
45
  "access": "public"