durable-functions
Version:
Durable Functions library for Node.js Azure Functions
107 lines • 5.22 kB
JavaScript
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Entity = void 0;
const debug = require("debug");
const DurableEntityBindingInfo_1 = require("./DurableEntityBindingInfo");
const Utils_1 = require("../util/Utils");
const EntityState_1 = require("./EntityState");
const OperationResult_1 = require("./OperationResult");
const Signal_1 = require("./Signal");
const EntityId_1 = require("./EntityId");
const log = debug("orchestrator");
class Entity {
constructor(fn) {
this.fn = fn;
}
listen() {
return this.handle.bind(this);
}
handle(entityTrigger, context) {
return __awaiter(this, void 0, void 0, function* () {
const entityBinding = Utils_1.Utils.getInstancesOf({ trigger: entityTrigger }, new DurableEntityBindingInfo_1.DurableEntityBindingInfoReqFields(new EntityId_1.EntityId("samplename", "samplekey"), true, []))[0];
if (entityBinding === undefined) {
throw new Error("Could not find an entityTrigger binding on context.");
}
const returnState = new EntityState_1.EntityState([], []);
returnState.entityExists = entityBinding.exists;
returnState.entityState = entityBinding.state;
for (let i = 0; i < entityBinding.batch.length; i++) {
const startTime = new Date();
context.df = this.getCurrentDurableEntityContext(entityBinding, returnState, i, startTime);
try {
yield Promise.resolve(this.fn(context));
if (!returnState.results[i]) {
const elapsedMs = this.computeElapsedMilliseconds(startTime);
returnState.results[i] = new OperationResult_1.OperationResult(false, elapsedMs, startTime.getTime());
}
}
catch (error) {
const elapsedMs = this.computeElapsedMilliseconds(startTime);
returnState.results[i] = new OperationResult_1.OperationResult(true, elapsedMs, startTime.getTime(), JSON.stringify(error));
}
}
return returnState;
});
}
getCurrentDurableEntityContext(bindingInfo, batchState, requestIndex, startTime) {
const currentRequest = bindingInfo.batch[requestIndex];
return {
entityName: bindingInfo.self.name,
entityKey: bindingInfo.self.key,
entityId: bindingInfo.self,
operationName: currentRequest.name,
isNewlyConstructed: !batchState.entityExists,
getState: this.getState.bind(this, batchState),
setState: this.setState.bind(this, batchState),
getInput: this.getInput.bind(this, currentRequest),
return: this.return.bind(this, batchState, startTime),
destructOnExit: this.destructOnExit.bind(this, batchState),
signalEntity: this.signalEntity.bind(this, batchState, currentRequest),
};
}
destructOnExit(batchState) {
batchState.entityExists = false;
batchState.entityState = undefined;
}
getInput(currentRequest) {
if (currentRequest.input) {
return JSON.parse(currentRequest.input);
}
return undefined;
}
getState(returnState, initializer) {
if (returnState.entityState) {
return JSON.parse(returnState.entityState);
}
else if (initializer) {
return initializer();
}
return undefined;
}
return(returnState, startTime, result) {
returnState.entityExists = true;
returnState.results.push(new OperationResult_1.OperationResult(false, this.computeElapsedMilliseconds(startTime), startTime.getTime(), JSON.stringify(result)));
}
setState(returnState, state) {
returnState.entityExists = true;
returnState.entityState = JSON.stringify(state);
}
signalEntity(returnState, request, entity, operationName, operationInput) {
returnState.signals.push(new Signal_1.Signal(entity, operationName, operationInput ? JSON.stringify(operationInput) : "", request.id, new Date().getTime()));
}
computeElapsedMilliseconds(startTime) {
const endTime = new Date();
return endTime.getTime() - startTime.getTime();
}
}
exports.Entity = Entity;
//# sourceMappingURL=Entity.js.map
;