93 lines
3.9 KiB
JavaScript
Executable file
93 lines
3.9 KiB
JavaScript
Executable file
"use strict";
|
|
/**
|
|
* @license
|
|
* Copyright Google LLC All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by an MIT-style license that can be
|
|
* found in the LICENSE file at https://angular.io/license
|
|
*/
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.strategy = void 0;
|
|
const rxjs_1 = require("rxjs");
|
|
const operators_1 = require("rxjs/operators");
|
|
const api_1 = require("./api");
|
|
const stableStringify = require('fast-json-stable-stringify');
|
|
// eslint-disable-next-line @typescript-eslint/no-namespace
|
|
var strategy;
|
|
(function (strategy) {
|
|
/**
|
|
* Creates a JobStrategy that serializes every call. This strategy can be mixed between jobs.
|
|
*/
|
|
function serialize() {
|
|
let latest = rxjs_1.of();
|
|
return (handler, options) => {
|
|
const newHandler = (argument, context) => {
|
|
const previous = latest;
|
|
latest = rxjs_1.concat(previous.pipe(operators_1.ignoreElements()), new rxjs_1.Observable((o) => handler(argument, context).subscribe(o))).pipe(operators_1.shareReplay(0));
|
|
return latest;
|
|
};
|
|
return Object.assign(newHandler, {
|
|
jobDescription: Object.assign({}, handler.jobDescription, options),
|
|
});
|
|
};
|
|
}
|
|
strategy.serialize = serialize;
|
|
/**
|
|
* Creates a JobStrategy that will always reuse a running job, and restart it if the job ended.
|
|
* @param replayMessages Replay ALL messages if a job is reused, otherwise just hook up where it
|
|
* is.
|
|
*/
|
|
function reuse(replayMessages = false) {
|
|
let inboundBus = new rxjs_1.Subject();
|
|
let run = null;
|
|
let state = null;
|
|
return (handler, options) => {
|
|
const newHandler = (argument, context) => {
|
|
// Forward inputs.
|
|
const subscription = context.inboundBus.subscribe(inboundBus);
|
|
if (run) {
|
|
return rxjs_1.concat(
|
|
// Update state.
|
|
rxjs_1.of(state), run).pipe(operators_1.finalize(() => subscription.unsubscribe()));
|
|
}
|
|
run = handler(argument, { ...context, inboundBus: inboundBus.asObservable() }).pipe(operators_1.tap((message) => {
|
|
if (message.kind == api_1.JobOutboundMessageKind.Start ||
|
|
message.kind == api_1.JobOutboundMessageKind.OnReady ||
|
|
message.kind == api_1.JobOutboundMessageKind.End) {
|
|
state = message;
|
|
}
|
|
}, undefined, () => {
|
|
subscription.unsubscribe();
|
|
inboundBus = new rxjs_1.Subject();
|
|
run = null;
|
|
}), replayMessages ? operators_1.shareReplay() : operators_1.share());
|
|
return run;
|
|
};
|
|
return Object.assign(newHandler, handler, options || {});
|
|
};
|
|
}
|
|
strategy.reuse = reuse;
|
|
/**
|
|
* Creates a JobStrategy that will reuse a running job if the argument matches.
|
|
* @param replayMessages Replay ALL messages if a job is reused, otherwise just hook up where it
|
|
* is.
|
|
*/
|
|
function memoize(replayMessages = false) {
|
|
const runs = new Map();
|
|
return (handler, options) => {
|
|
const newHandler = (argument, context) => {
|
|
const argumentJson = stableStringify(argument);
|
|
const maybeJob = runs.get(argumentJson);
|
|
if (maybeJob) {
|
|
return maybeJob;
|
|
}
|
|
const run = handler(argument, context).pipe(replayMessages ? operators_1.shareReplay() : operators_1.share());
|
|
runs.set(argumentJson, run);
|
|
return run;
|
|
};
|
|
return Object.assign(newHandler, handler, options || {});
|
|
};
|
|
}
|
|
strategy.memoize = memoize;
|
|
})(strategy = exports.strategy || (exports.strategy = {}));
|