Fix StartOS 0.4 TypeScript packaging to match SDK API
This commit is contained in:
+117
@@ -0,0 +1,117 @@
|
||||
"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
|
||||
Reference in New Issue
Block a user