@arinoto/cdk-arch 0.2.0 → 0.3.0
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/dist/api-container.d.ts +0 -1
- package/dist/api-container.d.ts.map +1 -1
- package/dist/api-container.js +2 -2
- package/dist/binding.d.ts +1 -7
- package/dist/binding.d.ts.map +1 -1
- package/dist/binding.js +2 -13
- package/dist/function.d.ts.map +1 -1
- package/dist/function.js +2 -4
- package/dist/http-handler.d.ts +11 -0
- package/dist/http-handler.d.ts.map +1 -0
- package/dist/http-handler.js +33 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/package.json +2 -1
- package/src/api-container.ts +1 -2
- package/src/binding.ts +2 -15
- package/src/function.ts +1 -3
- package/src/http-handler.ts +46 -0
- package/src/index.ts +1 -0
package/dist/api-container.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-container.d.ts","sourceRoot":"","sources":["../src/api-container.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAe,MAAM,YAAY,CAAC;AAEnD,MAAM,WAAW,SAAS;IACxB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;CAC5B;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,
|
|
1
|
+
{"version":3,"file":"api-container.d.ts","sourceRoot":"","sources":["../src/api-container.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAe,MAAM,YAAY,CAAC;AAEnD,MAAM,WAAW,SAAS;IACxB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;CAC5B;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,QAAQ,CAAC;CACnB;AAED;;GAEG;AACH,qBAAa,YAAa,SAAQ,SAAS;IACzC,SAAgB,MAAM,EAAE,SAAS,CAAC;gBAEtB,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,GAAE,SAAc;IAKhE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,IAAI;IAI7D,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU;IAQlC,UAAU,IAAK,MAAM,EAAE;IAIvB;;;OAGG;IACH,iBAAiB,IAAI,QAAQ,EAAE;CAKhC"}
|
package/dist/api-container.js
CHANGED
|
@@ -12,7 +12,7 @@ class ApiContainer extends constructs_1.Construct {
|
|
|
12
12
|
this.routes = routes;
|
|
13
13
|
}
|
|
14
14
|
addRoute(name, path, handler) {
|
|
15
|
-
this.routes[name] = {
|
|
15
|
+
this.routes[name] = { path, handler };
|
|
16
16
|
}
|
|
17
17
|
getRoute(name) {
|
|
18
18
|
const entry = this.routes[name];
|
|
@@ -35,4 +35,4 @@ class ApiContainer extends constructs_1.Construct {
|
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
37
|
exports.ApiContainer = ApiContainer;
|
|
38
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWNvbnRhaW5lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9hcGktY29udGFpbmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJDQUF1QztBQUN2Qyx5Q0FBbUQ7QUFXbkQ7O0dBRUc7QUFDSCxNQUFhLFlBQWEsU0FBUSxzQkFBUztJQUd6QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLFNBQW9CLEVBQUU7UUFDOUQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQsUUFBUSxDQUFDLElBQVksRUFBRSxJQUFZLEVBQUUsT0FBaUI7UUFDcEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBRUQsUUFBUSxDQUFDLElBQVk7UUFDbkIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxNQUFNLElBQUksS0FBSyxDQUFDLFVBQVUsSUFBSSw2QkFBNkIsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzlFLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxVQUFVO1FBQ1IsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsaUJBQWlCO1FBQ2YsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7YUFDOUIsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQzthQUMzQixNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFlBQVksc0JBQVcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7Q0FDRjtBQWpDRCxvQ0FpQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IEZ1bmN0aW9uLCBUQkRGdW5jdGlvbiB9IGZyb20gJy4vZnVuY3Rpb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFwaVJvdXRlcyB7XG4gIFtuYW1lOiBzdHJpbmddOiBSb3V0ZUVudHJ5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJvdXRlRW50cnkge1xuICBwYXRoOiBzdHJpbmc7XG4gIGhhbmRsZXI6IEZ1bmN0aW9uO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gQVBJIGNvbnRhaW5lciB0aGF0IHJvdXRlcyByZXF1ZXN0cyB0byBmdW5jdGlvbnNcbiAqL1xuZXhwb3J0IGNsYXNzIEFwaUNvbnRhaW5lciBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSByb3V0ZXM6IEFwaVJvdXRlcztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCByb3V0ZXM6IEFwaVJvdXRlcyA9IHt9KSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICB0aGlzLnJvdXRlcyA9IHJvdXRlcztcbiAgfVxuXG4gIGFkZFJvdXRlKG5hbWU6IHN0cmluZywgcGF0aDogc3RyaW5nLCBoYW5kbGVyOiBGdW5jdGlvbik6IHZvaWQge1xuICAgIHRoaXMucm91dGVzW25hbWVdID0geyBwYXRoLCBoYW5kbGVyIH07XG4gIH1cblxuICBnZXRSb3V0ZShuYW1lOiBzdHJpbmcpOiBSb3V0ZUVudHJ5IHtcbiAgICBjb25zdCBlbnRyeSA9IHRoaXMucm91dGVzW25hbWVdO1xuICAgIGlmICghZW50cnkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUm91dGUgJyR7bmFtZX0nIG5vdCBmb3VuZCBpbiBjb250YWluZXIgJyR7dGhpcy5ub2RlLmlkfSdgKTtcbiAgICB9XG4gICAgcmV0dXJuIGVudHJ5O1xuICB9XG5cbiAgbGlzdFJvdXRlcygpIDogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLnJvdXRlcyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgb2YgVEJERnVuY3Rpb25zIHRoYXQgaGF2ZSBub3QgYmVlbiBvdmVybG9hZGVkLlxuICAgKiBVc2UgdGhpcyB0byB2YWxpZGF0ZSB0aGF0IGFsbCByZXF1aXJlZCBpbXBsZW1lbnRhdGlvbnMgYXJlIHByb3ZpZGVkLlxuICAgKi9cbiAgdmFsaWRhdGVPdmVybG9hZHMoKTogRnVuY3Rpb25bXSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5yb3V0ZXMpXG4gICAgICAubWFwKGVudHJ5ID0+IGVudHJ5LmhhbmRsZXIpXG4gICAgICAuZmlsdGVyKGZuID0+IGZuIGluc3RhbmNlb2YgVEJERnVuY3Rpb24gJiYgIWZuLmhhc092ZXJsb2FkKCkpO1xuICB9XG59XG4iXX0=
|
package/dist/binding.d.ts
CHANGED
|
@@ -5,8 +5,7 @@ import { FunctionHandler } from './function';
|
|
|
5
5
|
* Service discovery configuration for runtime
|
|
6
6
|
*/
|
|
7
7
|
export interface ServiceEndpoint {
|
|
8
|
-
|
|
9
|
-
port: number;
|
|
8
|
+
baseUrl: string;
|
|
10
9
|
}
|
|
11
10
|
/**
|
|
12
11
|
* Binding options for an ApiContainer
|
|
@@ -31,11 +30,6 @@ export declare class ArchitectureBinding {
|
|
|
31
30
|
* Overload keys must be route names registered via addRoute.
|
|
32
31
|
*/
|
|
33
32
|
bind(component: ApiContainer, options: BindOptions): void;
|
|
34
|
-
/**
|
|
35
|
-
* Bind a component from environment variables.
|
|
36
|
-
* Looks for {PREFIX}_HOST and {PREFIX}_PORT environment variables.
|
|
37
|
-
*/
|
|
38
|
-
bindFromEnv(component: ApiContainer, envPrefix: string, overloads?: Record<string, FunctionHandler>): void;
|
|
39
33
|
getEndpoint(component: Construct): ServiceEndpoint | undefined;
|
|
40
34
|
getAllBindings(): Map<Construct, ServiceEndpoint>;
|
|
41
35
|
setLocal(component: Construct): void;
|
package/dist/binding.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"binding.d.ts","sourceRoot":"","sources":["../src/binding.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAY,eAAe,EAAE,MAAM,YAAY,CAAC;AAEvD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,
|
|
1
|
+
{"version":3,"file":"binding.d.ts","sourceRoot":"","sources":["../src/binding.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAY,eAAe,EAAE,MAAM,YAAY,CAAC;AAEvD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,WAAY,SAAQ,eAAe;IAClD;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAC7C;AAED;;;GAGG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAA8C;IAC9D,OAAO,CAAC,eAAe,CAA6B;IAEpD;;;;OAIG;IACH,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI;IAezD,WAAW,CAAC,SAAS,EAAE,SAAS,GAAG,eAAe,GAAG,SAAS;IAI9D,cAAc,IAAI,GAAG,CAAC,SAAS,EAAE,eAAe,CAAC;IAIjD,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAIpC,OAAO,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO;CAGvC;AAED;;GAEG;AACH,eAAO,MAAM,mBAAmB,qBAA4B,CAAC"}
|
package/dist/binding.js
CHANGED
|
@@ -17,7 +17,7 @@ class ArchitectureBinding {
|
|
|
17
17
|
* Overload keys must be route names registered via addRoute.
|
|
18
18
|
*/
|
|
19
19
|
bind(component, options) {
|
|
20
|
-
this.bindings.set(component, {
|
|
20
|
+
this.bindings.set(component, { baseUrl: options.baseUrl });
|
|
21
21
|
Object.entries(options.overloads ?? {}).forEach(([name, handler]) => {
|
|
22
22
|
const route = component.getRoute(name);
|
|
23
23
|
if (!route) {
|
|
@@ -29,17 +29,6 @@ class ArchitectureBinding {
|
|
|
29
29
|
route.handler.overload(handler);
|
|
30
30
|
});
|
|
31
31
|
}
|
|
32
|
-
/**
|
|
33
|
-
* Bind a component from environment variables.
|
|
34
|
-
* Looks for {PREFIX}_HOST and {PREFIX}_PORT environment variables.
|
|
35
|
-
*/
|
|
36
|
-
bindFromEnv(component, envPrefix, overloads) {
|
|
37
|
-
const host = process.env[`${envPrefix}_HOST`];
|
|
38
|
-
const port = process.env[`${envPrefix}_PORT`];
|
|
39
|
-
if (host && port) {
|
|
40
|
-
this.bind(component, { host, port: parseInt(port), overloads });
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
32
|
getEndpoint(component) {
|
|
44
33
|
return this.bindings.get(component);
|
|
45
34
|
}
|
|
@@ -58,4 +47,4 @@ exports.ArchitectureBinding = ArchitectureBinding;
|
|
|
58
47
|
* Global binding registry
|
|
59
48
|
*/
|
|
60
49
|
exports.architectureBinding = new ArchitectureBinding();
|
|
61
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmluZGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9iaW5kaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLHlDQUF1RDtBQW9CdkQ7OztHQUdHO0FBQ0gsTUFBYSxtQkFBbUI7SUFBaEM7UUFDVSxhQUFRLEdBQW9DLElBQUksR0FBRyxFQUFFLENBQUM7UUFDdEQsb0JBQWUsR0FBbUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQXFDdEQsQ0FBQztJQW5DQzs7OztPQUlHO0lBQ0gsSUFBSSxDQUFDLFNBQXVCLEVBQUUsT0FBb0I7UUFDaEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBRTNELE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFO1lBQ2xFLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNYLE1BQU0sSUFBSSxLQUFLLENBQUMsVUFBVSxJQUFJLDZCQUE2QixTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDbkYsQ0FBQztZQUNELElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLFlBQVksbUJBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQ3pDLE1BQU0sSUFBSSxLQUFLLENBQUMsVUFBVSxJQUFJLDZCQUE2QixDQUFDLENBQUM7WUFDL0QsQ0FBQztZQUNELEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2xDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVcsQ0FBQyxTQUFvQjtRQUM5QixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxjQUFjO1FBQ1osT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxRQUFRLENBQUMsU0FBb0I7UUFDM0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELE9BQU8sQ0FBQyxTQUFvQjtRQUMxQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzdDLENBQUM7Q0FDRjtBQXZDRCxrREF1Q0M7QUFFRDs7R0FFRztBQUNVLFFBQUEsbUJBQW1CLEdBQUcsSUFBSSxtQkFBbUIsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBBcGlDb250YWluZXIgfSBmcm9tICcuL2FwaS1jb250YWluZXInO1xuaW1wb3J0IHsgRnVuY3Rpb24sIEZ1bmN0aW9uSGFuZGxlciB9IGZyb20gJy4vZnVuY3Rpb24nO1xuXG4vKipcbiAqIFNlcnZpY2UgZGlzY292ZXJ5IGNvbmZpZ3VyYXRpb24gZm9yIHJ1bnRpbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlRW5kcG9pbnQge1xuICBiYXNlVXJsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQmluZGluZyBvcHRpb25zIGZvciBhbiBBcGlDb250YWluZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCaW5kT3B0aW9ucyBleHRlbmRzIFNlcnZpY2VFbmRwb2ludCB7XG4gIC8qKlxuICAgKiBPdmVycmlkZSBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbnMuXG4gICAqIEtleXMgYXJlIGZ1bmN0aW9uIHByb3BlcnR5IG5hbWVzIG9uIHRoZSBjb250YWluZXIuXG4gICAqL1xuICBvdmVybG9hZHM/OiBSZWNvcmQ8c3RyaW5nLCBGdW5jdGlvbkhhbmRsZXI+O1xufVxuXG4vKipcbiAqIEJpbmRpbmcgYmV0d2VlbiBhcmNoaXRlY3R1cmFsIGNvbXBvbmVudHMgYW5kIHRoZWlyIHJ1bnRpbWUgZW5kcG9pbnRzLlxuICogU3VwcG9ydHMgZnVuY3Rpb24gb3ZlcmxvYWRpbmcgZm9yIHJlcGxhY2luZyBpbXBsZW1lbnRhdGlvbnMgYXQgcnVudGltZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEFyY2hpdGVjdHVyZUJpbmRpbmcge1xuICBwcml2YXRlIGJpbmRpbmdzOiBNYXA8Q29uc3RydWN0LCBTZXJ2aWNlRW5kcG9pbnQ+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIGxvY2FsQ29tcG9uZW50czogU2V0PENvbnN0cnVjdD4gPSBuZXcgU2V0KCk7XG5cbiAgLyoqXG4gICAqIEJpbmQgYW4gYXJjaGl0ZWN0dXJhbCBjb21wb25lbnQgdG8gYSBzZXJ2aWNlIGVuZHBvaW50LlxuICAgKiBPcHRpb25hbGx5IG92ZXJyaWRlIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9ucyB3aXRoIHRoZSBvdmVybG9hZHMgb3B0aW9uLlxuICAgKiBPdmVybG9hZCBrZXlzIG11c3QgYmUgcm91dGUgbmFtZXMgcmVnaXN0ZXJlZCB2aWEgYWRkUm91dGUuXG4gICAqL1xuICBiaW5kKGNvbXBvbmVudDogQXBpQ29udGFpbmVyLCBvcHRpb25zOiBCaW5kT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMuYmluZGluZ3Muc2V0KGNvbXBvbmVudCwgeyBiYXNlVXJsOiBvcHRpb25zLmJhc2VVcmwgfSk7XG5cbiAgICBPYmplY3QuZW50cmllcyhvcHRpb25zLm92ZXJsb2FkcyA/PyB7fSkuZm9yRWFjaCgoW25hbWUsIGhhbmRsZXJdKSA9PiB7XG4gICAgICBjb25zdCByb3V0ZSA9IGNvbXBvbmVudC5nZXRSb3V0ZShuYW1lKTtcbiAgICAgIGlmICghcm91dGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSb3V0ZSAnJHtuYW1lfScgbm90IGZvdW5kIGluIGNvbXBvbmVudCAnJHtjb21wb25lbnQubm9kZS5pZH0nYCk7XG4gICAgICB9XG4gICAgICBpZiAoIShyb3V0ZS5oYW5kbGVyIGluc3RhbmNlb2YgRnVuY3Rpb24pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUm91dGUgJyR7bmFtZX0nIGhhbmRsZXIgaXMgbm90IGEgRnVuY3Rpb25gKTtcbiAgICAgIH1cbiAgICAgIHJvdXRlLmhhbmRsZXIub3ZlcmxvYWQoaGFuZGxlcik7XG4gICAgfSk7XG4gIH1cblxuICBnZXRFbmRwb2ludChjb21wb25lbnQ6IENvbnN0cnVjdCk6IFNlcnZpY2VFbmRwb2ludCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuYmluZGluZ3MuZ2V0KGNvbXBvbmVudCk7XG4gIH1cblxuICBnZXRBbGxCaW5kaW5ncygpOiBNYXA8Q29uc3RydWN0LCBTZXJ2aWNlRW5kcG9pbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5iaW5kaW5ncztcbiAgfVxuXG4gIHNldExvY2FsKGNvbXBvbmVudDogQ29uc3RydWN0KTogdm9pZCB7XG4gICAgdGhpcy5sb2NhbENvbXBvbmVudHMuYWRkKGNvbXBvbmVudCk7XG4gIH1cblxuICBpc0xvY2FsKGNvbXBvbmVudDogQ29uc3RydWN0KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubG9jYWxDb21wb25lbnRzLmhhcyhjb21wb25lbnQpO1xuICB9XG59XG5cbi8qKlxuICogR2xvYmFsIGJpbmRpbmcgcmVnaXN0cnlcbiAqL1xuZXhwb3J0IGNvbnN0IGFyY2hpdGVjdHVyZUJpbmRpbmcgPSBuZXcgQXJjaGl0ZWN0dXJlQmluZGluZygpO1xuIl19
|
package/dist/function.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"function.d.ts","sourceRoot":"","sources":["../src/function.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,MAAM,eAAe,CAAC,KAAK,SAAS,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,OAAO,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAE/G;;;GAGG;AACH,qBAAa,QAAQ,CAAC,KAAK,SAAS,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,OAAO,GAAG,GAAG,CAAE,SAAQ,SAAS;IACjF,SAAgB,OAAO,EAAE,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACzD,OAAO,CAAC,SAAS,CAAC,CAAkC;gBAExC,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC;IAKlF;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,IAAI;IAIxD,WAAW,IAAI,OAAO;IAIf,MAAM,CAAC,GAAG,IAAI,EAAE,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC;CAIhD;AAED;;;GAGG;AACH,qBAAa,WAAW,CAAC,KAAK,SAAS,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,OAAO,GAAG,GAAG,CAAE,SAAQ,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;gBACvF,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"function.d.ts","sourceRoot":"","sources":["../src/function.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,MAAM,eAAe,CAAC,KAAK,SAAS,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,OAAO,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAE/G;;;GAGG;AACH,qBAAa,QAAQ,CAAC,KAAK,SAAS,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,OAAO,GAAG,GAAG,CAAE,SAAQ,SAAS;IACjF,SAAgB,OAAO,EAAE,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACzD,OAAO,CAAC,SAAS,CAAC,CAAkC;gBAExC,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC;IAKlF;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,IAAI;IAIxD,WAAW,IAAI,OAAO;IAIf,MAAM,CAAC,GAAG,IAAI,EAAE,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC;CAIhD;AAED;;;GAGG;AACH,qBAAa,WAAW,CAAC,KAAK,SAAS,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,OAAO,GAAG,GAAG,CAAE,SAAQ,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;gBACvF,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM;CAGzC"}
|
package/dist/function.js
CHANGED
|
@@ -33,10 +33,8 @@ exports.Function = Function;
|
|
|
33
33
|
*/
|
|
34
34
|
class TBDFunction extends Function {
|
|
35
35
|
constructor(scope, id) {
|
|
36
|
-
super(scope, id, (() => {
|
|
37
|
-
return Promise.reject(new Error(`Function '${id}' is not implemented. Provide an overload before invoking.`));
|
|
38
|
-
}));
|
|
36
|
+
super(scope, id, (() => Promise.reject(new Error(`Function '${id}' is not implemented. Provide an overload before invoking.`))));
|
|
39
37
|
}
|
|
40
38
|
}
|
|
41
39
|
exports.TBDFunction = TBDFunction;
|
|
42
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZnVuY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkNBQXVDO0FBSXZDOzs7R0FHRztBQUNILE1BQWEsUUFBcUQsU0FBUSxzQkFBUztJQUlqRixZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLE9BQXdDO1FBQ2hGLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDakIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7T0FHRztJQUNILFFBQVEsQ0FBQyxPQUF3QztRQUMvQyxJQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQztJQUMzQixDQUFDO0lBRUQsV0FBVztRQUNULE9BQU8sSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUM7SUFDdEMsQ0FBQztJQUVNLE1BQU0sQ0FBQyxHQUFHLElBQVc7UUFDMUIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzFDLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7Q0FDRjtBQXpCRCw0QkF5QkM7QUFFRDs7O0dBR0c7QUFDSCxNQUFhLFdBQXdELFNBQVEsUUFBd0I7SUFDbkcsWUFBWSxLQUFnQixFQUFFLEVBQVU7UUFDdEMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRSw0REFBNEQsQ0FBQyxDQUFDLENBQW9DLENBQUMsQ0FBQztJQUN0SyxDQUFDO0NBQ0Y7QUFKRCxrQ0FJQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuXG5leHBvcnQgdHlwZSBGdW5jdGlvbkhhbmRsZXI8VEFyZ3MgZXh0ZW5kcyBhbnlbXSA9IGFueVtdLCBUUmV0dXJuID0gYW55PiA9ICguLi5hcmdzOiBUQXJncykgPT4gUHJvbWlzZTxUUmV0dXJuPjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgc2VydmVybGVzcyBmdW5jdGlvbiBvciBoYW5kbGVyIGluIHRoZSBhcmNoaXRlY3R1cmUuXG4gKiBHZW5lcmljIG92ZXIgYXJndW1lbnQgdHlwZXMgKFRBcmdzKSBhbmQgcmV0dXJuIHR5cGUgKFRSZXR1cm4pLlxuICovXG5leHBvcnQgY2xhc3MgRnVuY3Rpb248VEFyZ3MgZXh0ZW5kcyBhbnlbXSA9IGFueVtdLCBUUmV0dXJuID0gYW55PiBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBoYW5kbGVyOiBGdW5jdGlvbkhhbmRsZXI8VEFyZ3MsIFRSZXR1cm4+O1xuICBwcml2YXRlIF9vdmVybG9hZD86IEZ1bmN0aW9uSGFuZGxlcjxUQXJncywgVFJldHVybj47XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgaGFuZGxlcjogRnVuY3Rpb25IYW5kbGVyPFRBcmdzLCBUUmV0dXJuPikge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgZnVuY3Rpb24ncyBpbXBsZW1lbnRhdGlvbiBhdCBydW50aW1lLlxuICAgKiBVc2VkIGZvciByZXBsYWNpbmcgaW4tbWVtb3J5IGltcGxlbWVudGF0aW9ucyB3aXRoIHN0b3JhZ2UgYWRhcHRlcnMgb3IgSFRUUCBjYWxscy5cbiAgICovXG4gIG92ZXJsb2FkKGhhbmRsZXI6IEZ1bmN0aW9uSGFuZGxlcjxUQXJncywgVFJldHVybj4pOiB2b2lkIHtcbiAgICB0aGlzLl9vdmVybG9hZCA9IGhhbmRsZXI7XG4gIH1cblxuICBoYXNPdmVybG9hZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fb3ZlcmxvYWQgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBpbnZva2UoLi4uYXJnczogVEFyZ3MpOiBQcm9taXNlPFRSZXR1cm4+IHtcbiAgICBjb25zdCBmbiA9IHRoaXMuX292ZXJsb2FkID8/IHRoaXMuaGFuZGxlcjtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZuKC4uLmFyZ3MpKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgcGxhY2Vob2xkZXIgZnVuY3Rpb24gdGhhdCBtdXN0IGJlIG92ZXJsb2FkZWQgYmVmb3JlIHVzZS5cbiAqIFVzZSB0aGlzIHdoZW4gZGVmaW5pbmcgYW4gQVBJIGNvbnRyYWN0IHdpdGhvdXQgcHJvdmlkaW5nIGFuIGltcGxlbWVudGF0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgVEJERnVuY3Rpb248VEFyZ3MgZXh0ZW5kcyBhbnlbXSA9IGFueVtdLCBUUmV0dXJuID0gYW55PiBleHRlbmRzIEZ1bmN0aW9uPFRBcmdzLCBUUmV0dXJuPiB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsICgoKSA9PiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYEZ1bmN0aW9uICcke2lkfScgaXMgbm90IGltcGxlbWVudGVkLiBQcm92aWRlIGFuIG92ZXJsb2FkIGJlZm9yZSBpbnZva2luZy5gKSkpIGFzIEZ1bmN0aW9uSGFuZGxlcjxUQXJncywgVFJldHVybj4pO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ApiContainer } from './api-container';
|
|
2
|
+
import { FunctionHandler } from './function';
|
|
3
|
+
import { ServiceEndpoint } from './binding';
|
|
4
|
+
/**
|
|
5
|
+
* Create an HTTP handler for a route by name.
|
|
6
|
+
* Looks up the route path from the container's registry.
|
|
7
|
+
*/
|
|
8
|
+
export declare const httpHandler: (endpoint: ServiceEndpoint, container: ApiContainer, routeName: string, fetcher?: () => {
|
|
9
|
+
fetch: typeof fetch;
|
|
10
|
+
}) => FunctionHandler;
|
|
11
|
+
//# sourceMappingURL=http-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-handler.d.ts","sourceRoot":"","sources":["../src/http-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C;;;GAGG;AACH,eAAO,MAAM,WAAW,GACtB,UAAU,eAAe,EACzB,WAAW,YAAY,EACvB,WAAW,MAAM,EACjB,UAAS,MAAM;IAAE,KAAK,EAAE,OAAO,KAAK,CAAA;CAAoB,KACvD,eAgCF,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.httpHandler = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Create an HTTP handler for a route by name.
|
|
6
|
+
* Looks up the route path from the container's registry.
|
|
7
|
+
*/
|
|
8
|
+
const httpHandler = (endpoint, container, routeName, fetcher = () => ({ fetch })) => {
|
|
9
|
+
const route = container.getRoute(routeName);
|
|
10
|
+
if (!route) {
|
|
11
|
+
throw new Error(`Route '${routeName}' not found in container '${container.node.id}'`);
|
|
12
|
+
}
|
|
13
|
+
const [method, path] = route.path.split(' ');
|
|
14
|
+
const pathParams = path.match(/\{(\w+)\}/g) || [];
|
|
15
|
+
return async (...args) => {
|
|
16
|
+
const url = pathParams.reduce((u, param, i) => args[i] !== undefined ? u.replace(param, encodeURIComponent(String(args[i]))) : u, `${endpoint.baseUrl}${path}`);
|
|
17
|
+
const options = {
|
|
18
|
+
method: method || 'GET',
|
|
19
|
+
headers: { 'Content-Type': 'application/json' },
|
|
20
|
+
...((method === 'POST' || method === 'PUT') && args.length > pathParams.length
|
|
21
|
+
? { body: JSON.stringify(args[pathParams.length]) }
|
|
22
|
+
: {})
|
|
23
|
+
};
|
|
24
|
+
console.log('HTTP handler. Will fetch', { url, options });
|
|
25
|
+
const response = await fetcher().fetch(url, options);
|
|
26
|
+
if (!response.ok) {
|
|
27
|
+
throw new Error(`Remote call to ${url} with ${JSON.stringify(options)} failed: ${JSON.stringify(response)}`);
|
|
28
|
+
}
|
|
29
|
+
return response.json();
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
exports.httpHandler = httpHandler;
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1oYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2h0dHAtaGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFJQTs7O0dBR0c7QUFDSSxNQUFNLFdBQVcsR0FBRyxDQUN6QixRQUF5QixFQUN6QixTQUF1QixFQUN2QixTQUFpQixFQUNqQixVQUF5QyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUMsS0FBSyxFQUFDLENBQUMsRUFDdkMsRUFBRTtJQUNuQixNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzVDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNYLE1BQU0sSUFBSSxLQUFLLENBQUMsVUFBVSxTQUFTLDZCQUE2QixTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUVELE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0MsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7SUFFbEQsT0FBTyxLQUFLLEVBQUUsR0FBRyxJQUFXLEVBQUUsRUFBRTtRQUM5QixNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUMzQixDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ2xHLEdBQUcsUUFBUSxDQUFDLE9BQU8sR0FBRyxJQUFJLEVBQUUsQ0FDN0IsQ0FBQztRQUVGLE1BQU0sT0FBTyxHQUFnQjtZQUMzQixNQUFNLEVBQUUsTUFBTSxJQUFJLEtBQUs7WUFDdkIsT0FBTyxFQUFFLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFO1lBQy9DLEdBQUcsQ0FBQyxDQUFDLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU07Z0JBQzVFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRTtnQkFDbkQsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNSLENBQUM7UUFFRixPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQixFQUFFLEVBQUMsR0FBRyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7UUFDeEQsTUFBTSxRQUFRLEdBQUcsTUFBTSxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRXJELElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsR0FBRyxTQUFTLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFlBQVksSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0csQ0FBQztRQUVELE9BQU8sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3pCLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQztBQXJDVyxRQUFBLFdBQVcsZUFxQ3RCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXBpQ29udGFpbmVyIH0gZnJvbSAnLi9hcGktY29udGFpbmVyJztcbmltcG9ydCB7IEZ1bmN0aW9uSGFuZGxlciB9IGZyb20gJy4vZnVuY3Rpb24nO1xuaW1wb3J0IHsgU2VydmljZUVuZHBvaW50IH0gZnJvbSAnLi9iaW5kaW5nJztcblxuLyoqXG4gKiBDcmVhdGUgYW4gSFRUUCBoYW5kbGVyIGZvciBhIHJvdXRlIGJ5IG5hbWUuXG4gKiBMb29rcyB1cCB0aGUgcm91dGUgcGF0aCBmcm9tIHRoZSBjb250YWluZXIncyByZWdpc3RyeS5cbiAqL1xuZXhwb3J0IGNvbnN0IGh0dHBIYW5kbGVyID0gKFxuICBlbmRwb2ludDogU2VydmljZUVuZHBvaW50LFxuICBjb250YWluZXI6IEFwaUNvbnRhaW5lcixcbiAgcm91dGVOYW1lOiBzdHJpbmcsXG4gIGZldGNoZXI6ICgpID0+IHsgZmV0Y2g6IHR5cGVvZiBmZXRjaCB9ID0gKCkgPT4gKHtmZXRjaH0pXG4pOiBGdW5jdGlvbkhhbmRsZXIgPT4ge1xuICBjb25zdCByb3V0ZSA9IGNvbnRhaW5lci5nZXRSb3V0ZShyb3V0ZU5hbWUpO1xuICBpZiAoIXJvdXRlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBSb3V0ZSAnJHtyb3V0ZU5hbWV9JyBub3QgZm91bmQgaW4gY29udGFpbmVyICcke2NvbnRhaW5lci5ub2RlLmlkfSdgKTtcbiAgfVxuXG4gIGNvbnN0IFttZXRob2QsIHBhdGhdID0gcm91dGUucGF0aC5zcGxpdCgnICcpO1xuICBjb25zdCBwYXRoUGFyYW1zID0gcGF0aC5tYXRjaCgvXFx7KFxcdyspXFx9L2cpIHx8IFtdO1xuXG4gIHJldHVybiBhc3luYyAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICBjb25zdCB1cmwgPSBwYXRoUGFyYW1zLnJlZHVjZShcbiAgICAgICh1LCBwYXJhbSwgaSkgPT4gYXJnc1tpXSAhPT0gdW5kZWZpbmVkID8gdS5yZXBsYWNlKHBhcmFtLCBlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKGFyZ3NbaV0pKSkgOiB1LFxuICAgICAgYCR7ZW5kcG9pbnQuYmFzZVVybH0ke3BhdGh9YFxuICAgICk7XG5cbiAgICBjb25zdCBvcHRpb25zOiBSZXF1ZXN0SW5pdCA9IHtcbiAgICAgIG1ldGhvZDogbWV0aG9kIHx8ICdHRVQnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAuLi4oKG1ldGhvZCA9PT0gJ1BPU1QnIHx8IG1ldGhvZCA9PT0gJ1BVVCcpICYmIGFyZ3MubGVuZ3RoID4gcGF0aFBhcmFtcy5sZW5ndGhcbiAgICAgICAgPyB7IGJvZHk6IEpTT04uc3RyaW5naWZ5KGFyZ3NbcGF0aFBhcmFtcy5sZW5ndGhdKSB9XG4gICAgICAgIDoge30pXG4gICAgfTtcblxuICAgIGNvbnNvbGUubG9nKCdIVFRQIGhhbmRsZXIuIFdpbGwgZmV0Y2gnLCB7dXJsLCBvcHRpb25zfSk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaGVyKCkuZmV0Y2godXJsLCBvcHRpb25zKTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUmVtb3RlIGNhbGwgdG8gJHt1cmx9IHdpdGggJHtKU09OLnN0cmluZ2lmeShvcHRpb25zKX0gZmFpbGVkOiAke0pTT04uc3RyaW5naWZ5KHJlc3BvbnNlKX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xuICB9O1xufTsiXX0=
|
package/dist/index.d.ts
CHANGED
|
@@ -3,4 +3,5 @@ export { Architecture, ArchitectureDefinition, ComponentDefinition } from './arc
|
|
|
3
3
|
export { Function, TBDFunction, FunctionHandler } from './function';
|
|
4
4
|
export { ApiContainer, ApiRoutes, RouteEntry } from './api-container';
|
|
5
5
|
export { ArchitectureBinding, ServiceEndpoint, architectureBinding } from './binding';
|
|
6
|
+
export { httpHandler } from './http-handler';
|
|
6
7
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC3F,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC3F,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AACtF,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.architectureBinding = exports.ArchitectureBinding = exports.ApiContainer = exports.TBDFunction = exports.Function = exports.Architecture = exports.Construct = void 0;
|
|
3
|
+
exports.httpHandler = exports.architectureBinding = exports.ArchitectureBinding = exports.ApiContainer = exports.TBDFunction = exports.Function = exports.Architecture = exports.Construct = void 0;
|
|
4
4
|
var constructs_1 = require("constructs");
|
|
5
5
|
Object.defineProperty(exports, "Construct", { enumerable: true, get: function () { return constructs_1.Construct; } });
|
|
6
6
|
var architecture_1 = require("./architecture");
|
|
@@ -13,4 +13,6 @@ Object.defineProperty(exports, "ApiContainer", { enumerable: true, get: function
|
|
|
13
13
|
var binding_1 = require("./binding");
|
|
14
14
|
Object.defineProperty(exports, "ArchitectureBinding", { enumerable: true, get: function () { return binding_1.ArchitectureBinding; } });
|
|
15
15
|
Object.defineProperty(exports, "architectureBinding", { enumerable: true, get: function () { return binding_1.architectureBinding; } });
|
|
16
|
-
|
|
16
|
+
var http_handler_1 = require("./http-handler");
|
|
17
|
+
Object.defineProperty(exports, "httpHandler", { enumerable: true, get: function () { return http_handler_1.httpHandler; } });
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUNBQXVDO0FBQTlCLHVHQUFBLFNBQVMsT0FBQTtBQUNsQiwrQ0FBMkY7QUFBbEYsNEdBQUEsWUFBWSxPQUFBO0FBQ3JCLHVDQUFvRTtBQUEzRCxvR0FBQSxRQUFRLE9BQUE7QUFBRSx1R0FBQSxXQUFXLE9BQUE7QUFDOUIsaURBQXNFO0FBQTdELDZHQUFBLFlBQVksT0FBQTtBQUNyQixxQ0FBc0Y7QUFBN0UsOEdBQUEsbUJBQW1CLE9BQUE7QUFBbUIsOEdBQUEsbUJBQW1CLE9BQUE7QUFDbEUsK0NBQTZDO0FBQXBDLDJHQUFBLFdBQVcsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuZXhwb3J0IHsgQXJjaGl0ZWN0dXJlLCBBcmNoaXRlY3R1cmVEZWZpbml0aW9uLCBDb21wb25lbnREZWZpbml0aW9uIH0gZnJvbSAnLi9hcmNoaXRlY3R1cmUnO1xuZXhwb3J0IHsgRnVuY3Rpb24sIFRCREZ1bmN0aW9uLCBGdW5jdGlvbkhhbmRsZXIgfSBmcm9tICcuL2Z1bmN0aW9uJztcbmV4cG9ydCB7IEFwaUNvbnRhaW5lciwgQXBpUm91dGVzLCBSb3V0ZUVudHJ5IH0gZnJvbSAnLi9hcGktY29udGFpbmVyJztcbmV4cG9ydCB7IEFyY2hpdGVjdHVyZUJpbmRpbmcsIFNlcnZpY2VFbmRwb2ludCwgYXJjaGl0ZWN0dXJlQmluZGluZyB9IGZyb20gJy4vYmluZGluZyc7XG5leHBvcnQgeyBodHRwSGFuZGxlciB9IGZyb20gJy4vaHR0cC1oYW5kbGVyJztcbiJdfQ==
|
package/package.json
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@arinoto/cdk-arch",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "CDK Architecture primitives for event-driven solution architectures",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
|
+
"module": "dist/index.js",
|
|
7
8
|
"private": false,
|
|
8
9
|
"publishConfig": {
|
|
9
10
|
"access": "public"
|
package/src/api-container.ts
CHANGED
|
@@ -6,7 +6,6 @@ export interface ApiRoutes {
|
|
|
6
6
|
}
|
|
7
7
|
|
|
8
8
|
export interface RouteEntry {
|
|
9
|
-
name: string;
|
|
10
9
|
path: string;
|
|
11
10
|
handler: Function;
|
|
12
11
|
}
|
|
@@ -23,7 +22,7 @@ export class ApiContainer extends Construct {
|
|
|
23
22
|
}
|
|
24
23
|
|
|
25
24
|
addRoute(name: string, path: string, handler: Function): void {
|
|
26
|
-
this.routes[name] = {
|
|
25
|
+
this.routes[name] = { path, handler };
|
|
27
26
|
}
|
|
28
27
|
|
|
29
28
|
getRoute(name: string): RouteEntry {
|
package/src/binding.ts
CHANGED
|
@@ -6,8 +6,7 @@ import { Function, FunctionHandler } from './function';
|
|
|
6
6
|
* Service discovery configuration for runtime
|
|
7
7
|
*/
|
|
8
8
|
export interface ServiceEndpoint {
|
|
9
|
-
|
|
10
|
-
port: number;
|
|
9
|
+
baseUrl: string;
|
|
11
10
|
}
|
|
12
11
|
|
|
13
12
|
/**
|
|
@@ -35,7 +34,7 @@ export class ArchitectureBinding {
|
|
|
35
34
|
* Overload keys must be route names registered via addRoute.
|
|
36
35
|
*/
|
|
37
36
|
bind(component: ApiContainer, options: BindOptions): void {
|
|
38
|
-
this.bindings.set(component, {
|
|
37
|
+
this.bindings.set(component, { baseUrl: options.baseUrl });
|
|
39
38
|
|
|
40
39
|
Object.entries(options.overloads ?? {}).forEach(([name, handler]) => {
|
|
41
40
|
const route = component.getRoute(name);
|
|
@@ -49,18 +48,6 @@ export class ArchitectureBinding {
|
|
|
49
48
|
});
|
|
50
49
|
}
|
|
51
50
|
|
|
52
|
-
/**
|
|
53
|
-
* Bind a component from environment variables.
|
|
54
|
-
* Looks for {PREFIX}_HOST and {PREFIX}_PORT environment variables.
|
|
55
|
-
*/
|
|
56
|
-
bindFromEnv(component: ApiContainer, envPrefix: string, overloads?: Record<string, FunctionHandler>): void {
|
|
57
|
-
const host = process.env[`${envPrefix}_HOST`];
|
|
58
|
-
const port = process.env[`${envPrefix}_PORT`];
|
|
59
|
-
if (host && port) {
|
|
60
|
-
this.bind(component, { host, port: parseInt(port), overloads });
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
51
|
getEndpoint(component: Construct): ServiceEndpoint | undefined {
|
|
65
52
|
return this.bindings.get(component);
|
|
66
53
|
}
|
package/src/function.ts
CHANGED
|
@@ -39,8 +39,6 @@ export class Function<TArgs extends any[] = any[], TReturn = any> extends Constr
|
|
|
39
39
|
*/
|
|
40
40
|
export class TBDFunction<TArgs extends any[] = any[], TReturn = any> extends Function<TArgs, TReturn> {
|
|
41
41
|
constructor(scope: Construct, id: string) {
|
|
42
|
-
super(scope, id, (() => {
|
|
43
|
-
return Promise.reject(new Error(`Function '${id}' is not implemented. Provide an overload before invoking.`));
|
|
44
|
-
}) as FunctionHandler<TArgs, TReturn>);
|
|
42
|
+
super(scope, id, (() => Promise.reject(new Error(`Function '${id}' is not implemented. Provide an overload before invoking.`))) as FunctionHandler<TArgs, TReturn>);
|
|
45
43
|
}
|
|
46
44
|
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { ApiContainer } from './api-container';
|
|
2
|
+
import { FunctionHandler } from './function';
|
|
3
|
+
import { ServiceEndpoint } from './binding';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Create an HTTP handler for a route by name.
|
|
7
|
+
* Looks up the route path from the container's registry.
|
|
8
|
+
*/
|
|
9
|
+
export const httpHandler = (
|
|
10
|
+
endpoint: ServiceEndpoint,
|
|
11
|
+
container: ApiContainer,
|
|
12
|
+
routeName: string,
|
|
13
|
+
fetcher: () => { fetch: typeof fetch } = () => ({fetch})
|
|
14
|
+
): FunctionHandler => {
|
|
15
|
+
const route = container.getRoute(routeName);
|
|
16
|
+
if (!route) {
|
|
17
|
+
throw new Error(`Route '${routeName}' not found in container '${container.node.id}'`);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const [method, path] = route.path.split(' ');
|
|
21
|
+
const pathParams = path.match(/\{(\w+)\}/g) || [];
|
|
22
|
+
|
|
23
|
+
return async (...args: any[]) => {
|
|
24
|
+
const url = pathParams.reduce(
|
|
25
|
+
(u, param, i) => args[i] !== undefined ? u.replace(param, encodeURIComponent(String(args[i]))) : u,
|
|
26
|
+
`${endpoint.baseUrl}${path}`
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
const options: RequestInit = {
|
|
30
|
+
method: method || 'GET',
|
|
31
|
+
headers: { 'Content-Type': 'application/json' },
|
|
32
|
+
...((method === 'POST' || method === 'PUT') && args.length > pathParams.length
|
|
33
|
+
? { body: JSON.stringify(args[pathParams.length]) }
|
|
34
|
+
: {})
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
console.log('HTTP handler. Will fetch', {url, options});
|
|
38
|
+
const response = await fetcher().fetch(url, options);
|
|
39
|
+
|
|
40
|
+
if (!response.ok) {
|
|
41
|
+
throw new Error(`Remote call to ${url} with ${JSON.stringify(options)} failed: ${JSON.stringify(response)}`);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return response.json();
|
|
45
|
+
};
|
|
46
|
+
};
|
package/src/index.ts
CHANGED
|
@@ -3,3 +3,4 @@ export { Architecture, ArchitectureDefinition, ComponentDefinition } from './arc
|
|
|
3
3
|
export { Function, TBDFunction, FunctionHandler } from './function';
|
|
4
4
|
export { ApiContainer, ApiRoutes, RouteEntry } from './api-container';
|
|
5
5
|
export { ArchitectureBinding, ServiceEndpoint, architectureBinding } from './binding';
|
|
6
|
+
export { httpHandler } from './http-handler';
|