@webiny/api-scheduler-aws 0.0.0-unstable.0d717d18dd
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.
- package/LICENSE +21 -0
- package/README.md +11 -0
- package/SchedulerAwsFeature.d.ts +10 -0
- package/SchedulerAwsFeature.js +14 -0
- package/SchedulerAwsFeature.js.map +1 -0
- package/context.d.ts +11 -0
- package/context.js +23 -0
- package/context.js.map +1 -0
- package/createEventHandler.d.ts +10 -0
- package/createEventHandler.js +0 -0
- package/features/SchedulerService/EventBridgeSchedulerService.d.ts +19 -0
- package/features/SchedulerService/EventBridgeSchedulerService.js +108 -0
- package/features/SchedulerService/EventBridgeSchedulerService.js.map +1 -0
- package/index.d.ts +3 -0
- package/index.js +2 -0
- package/manifest.d.ts +13 -0
- package/manifest.js +34 -0
- package/manifest.js.map +1 -0
- package/package.json +55 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) Webiny
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# @webiny/api-scheduler-aws
|
|
2
|
+
|
|
3
|
+
> [!NOTE]
|
|
4
|
+
> This package is part of the [Webiny](https://www.webiny.com) monorepo.
|
|
5
|
+
> It’s **included in every Webiny project by default** and is not meant to be used as a standalone package.
|
|
6
|
+
|
|
7
|
+
📘 **Documentation:** [https://www.webiny.com/docs](https://www.webiny.com/docs)
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
_This README file is automatically generated during the publish process._
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AWS (EventBridge Scheduler) transport. Wraps `registerSchedulerAwsExtension` with the default
|
|
3
|
+
* scheduler client so the handler's `transports` wiring reads uniformly
|
|
4
|
+
* (`SchedulerAwsFeature.register(c)`), matching the other transport adapters. Callers that need a
|
|
5
|
+
* custom client can still use `registerSchedulerAwsExtension` directly.
|
|
6
|
+
*/
|
|
7
|
+
export declare const SchedulerAwsFeature: {
|
|
8
|
+
name: string;
|
|
9
|
+
register(container: import("@webiny/di").Container): void;
|
|
10
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { createFeature } from "@webiny/feature/api";
|
|
2
|
+
import { createSchedulerClient } from "@webiny/aws-sdk/client-scheduler/index.js";
|
|
3
|
+
import { registerSchedulerAwsExtension } from "./context.js";
|
|
4
|
+
const SchedulerAwsFeature = createFeature({
|
|
5
|
+
name: "SchedulerAws",
|
|
6
|
+
register (container) {
|
|
7
|
+
registerSchedulerAwsExtension(container, {
|
|
8
|
+
getClient: (config)=>createSchedulerClient(config)
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
export { SchedulerAwsFeature };
|
|
13
|
+
|
|
14
|
+
//# sourceMappingURL=SchedulerAwsFeature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SchedulerAwsFeature.js","sources":["../src/SchedulerAwsFeature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { createSchedulerClient } from \"@webiny/aws-sdk/client-scheduler/index.js\";\nimport { registerSchedulerAwsExtension } from \"./context.js\";\n\n/**\n * AWS (EventBridge Scheduler) transport. Wraps `registerSchedulerAwsExtension` with the default\n * scheduler client so the handler's `transports` wiring reads uniformly\n * (`SchedulerAwsFeature.register(c)`), matching the other transport adapters. Callers that need a\n * custom client can still use `registerSchedulerAwsExtension` directly.\n */\nexport const SchedulerAwsFeature = createFeature({\n name: \"SchedulerAws\",\n register(container) {\n registerSchedulerAwsExtension(container, {\n getClient: config => createSchedulerClient(config)\n });\n }\n});\n"],"names":["SchedulerAwsFeature","createFeature","container","registerSchedulerAwsExtension","config","createSchedulerClient"],"mappings":";;;AAUO,MAAMA,sBAAsBC,cAAc;IAC7C,MAAM;IACN,UAASC,SAAS;QACdC,8BAA8BD,WAAW;YACrC,WAAWE,CAAAA,SAAUC,sBAAsBD;QAC/C;IACJ;AACJ"}
|
package/context.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Container } from "@webiny/di";
|
|
2
|
+
import type { SchedulerClient, SchedulerClientConfig } from "@webiny/aws-sdk/client-scheduler/index.js";
|
|
3
|
+
export interface IRegisterSchedulerAwsExtensionParams {
|
|
4
|
+
getClient(config?: SchedulerClientConfig): Pick<SchedulerClient, "send">;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Registers the AWS (EventBridge Scheduler) transport for the scheduler. Binds `SchedulerService`
|
|
8
|
+
* per-request via a RequestContextInitializer (post-tenant): resolves the deployed scheduler
|
|
9
|
+
* manifest and picks the EventBridge service, or a no-op Void service when the manifest is missing.
|
|
10
|
+
*/
|
|
11
|
+
export declare const registerSchedulerAwsExtension: (container: Container, params: IRegisterSchedulerAwsExtensionParams) => void;
|
package/context.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { RequestContextInitializer } from "@webiny/event-handler-core";
|
|
2
|
+
import { getManifest } from "./manifest.js";
|
|
3
|
+
import { SchedulerService } from "@webiny/api-scheduler/shared/abstractions.js";
|
|
4
|
+
import { EventBridgeSchedulerService } from "./features/SchedulerService/EventBridgeSchedulerService.js";
|
|
5
|
+
import { VoidSchedulerService } from "@webiny/api-scheduler/features/SchedulerService/VoidSchedulerService.js";
|
|
6
|
+
import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
|
|
7
|
+
const registerSchedulerAwsExtension = (container, params)=>{
|
|
8
|
+
container.registerInstance(RequestContextInitializer, {
|
|
9
|
+
async init (ctx) {
|
|
10
|
+
const requestContainer = ctx.container;
|
|
11
|
+
if (!requestContainer.resolve(TenantContext).getTenant()) return;
|
|
12
|
+
const manifest = await getManifest();
|
|
13
|
+
if (manifest.error) requestContainer.registerInstance(SchedulerService, new VoidSchedulerService());
|
|
14
|
+
else requestContainer.registerInstance(SchedulerService, new EventBridgeSchedulerService(params.getClient, {
|
|
15
|
+
lambdaArn: manifest.data.lambdaArn,
|
|
16
|
+
roleArn: manifest.data.roleArn
|
|
17
|
+
}));
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
export { registerSchedulerAwsExtension };
|
|
22
|
+
|
|
23
|
+
//# sourceMappingURL=context.js.map
|
package/context.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sources":["../src/context.ts"],"sourcesContent":["import type { Container } from \"@webiny/di\";\nimport { RequestContextInitializer } from \"@webiny/event-handler-core\";\nimport type {\n SchedulerClient,\n SchedulerClientConfig\n} from \"@webiny/aws-sdk/client-scheduler/index.js\";\nimport { getManifest } from \"~/manifest.js\";\nimport { SchedulerService } from \"@webiny/api-scheduler/shared/abstractions.js\";\nimport { EventBridgeSchedulerService } from \"~/features/SchedulerService/EventBridgeSchedulerService.js\";\nimport { VoidSchedulerService } from \"@webiny/api-scheduler/features/SchedulerService/VoidSchedulerService.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\n\nexport interface IRegisterSchedulerAwsExtensionParams {\n getClient(config?: SchedulerClientConfig): Pick<SchedulerClient, \"send\">;\n}\n\n/**\n * Registers the AWS (EventBridge Scheduler) transport for the scheduler. Binds `SchedulerService`\n * per-request via a RequestContextInitializer (post-tenant): resolves the deployed scheduler\n * manifest and picks the EventBridge service, or a no-op Void service when the manifest is missing.\n */\nexport const registerSchedulerAwsExtension = (\n container: Container,\n params: IRegisterSchedulerAwsExtensionParams\n) => {\n container.registerInstance(RequestContextInitializer, {\n async init(ctx: Record<string, any>) {\n const requestContainer = ctx.container as Container;\n\n if (!requestContainer.resolve(TenantContext).getTenant()) {\n return;\n }\n\n const manifest = await getManifest();\n\n if (manifest.error) {\n requestContainer.registerInstance(SchedulerService, new VoidSchedulerService());\n } else {\n requestContainer.registerInstance(\n SchedulerService,\n new EventBridgeSchedulerService(params.getClient, {\n lambdaArn: manifest.data.lambdaArn,\n roleArn: manifest.data.roleArn\n })\n );\n }\n }\n });\n};\n"],"names":["registerSchedulerAwsExtension","container","params","RequestContextInitializer","ctx","requestContainer","TenantContext","manifest","getManifest","SchedulerService","VoidSchedulerService","EventBridgeSchedulerService"],"mappings":";;;;;;AAqBO,MAAMA,gCAAgC,CACzCC,WACAC;IAEAD,UAAU,gBAAgB,CAACE,2BAA2B;QAClD,MAAM,MAAKC,GAAwB;YAC/B,MAAMC,mBAAmBD,IAAI,SAAS;YAEtC,IAAI,CAACC,iBAAiB,OAAO,CAACC,eAAe,SAAS,IAClD;YAGJ,MAAMC,WAAW,MAAMC;YAEvB,IAAID,SAAS,KAAK,EACdF,iBAAiB,gBAAgB,CAACI,kBAAkB,IAAIC;iBAExDL,iBAAiB,gBAAgB,CAC7BI,kBACA,IAAIE,4BAA4BT,OAAO,SAAS,EAAE;gBAC9C,WAAWK,SAAS,IAAI,CAAC,SAAS;gBAClC,SAASA,SAAS,IAAI,CAAC,OAAO;YAClC;QAGZ;IACJ;AACJ"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { SCHEDULED_ACTION_EVENT_IDENTIFIER } from "@webiny/api-scheduler/constants.js";
|
|
2
|
+
export interface IScheduledActionEventPayload {
|
|
3
|
+
namespace: string;
|
|
4
|
+
id: string;
|
|
5
|
+
scheduleFor: string;
|
|
6
|
+
tenant: string;
|
|
7
|
+
}
|
|
8
|
+
export interface IScheduledActionEvent {
|
|
9
|
+
[SCHEDULED_ACTION_EVENT_IDENTIFIER]: IScheduledActionEventPayload;
|
|
10
|
+
}
|
|
File without changes
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { SchedulerService } from "@webiny/api-scheduler/shared/abstractions.js";
|
|
2
|
+
import { type SchedulerClient } from "@webiny/aws-sdk/client-scheduler/index.js";
|
|
3
|
+
export interface ISchedulerConfig {
|
|
4
|
+
lambdaArn: string;
|
|
5
|
+
roleArn: string;
|
|
6
|
+
}
|
|
7
|
+
export declare class EventBridgeSchedulerService implements SchedulerService.Interface {
|
|
8
|
+
private getClient;
|
|
9
|
+
private config;
|
|
10
|
+
constructor(getClient: (config?: any) => Pick<SchedulerClient, "send">, config: ISchedulerConfig);
|
|
11
|
+
create(params: SchedulerService.CreateParams): Promise<void>;
|
|
12
|
+
update(params: SchedulerService.UpdateParams): Promise<void>;
|
|
13
|
+
delete(params: SchedulerService.DeleteParams): Promise<void>;
|
|
14
|
+
exists(params: SchedulerService.ExistsParams): Promise<boolean>;
|
|
15
|
+
private createScheduleExpression;
|
|
16
|
+
private createScheduledActionEventInput;
|
|
17
|
+
private createScheduledActionEventPayload;
|
|
18
|
+
private createScheduleName;
|
|
19
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { WebinyError } from "@webiny/error";
|
|
2
|
+
import { CreateScheduleCommand, DeleteScheduleCommand, GetScheduleCommand, UpdateScheduleCommand } from "@webiny/aws-sdk/client-scheduler/index.js";
|
|
3
|
+
import { SCHEDULED_ACTION_EVENT_IDENTIFIER } from "@webiny/api-scheduler/constants.js";
|
|
4
|
+
class EventBridgeSchedulerService {
|
|
5
|
+
constructor(getClient, config){
|
|
6
|
+
this.getClient = getClient;
|
|
7
|
+
this.config = config;
|
|
8
|
+
}
|
|
9
|
+
async create(params) {
|
|
10
|
+
const { id, scheduleFor, tenant, namespace } = params;
|
|
11
|
+
if (scheduleFor <= new Date()) throw new WebinyError(`Cannot create a schedule for "${id}" with date in the past`, "INVALID_SCHEDULE_DATE", {
|
|
12
|
+
scheduleFor,
|
|
13
|
+
tenant,
|
|
14
|
+
id
|
|
15
|
+
});
|
|
16
|
+
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
|
+
await client.send(new CreateScheduleCommand({
|
|
24
|
+
Name: this.createScheduleName(params),
|
|
25
|
+
ScheduleExpression: this.createScheduleExpression(scheduleFor),
|
|
26
|
+
FlexibleTimeWindow: {
|
|
27
|
+
Mode: "OFF"
|
|
28
|
+
},
|
|
29
|
+
Target: {
|
|
30
|
+
Arn: this.config.lambdaArn,
|
|
31
|
+
RoleArn: this.config.roleArn,
|
|
32
|
+
Input: this.createScheduledActionEventInput(params)
|
|
33
|
+
},
|
|
34
|
+
ActionAfterCompletion: "DELETE"
|
|
35
|
+
}));
|
|
36
|
+
}
|
|
37
|
+
async update(params) {
|
|
38
|
+
const { id, scheduleFor } = params;
|
|
39
|
+
if (scheduleFor <= new Date()) throw new WebinyError(`Cannot update an existing schedule for "${id}" with date in the past`, "INVALID_SCHEDULE_DATE", {
|
|
40
|
+
scheduleFor,
|
|
41
|
+
id
|
|
42
|
+
});
|
|
43
|
+
const client = this.getClient();
|
|
44
|
+
await client.send(new UpdateScheduleCommand({
|
|
45
|
+
Name: this.createScheduleName(params),
|
|
46
|
+
ScheduleExpression: this.createScheduleExpression(scheduleFor),
|
|
47
|
+
FlexibleTimeWindow: {
|
|
48
|
+
Mode: "OFF"
|
|
49
|
+
},
|
|
50
|
+
Target: {
|
|
51
|
+
Arn: this.config.lambdaArn,
|
|
52
|
+
RoleArn: this.config.roleArn,
|
|
53
|
+
Input: this.createScheduledActionEventInput(params)
|
|
54
|
+
},
|
|
55
|
+
ActionAfterCompletion: "DELETE"
|
|
56
|
+
}));
|
|
57
|
+
}
|
|
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
|
+
createScheduleExpression(scheduleFor) {
|
|
86
|
+
return `at(${scheduleFor.toISOString().replace(/\.\d{3}Z$/, "")})`;
|
|
87
|
+
}
|
|
88
|
+
createScheduledActionEventInput(params) {
|
|
89
|
+
return JSON.stringify({
|
|
90
|
+
[SCHEDULED_ACTION_EVENT_IDENTIFIER]: this.createScheduledActionEventPayload(params)
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
createScheduledActionEventPayload(params) {
|
|
94
|
+
const { id, scheduleFor, tenant, namespace } = params;
|
|
95
|
+
return {
|
|
96
|
+
id,
|
|
97
|
+
tenant,
|
|
98
|
+
namespace,
|
|
99
|
+
scheduleFor: scheduleFor.toISOString()
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
createScheduleName(params) {
|
|
103
|
+
return params.id;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
export { EventBridgeSchedulerService };
|
|
107
|
+
|
|
108
|
+
//# sourceMappingURL=EventBridgeSchedulerService.js.map
|
|
@@ -0,0 +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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"}
|
package/index.d.ts
ADDED
package/index.js
ADDED
package/manifest.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface IGetManifestErrorResult {
|
|
2
|
+
error: Error;
|
|
3
|
+
data?: never;
|
|
4
|
+
}
|
|
5
|
+
export interface IGetManifestSuccessResult {
|
|
6
|
+
data: {
|
|
7
|
+
lambdaArn: string;
|
|
8
|
+
roleArn: string;
|
|
9
|
+
};
|
|
10
|
+
error?: never;
|
|
11
|
+
}
|
|
12
|
+
export type IGetManifestResult = IGetManifestSuccessResult | IGetManifestErrorResult;
|
|
13
|
+
export declare const getManifest: () => Promise<IGetManifestResult>;
|
package/manifest.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { ServiceDiscovery } from "@webiny/api-core/features/serviceDiscovery/index.js";
|
|
2
|
+
import { createZodError } from "@webiny/utils";
|
|
3
|
+
import zod from "zod";
|
|
4
|
+
const schema = zod.object({
|
|
5
|
+
scheduler: zod.object({
|
|
6
|
+
lambdaArn: zod.string(),
|
|
7
|
+
roleArn: zod.string()
|
|
8
|
+
})
|
|
9
|
+
});
|
|
10
|
+
const getManifest = async ()=>{
|
|
11
|
+
try {
|
|
12
|
+
const manifest = await ServiceDiscovery.load();
|
|
13
|
+
if (!manifest) return {
|
|
14
|
+
error: new Error("Manifest could not be loaded.")
|
|
15
|
+
};
|
|
16
|
+
if (!manifest.scheduler) return {
|
|
17
|
+
error: new Error("Scheduler not found in the Manifest.")
|
|
18
|
+
};
|
|
19
|
+
const result = await schema.safeParseAsync(manifest);
|
|
20
|
+
if (!result.success) return {
|
|
21
|
+
error: createZodError(result.error)
|
|
22
|
+
};
|
|
23
|
+
return {
|
|
24
|
+
data: result.data.scheduler
|
|
25
|
+
};
|
|
26
|
+
} catch (ex) {
|
|
27
|
+
return {
|
|
28
|
+
error: ex
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
export { getManifest };
|
|
33
|
+
|
|
34
|
+
//# sourceMappingURL=manifest.js.map
|
package/manifest.js.map
ADDED
|
@@ -0,0 +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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@webiny/api-scheduler-aws",
|
|
3
|
+
"version": "0.0.0-unstable.0d717d18dd",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"exports": {
|
|
6
|
+
".": "./index.js",
|
|
7
|
+
"./*": "./*"
|
|
8
|
+
},
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "https://github.com/webiny/webiny-js.git",
|
|
12
|
+
"directory": "packages/api-scheduler-aws"
|
|
13
|
+
},
|
|
14
|
+
"keywords": [
|
|
15
|
+
"scheduler:aws"
|
|
16
|
+
],
|
|
17
|
+
"author": "Webiny Ltd",
|
|
18
|
+
"description": "AWS EventBridge implementation for the Webiny action scheduler.",
|
|
19
|
+
"license": "MIT",
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"@webiny/api": "0.0.0-unstable.0d717d18dd",
|
|
22
|
+
"@webiny/api-core": "0.0.0-unstable.0d717d18dd",
|
|
23
|
+
"@webiny/api-headless-cms": "0.0.0-unstable.0d717d18dd",
|
|
24
|
+
"@webiny/api-scheduler": "0.0.0-unstable.0d717d18dd",
|
|
25
|
+
"@webiny/aws-sdk": "0.0.0-unstable.0d717d18dd",
|
|
26
|
+
"@webiny/error": "0.0.0-unstable.0d717d18dd",
|
|
27
|
+
"@webiny/utils": "0.0.0-unstable.0d717d18dd",
|
|
28
|
+
"zod": "4.4.3"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@webiny/api-core": "0.0.0-unstable.0d717d18dd",
|
|
32
|
+
"@webiny/api-core-testing": "0.0.0-unstable.0d717d18dd",
|
|
33
|
+
"@webiny/api-graphql": "0.0.0-unstable.0d717d18dd",
|
|
34
|
+
"@webiny/api-headless-cms": "0.0.0-unstable.0d717d18dd",
|
|
35
|
+
"@webiny/build-tools": "0.0.0-unstable.0d717d18dd",
|
|
36
|
+
"@webiny/db-dynamodb": "0.0.0-unstable.0d717d18dd",
|
|
37
|
+
"@webiny/di": "1.0.2",
|
|
38
|
+
"@webiny/event-handler-aws": "0.0.0-unstable.0d717d18dd",
|
|
39
|
+
"@webiny/event-handler-core": "0.0.0-unstable.0d717d18dd",
|
|
40
|
+
"@webiny/feature": "0.0.0-unstable.0d717d18dd",
|
|
41
|
+
"@webiny/handler": "0.0.0-unstable.0d717d18dd",
|
|
42
|
+
"@webiny/project-utils": "0.0.0-unstable.0d717d18dd",
|
|
43
|
+
"@webiny/wcp": "0.0.0-unstable.0d717d18dd",
|
|
44
|
+
"aws-sdk-client-mock": "4.1.0",
|
|
45
|
+
"graphql": "16.14.2",
|
|
46
|
+
"typescript": "7.0.2",
|
|
47
|
+
"vitest": "4.1.10"
|
|
48
|
+
},
|
|
49
|
+
"publishConfig": {
|
|
50
|
+
"access": "public"
|
|
51
|
+
},
|
|
52
|
+
"webiny": {
|
|
53
|
+
"publishFrom": "dist"
|
|
54
|
+
}
|
|
55
|
+
}
|