Files
recap/node_modules/@start9labs/start-sdk/base/lib/actions/setupActions.js
T

117 lines
3.8 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Actions = exports.Action = void 0;
const util_1 = require("../util");
function callMaybeFn(maybeFn, options) {
if (maybeFn instanceof Function) {
return maybeFn(options);
}
else {
return Promise.resolve(maybeFn);
}
}
function mapMaybeFn(maybeFn, map) {
if (maybeFn instanceof Function) {
return async (...args) => map(await maybeFn(...args));
}
else {
return map(maybeFn);
}
}
class Action {
constructor(id, metadataFn, inputSpec, getInputFn, runFn) {
this.id = id;
this.metadataFn = metadataFn;
this.inputSpec = inputSpec;
this.getInputFn = getInputFn;
this.runFn = runFn;
this._INPUT = null;
this.prevInputSpec = {};
}
static withInput(id, metadata, inputSpec, getInput, run) {
return new Action(id, mapMaybeFn(metadata, (m) => ({ ...m, hasInput: true })), inputSpec, getInput, run);
}
static withoutInput(id, metadata, run) {
return new Action(id, mapMaybeFn(metadata, (m) => ({ ...m, hasInput: false })), null, async () => null, run);
}
async exportMetadata(options) {
const childEffects = options.effects.child(`setupActions/${this.id}`);
childEffects.constRetry = (0, util_1.once)(() => {
this.exportMetadata(options);
});
const metadata = await callMaybeFn(this.metadataFn, {
effects: childEffects,
});
await options.effects.action.export({ id: this.id, metadata });
return metadata;
}
async getInput(options) {
let spec = {};
if (this.inputSpec) {
const inputSpec = await callMaybeFn(this.inputSpec, options);
const built = await inputSpec?.build(options);
if (built) {
this.prevInputSpec[options.effects.eventId] = built;
spec = built.spec;
}
}
return {
eventId: options.effects.eventId,
spec,
value: (await this.getInputFn(options)) || null,
};
}
async run(options) {
let spec = {};
if (this.inputSpec) {
const prevInputSpec = this.prevInputSpec[options.effects.eventId];
if (!prevInputSpec) {
throw new Error(`getActionInput has not been called for EventID ${options.effects.eventId}`);
}
options.input = prevInputSpec.validator.parse(options.input);
spec = prevInputSpec.spec;
}
return ((await this.runFn({
effects: options.effects,
input: options.input,
spec,
})) ?? null);
}
}
exports.Action = Action;
class Actions {
constructor(actions) {
this.actions = actions;
}
static of() {
return new Actions({});
}
addAction(action) {
return new Actions({ ...this.actions, [action.id]: action });
}
async init(effects) {
for (let action of Object.values(this.actions)) {
const fn = async () => {
let res = () => { };
const complete = new Promise((resolve) => {
res = resolve;
});
const e = effects.child(action.id);
e.constRetry = (0, util_1.once)(() => complete.then(() => fn()).catch(console.error));
try {
await action.exportMetadata({ effects: e });
}
finally {
res();
}
};
await fn();
}
await effects.action.clear({ except: Object.keys(this.actions) });
}
get(actionId) {
return this.actions[actionId];
}
}
exports.Actions = Actions;
//# sourceMappingURL=setupActions.js.map