@angular-devkit/core 7.2.0-beta.1 → 7.2.1
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/node/_golden-api.d.ts +12 -0
- package/node/_golden-api.js +24 -0
- package/node/experimental/index.d.ts +9 -0
- package/node/experimental/index.js +12 -0
- package/node/experimental/job-registry.d.ts +22 -0
- package/node/experimental/job-registry.js +70 -0
- package/node/fs.d.ts +2 -4
- package/node/fs.js +25 -28
- package/node/index.d.ts +3 -1
- package/node/index.js +5 -2
- package/node/resolve.js +4 -4
- package/package.json +2 -2
- package/src/exception/exception.d.ts +1 -1
- package/src/exception/exception.js +2 -2
- package/src/experimental/jobs/README.md +495 -0
- package/src/experimental/jobs/api.d.ts +345 -0
- package/src/experimental/jobs/api.js +68 -0
- package/src/experimental/jobs/architecture.md +257 -0
- package/src/experimental/jobs/create-job-handler.d.ts +50 -0
- package/src/experimental/jobs/create-job-handler.js +145 -0
- package/src/experimental/jobs/dispatcher.d.ts +32 -0
- package/src/experimental/jobs/dispatcher.js +42 -0
- package/src/experimental/jobs/exception.d.ts +15 -0
- package/src/experimental/jobs/exception.js +23 -0
- package/src/experimental/jobs/index.d.ts +14 -0
- package/src/experimental/jobs/index.js +20 -0
- package/src/experimental/jobs/simple-registry.d.ts +44 -0
- package/src/experimental/jobs/simple-registry.js +74 -0
- package/src/experimental/jobs/simple-scheduler.d.ts +74 -0
- package/src/experimental/jobs/simple-scheduler.js +367 -0
- package/src/experimental/jobs/strategy.d.ts +15 -0
- package/src/experimental/jobs/strategy.js +55 -0
- package/src/experimental.d.ts +2 -1
- package/src/experimental.js +3 -1
- package/src/json/schema/index.d.ts +1 -0
- package/src/json/schema/index.js +2 -1
- package/src/json/schema/registry.d.ts +2 -1
- package/src/json/schema/registry.js +10 -1
- package/src/json/schema/schema.d.ts +15 -0
- package/src/json/schema/schema.js +52 -0
- package/src/json/schema/utility.d.ts +2 -9
- package/src/json/schema/utility.js +1 -1
- package/src/json/schema/visitor.d.ts +2 -1
- package/src/json/schema/visitor.js +5 -1
- package/src/logger/logger.d.ts +1 -0
- package/src/logger/logger.js +4 -1
- package/src/utils/index.d.ts +9 -0
- package/src/utils/index.js +1 -1
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
|
|
2
|
+
# Overview
|
|
3
|
+
Jobs is a high-order API that adds inputs, runtime type checking, sequencing, and other
|
|
4
|
+
functionality on top of RxJS' `Observable`s.
|
|
5
|
+
|
|
6
|
+
# Background
|
|
7
|
+
An `Observable` (at a higher level) is a function that receives a `Subscriber`, and outputs
|
|
8
|
+
multiple values, and finishes once it calls the `Subscriber.prototype.complete()` method (in
|
|
9
|
+
JavaScript):
|
|
10
|
+
|
|
11
|
+
```javascript
|
|
12
|
+
const output1To10EverySecond = function (subscriber) {
|
|
13
|
+
let t = 0;
|
|
14
|
+
const i = setInterval(() => {
|
|
15
|
+
t++;
|
|
16
|
+
subscriber.next(t);
|
|
17
|
+
if (t === 10) {
|
|
18
|
+
subscriber.complete(t);
|
|
19
|
+
}
|
|
20
|
+
}, 1000);
|
|
21
|
+
return () => clearInterval(i);
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const stream$ = new Observable(output1To10EverySecond);
|
|
25
|
+
// Start the function, and output 1 to 100, once per line.
|
|
26
|
+
stream$.subscribe(x => console.log(x));
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
This, of course, can be typed in TypeScript, but those types are not enforced at runtime.
|
|
30
|
+
|
|
31
|
+
# Glossary
|
|
32
|
+
- `job handler`. The function that implements the job's logic.
|
|
33
|
+
- `raw input`. The input observable sending messages to the job. These messages are of type
|
|
34
|
+
`JobInboundMessage`.
|
|
35
|
+
- `raw output`. The output observer returned from the `job handler`. Messages on this observable
|
|
36
|
+
are of type `JobOutboundMessage`.
|
|
37
|
+
|
|
38
|
+
# Description
|
|
39
|
+
|
|
40
|
+
A `JobHandler`, similar to observables, is a function that receives an argument and a context, and
|
|
41
|
+
returns an `Observable` of messages, which can include outputs that are typed at runtime (using a
|
|
42
|
+
Json Schema):
|
|
43
|
+
|
|
44
|
+
```javascript
|
|
45
|
+
const output1ToXEverySecond = function (x, context) {
|
|
46
|
+
return new Observable(subscriber => {
|
|
47
|
+
let t = 0;
|
|
48
|
+
|
|
49
|
+
// Notify our users that the actual work is started.
|
|
50
|
+
subscriber.next({ kind: JobOutboundMessageKind.Start });
|
|
51
|
+
const i = setInterval(() => {
|
|
52
|
+
t++;
|
|
53
|
+
subscriber.next({ kind: JobOutboundMessageKind.Output, value: t });
|
|
54
|
+
if (t === x) {
|
|
55
|
+
subscriber.next({ kind: JobOutboundMessageKind.End });
|
|
56
|
+
subscriber.complete();
|
|
57
|
+
}
|
|
58
|
+
}, 1000);
|
|
59
|
+
|
|
60
|
+
return () => {
|
|
61
|
+
clearInterval(i);
|
|
62
|
+
};
|
|
63
|
+
})
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
// For now, jobs can not be called without a registry and scheduler.
|
|
67
|
+
const registry = new SimpleJobRegistry();
|
|
68
|
+
registry.register('output-from-1-to-x', output1ToXEverySecond, {
|
|
69
|
+
argument: { type: 'number' },
|
|
70
|
+
output: { type: 'number' },
|
|
71
|
+
});
|
|
72
|
+
const scheduler = new SimpleScheduler(registry);
|
|
73
|
+
|
|
74
|
+
// Need to keep the same name that the registry would understand.
|
|
75
|
+
// Count from 1 to 10.
|
|
76
|
+
const job = scheduler.schedule('output-from-1-to-x', 10);
|
|
77
|
+
|
|
78
|
+
// A Job<> instance has more members, but we only want the output values here.
|
|
79
|
+
job.output.subscribe(x => console.log(x));
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
This seems like a lot of boilerplate in comparison, but there are a few advantages;
|
|
83
|
+
|
|
84
|
+
1. lifecycle. Jobs can tell when they start doing work and when work is done.
|
|
85
|
+
1. everything is typed, even at runtime.
|
|
86
|
+
1. the context also contains an input Observable that receives typed input messages, including
|
|
87
|
+
input values, and stop requests.
|
|
88
|
+
1. jobs can also schedule other jobs and wait for them, even if they don't know if a job is
|
|
89
|
+
implemented in the system.
|
|
90
|
+
|
|
91
|
+
## Diagram
|
|
92
|
+
A simpler way to think about jobs in contrast to observables is that job are closer to a Unix
|
|
93
|
+
process. It has an argument (command line flags), receive inputs (STDIN and interupt signals),
|
|
94
|
+
and output values (STDOUT) as well as diagnostic (STDERR). They can be plugged one into another
|
|
95
|
+
(piping), and can be transformed, synchronized and scheduled (fork, exec, cron).
|
|
96
|
+
|
|
97
|
+
```plain
|
|
98
|
+
- given A the type of the argument
|
|
99
|
+
- given I the type of the input
|
|
100
|
+
- given O the type of the output
|
|
101
|
+
|
|
102
|
+
,______________________
|
|
103
|
+
JobInboundMessage<I> --> | handler(argument: A) | --> JobOutboundMessage<O>
|
|
104
|
+
`⎻⎻⎻⎻⎻⎻⎻⎻⎻⎻⎻⎻⎻⎻⎻⎻⎻⎻⎻⎻⎻⎻ - JobOutboundMessageKind.Log
|
|
105
|
+
- JobOutboundMessageKind.Output
|
|
106
|
+
- ...
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
`JobInboundMessage` includes:
|
|
110
|
+
|
|
111
|
+
1. `JobInboundMessageKind.Ping`. A simple message that should be answered with
|
|
112
|
+
`JobOutboundMessageKind.Pong` when the job is responsive. The `id` field of the message should
|
|
113
|
+
be used when returning `Pong`.
|
|
114
|
+
1. `JobInboundMessageKind.Stop`. The job should be stopped. This is used when
|
|
115
|
+
cancelling/unsubscribing from the `output` (or by calling `stop()`). Any inputs or outputs
|
|
116
|
+
after this message will be ignored.
|
|
117
|
+
1. `JobInboundMessageKind.Input` is used when sending inputs to a job. These correspond to the
|
|
118
|
+
`next` methods of an `Observer` and are reported to the job through its `context.input`
|
|
119
|
+
Observable. There is no way to communicate an error to the job.
|
|
120
|
+
|
|
121
|
+
`JobOutboundMessage` includes:
|
|
122
|
+
|
|
123
|
+
1. `JobOutboundMessageKind.Ready`. The `Job<>` was created, its dependencies are done, and the
|
|
124
|
+
library is validating Argument and calling the internal job code.
|
|
125
|
+
1. `JobOutboundMessageKind.Start`. The job code itself should send that message when started.
|
|
126
|
+
`createJobHandler()` will do it automatically.
|
|
127
|
+
1. `JobOutboundMessageKind.End`. The job has ended. This is done by the job itself and should
|
|
128
|
+
always be sent when completed. The scheduler will listen to this message to set the state and
|
|
129
|
+
unblock dependent jobs. `createJobHandler()` automatically send this message.
|
|
130
|
+
1. `JobOutboundMessageKind.Pong`. The job should answer a `JobInboundMessageKind.Ping` message with
|
|
131
|
+
this. Automatically done by `createJobHandler()`.
|
|
132
|
+
1. `JobOutboundMessageKind.Log`. A logging message (side effect that should be shown to the user).
|
|
133
|
+
1. `JobOutboundMessageKind.Output`. An `Output` has been generated by the job.
|
|
134
|
+
1. `JobOutboundMessageKind.ChannelMessage`, `JobOutboundMessageKind.ChannelError` and
|
|
135
|
+
`JobOutboundMessageKind.ChannelComplete` are used for output channels. These correspond to
|
|
136
|
+
the `next`, `error` and `complete` methods of an `Observer` and are available to the callee
|
|
137
|
+
through the `job.channels` map of Observable.
|
|
138
|
+
|
|
139
|
+
Utilities should have some filtering and dispatching to separate observables, as a convenience for
|
|
140
|
+
the user. An example of this would be the `Job.prototype.output` observable which only contains
|
|
141
|
+
the value contained by messages of type `JobOutboundMessageKind.Output`.
|
|
142
|
+
|
|
143
|
+
# Higher Order Jobs
|
|
144
|
+
Because jobs are expected to be pure functions, they can be composed or transformed to create
|
|
145
|
+
more complex behaviour, similar to how RxJS operators can transform observables.
|
|
146
|
+
|
|
147
|
+
```javascript
|
|
148
|
+
// Runs a job on the hour, every hour, regardless of how long the job takes.
|
|
149
|
+
// This creates a job function that can be registered by itself.
|
|
150
|
+
function scheduleJobOnTheHour(jobFunction) {
|
|
151
|
+
return function(argument, context) {
|
|
152
|
+
return new Observable(observer => {
|
|
153
|
+
let timeout = 0;
|
|
154
|
+
|
|
155
|
+
function _timeoutToNextHour() {
|
|
156
|
+
// Just wait until the next hour.
|
|
157
|
+
const t = new Date();
|
|
158
|
+
const secondsToNextHour = 3600 - t.getSeconds() - t.getMinutes() * 60;
|
|
159
|
+
timeout = setTimeout(_scheduleJobAndWaitAnHour, secondsToNextHour);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function _scheduleJobAndWaitAnHour() {
|
|
163
|
+
jobFunction(argument, context).subscribe(
|
|
164
|
+
message => observer.next(message),
|
|
165
|
+
error => observer.error(error),
|
|
166
|
+
// Do not forward completion, but use it to schedule the next job run.
|
|
167
|
+
() => {
|
|
168
|
+
_timeoutToNextHour();
|
|
169
|
+
},
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Kick off by waiting for next hour.
|
|
174
|
+
_timeoutToNextHour();
|
|
175
|
+
|
|
176
|
+
return () => clearTimeout(timeout);
|
|
177
|
+
});
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
Another way to compose jobs is to schedule jobs based on their name, from other jobs.
|
|
183
|
+
|
|
184
|
+
```javascript
|
|
185
|
+
// Runs a job on the hour, every hour, regardless of how long the job takes.
|
|
186
|
+
// This creates a high order job by getting a job name and an argument, and scheduling the job
|
|
187
|
+
// every hour.
|
|
188
|
+
function scheduleJobOnTheHour(job, context) {
|
|
189
|
+
const { name, argument } = job; // Destructure our input.
|
|
190
|
+
|
|
191
|
+
return new Observable(observer => {
|
|
192
|
+
let timeout = 0;
|
|
193
|
+
|
|
194
|
+
function _timeoutToNextHour() {
|
|
195
|
+
// Just wait until the next hour.
|
|
196
|
+
const t = new Date();
|
|
197
|
+
const secondsToNextHour = 3600 - t.getSeconds() - t.getMinutes() * 60;
|
|
198
|
+
timeout = setTimeout(_scheduleJobAndWaitAnHour, secondsToNextHour);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
function _scheduleJobAndWaitAnHour() {
|
|
202
|
+
const subJob = context.scheduler.schedule(name, argument);
|
|
203
|
+
// We do not forward the input to the sub-job but that would be a valid example as well.
|
|
204
|
+
subJob.outboundBus.subscribe(
|
|
205
|
+
message => observer.next(message),
|
|
206
|
+
error => observer.error(error),
|
|
207
|
+
// Do not forward completion, but use it to schedule the next job run.
|
|
208
|
+
() => {
|
|
209
|
+
_timeoutToNextHour();
|
|
210
|
+
},
|
|
211
|
+
);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// Kick off by waiting for next hour.
|
|
215
|
+
_timeoutToNextHour();
|
|
216
|
+
|
|
217
|
+
return () => clearTimeout(timeout);
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
const registry = new SimpleJobRegistry();
|
|
222
|
+
registry.register('schedule-job-on-the-hour', scheduleJobOnTheHour, {
|
|
223
|
+
argument: {
|
|
224
|
+
properties: {
|
|
225
|
+
name: { type: 'string' },
|
|
226
|
+
argument: { type: true },
|
|
227
|
+
},
|
|
228
|
+
},
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
// Implementation left to the reader.
|
|
232
|
+
registry.register('copy-files-from-a-to-b', require('some-package/copy-job'));
|
|
233
|
+
|
|
234
|
+
const scheduler = new SimpleScheduler(registry);
|
|
235
|
+
|
|
236
|
+
// A rudimentary backup system.
|
|
237
|
+
const job = scheduler.schedule('schedule-job-on-the-hour', {
|
|
238
|
+
name: 'copy-files-from-a-to-b',
|
|
239
|
+
argument: {
|
|
240
|
+
from: '/some-directory/to/backup',
|
|
241
|
+
to: '/volumes/usb-key',
|
|
242
|
+
},
|
|
243
|
+
});
|
|
244
|
+
job.output.subscribe(x => console.log(x));
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
# Limitations
|
|
248
|
+
Jobs input, output and argument must be serializable to JSONs. This is a big limitation in usage,
|
|
249
|
+
but comes with the benefit that jobs can be serialized and called across memory boundaries. An
|
|
250
|
+
example would be an operator that takes a module path and run the job from that path in a separate
|
|
251
|
+
process. Or even a separate server, using HTTP calls.
|
|
252
|
+
|
|
253
|
+
Another limitation is that the boilerplate is complex. Manually managing start/end life cycle, and
|
|
254
|
+
other messages such as logging, etc. is tedious and requires a lot of code. A good way to keep
|
|
255
|
+
this limitation under control is to provide helpers to create `JobHandler`s which manage those
|
|
256
|
+
messages for the developer. A simple handler could be to get a `Promise` and return the output of
|
|
257
|
+
that promise automatically.
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright Google Inc. All Rights Reserved.
|
|
4
|
+
*
|
|
5
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
+
* found in the LICENSE file at https://angular.io/license
|
|
7
|
+
*
|
|
8
|
+
*/
|
|
9
|
+
import { Observable, Observer } from 'rxjs';
|
|
10
|
+
import { BaseException } from '../../exception/index';
|
|
11
|
+
import { JsonValue } from '../../json/index';
|
|
12
|
+
import { LoggerApi } from '../../logger/index';
|
|
13
|
+
import { JobDescription, JobHandler, JobHandlerContext } from './api';
|
|
14
|
+
export declare class ChannelAlreadyExistException extends BaseException {
|
|
15
|
+
constructor(name: string);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Interface for the JobHandler context that is used when using `createJobHandler()`. It extends
|
|
19
|
+
* the basic `JobHandlerContext` with additional functionality.
|
|
20
|
+
*/
|
|
21
|
+
export interface SimpleJobHandlerContext<A extends JsonValue, I extends JsonValue, O extends JsonValue> extends JobHandlerContext<A, I, O> {
|
|
22
|
+
logger: LoggerApi;
|
|
23
|
+
createChannel: (name: string) => Observer<JsonValue>;
|
|
24
|
+
input: Observable<JsonValue>;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* A simple version of the JobHandler. This simplifies a lot of the interaction with the job
|
|
28
|
+
* scheduler and registry. For example, instead of returning a JobOutboundMessage observable, you
|
|
29
|
+
* can directly return an output.
|
|
30
|
+
*/
|
|
31
|
+
export declare type SimpleJobHandlerFn<A extends JsonValue, I extends JsonValue, O extends JsonValue> = (input: A, context: SimpleJobHandlerContext<A, I, O>) => O | Promise<O> | Observable<O>;
|
|
32
|
+
/**
|
|
33
|
+
* Make a simple job handler that sets start and end from a function that's synchronous.
|
|
34
|
+
*
|
|
35
|
+
* @param fn The function to create a handler for.
|
|
36
|
+
* @param options An optional set of properties to set on the handler. Some fields might be
|
|
37
|
+
* required by registry or schedulers.
|
|
38
|
+
*/
|
|
39
|
+
export declare function createJobHandler<A extends JsonValue, I extends JsonValue, O extends JsonValue>(fn: SimpleJobHandlerFn<A, I, O>, options?: Partial<JobDescription>): JobHandler<A, I, O>;
|
|
40
|
+
/**
|
|
41
|
+
* Lazily create a job using a function.
|
|
42
|
+
* @param loader A factory function that returns a promise/observable of a JobHandler.
|
|
43
|
+
* @param options Same options as createJob.
|
|
44
|
+
*/
|
|
45
|
+
export declare function createJobFactory<A extends JsonValue, I extends JsonValue, O extends JsonValue>(loader: () => Promise<JobHandler<A, I, O>>, options: Partial<JobDescription>): JobHandler<A, I, O>;
|
|
46
|
+
/**
|
|
47
|
+
* Creates a job that logs out input/output messages of another Job. The messages are still
|
|
48
|
+
* propagated to the other job.
|
|
49
|
+
*/
|
|
50
|
+
export declare function createLoggerJob<A extends JsonValue, I extends JsonValue, O extends JsonValue>(job: JobHandler<A, I, O>, logger: LoggerApi): JobHandler<A, I, O>;
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/**
|
|
4
|
+
* @license
|
|
5
|
+
* Copyright Google Inc. All Rights Reserved.
|
|
6
|
+
*
|
|
7
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
8
|
+
* found in the LICENSE file at https://angular.io/license
|
|
9
|
+
*
|
|
10
|
+
*/
|
|
11
|
+
const rxjs_1 = require("rxjs");
|
|
12
|
+
const operators_1 = require("rxjs/operators");
|
|
13
|
+
const index_1 = require("../../exception/index");
|
|
14
|
+
const index_2 = require("../../logger/index");
|
|
15
|
+
const index_3 = require("../../utils/index");
|
|
16
|
+
const api_1 = require("./api");
|
|
17
|
+
class ChannelAlreadyExistException extends index_1.BaseException {
|
|
18
|
+
constructor(name) {
|
|
19
|
+
super(`Channel ${JSON.stringify(name)} already exist.`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
exports.ChannelAlreadyExistException = ChannelAlreadyExistException;
|
|
23
|
+
/**
|
|
24
|
+
* Make a simple job handler that sets start and end from a function that's synchronous.
|
|
25
|
+
*
|
|
26
|
+
* @param fn The function to create a handler for.
|
|
27
|
+
* @param options An optional set of properties to set on the handler. Some fields might be
|
|
28
|
+
* required by registry or schedulers.
|
|
29
|
+
*/
|
|
30
|
+
function createJobHandler(fn, options = {}) {
|
|
31
|
+
const handler = (argument, context) => {
|
|
32
|
+
const description = context.description;
|
|
33
|
+
const inboundBus = context.inboundBus;
|
|
34
|
+
const inputChannel = new rxjs_1.Subject();
|
|
35
|
+
let subscription;
|
|
36
|
+
return new rxjs_1.Observable(subject => {
|
|
37
|
+
// Handle input.
|
|
38
|
+
inboundBus.subscribe(message => {
|
|
39
|
+
switch (message.kind) {
|
|
40
|
+
case api_1.JobInboundMessageKind.Ping:
|
|
41
|
+
subject.next({ kind: api_1.JobOutboundMessageKind.Pong, description, id: message.id });
|
|
42
|
+
break;
|
|
43
|
+
case api_1.JobInboundMessageKind.Stop:
|
|
44
|
+
// There's no way to cancel a promise or a synchronous function, but we do cancel
|
|
45
|
+
// observables where possible.
|
|
46
|
+
if (subscription) {
|
|
47
|
+
subscription.unsubscribe();
|
|
48
|
+
}
|
|
49
|
+
subject.next({ kind: api_1.JobOutboundMessageKind.End, description });
|
|
50
|
+
subject.complete();
|
|
51
|
+
// Close all channels.
|
|
52
|
+
channels.forEach(x => x.complete());
|
|
53
|
+
break;
|
|
54
|
+
case api_1.JobInboundMessageKind.Input:
|
|
55
|
+
inputChannel.next(message.value);
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
// Configure a logger to pass in as additional context.
|
|
60
|
+
const logger = new index_2.Logger('job');
|
|
61
|
+
logger.subscribe(entry => {
|
|
62
|
+
subject.next({
|
|
63
|
+
kind: api_1.JobOutboundMessageKind.Log,
|
|
64
|
+
description,
|
|
65
|
+
entry,
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
// Execute the function with the additional context.
|
|
69
|
+
subject.next({ kind: api_1.JobOutboundMessageKind.Start, description });
|
|
70
|
+
const channels = new Map();
|
|
71
|
+
const newContext = Object.assign({}, context, { input: inputChannel.asObservable(), logger,
|
|
72
|
+
createChannel(name) {
|
|
73
|
+
if (channels.has(name)) {
|
|
74
|
+
throw new ChannelAlreadyExistException(name);
|
|
75
|
+
}
|
|
76
|
+
const channelSubject = new rxjs_1.Subject();
|
|
77
|
+
channelSubject.subscribe(message => {
|
|
78
|
+
subject.next({
|
|
79
|
+
kind: api_1.JobOutboundMessageKind.ChannelMessage, description, name, message,
|
|
80
|
+
});
|
|
81
|
+
}, error => {
|
|
82
|
+
subject.next({ kind: api_1.JobOutboundMessageKind.ChannelError, description, name, error });
|
|
83
|
+
// This can be reopened.
|
|
84
|
+
channels.delete(name);
|
|
85
|
+
}, () => {
|
|
86
|
+
subject.next({ kind: api_1.JobOutboundMessageKind.ChannelComplete, description, name });
|
|
87
|
+
// This can be reopened.
|
|
88
|
+
channels.delete(name);
|
|
89
|
+
});
|
|
90
|
+
channels.set(name, channelSubject);
|
|
91
|
+
return channelSubject;
|
|
92
|
+
} });
|
|
93
|
+
const result = fn(argument, newContext);
|
|
94
|
+
// If the result is a promise, simply wait for it to complete before reporting the result.
|
|
95
|
+
if (index_3.isPromise(result)) {
|
|
96
|
+
result.then(result => {
|
|
97
|
+
subject.next({ kind: api_1.JobOutboundMessageKind.Output, description, value: result });
|
|
98
|
+
subject.next({ kind: api_1.JobOutboundMessageKind.End, description });
|
|
99
|
+
subject.complete();
|
|
100
|
+
}, err => subject.error(err));
|
|
101
|
+
}
|
|
102
|
+
else if (rxjs_1.isObservable(result)) {
|
|
103
|
+
subscription = result.subscribe((value) => subject.next({ kind: api_1.JobOutboundMessageKind.Output, description, value }), error => subject.error(error), () => {
|
|
104
|
+
subject.next({ kind: api_1.JobOutboundMessageKind.End, description });
|
|
105
|
+
subject.complete();
|
|
106
|
+
});
|
|
107
|
+
return subscription;
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
// If it's a scalar value, report it synchronously.
|
|
111
|
+
subject.next({ kind: api_1.JobOutboundMessageKind.Output, description, value: result });
|
|
112
|
+
subject.next({ kind: api_1.JobOutboundMessageKind.End, description });
|
|
113
|
+
subject.complete();
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
};
|
|
117
|
+
return Object.assign(handler, { jobDescription: options });
|
|
118
|
+
}
|
|
119
|
+
exports.createJobHandler = createJobHandler;
|
|
120
|
+
/**
|
|
121
|
+
* Lazily create a job using a function.
|
|
122
|
+
* @param loader A factory function that returns a promise/observable of a JobHandler.
|
|
123
|
+
* @param options Same options as createJob.
|
|
124
|
+
*/
|
|
125
|
+
function createJobFactory(loader, options) {
|
|
126
|
+
const handler = (argument, context) => {
|
|
127
|
+
return rxjs_1.from(loader())
|
|
128
|
+
.pipe(operators_1.switchMap(fn => fn(argument, context)));
|
|
129
|
+
};
|
|
130
|
+
return Object.assign(handler, { jobDescription: options });
|
|
131
|
+
}
|
|
132
|
+
exports.createJobFactory = createJobFactory;
|
|
133
|
+
/**
|
|
134
|
+
* Creates a job that logs out input/output messages of another Job. The messages are still
|
|
135
|
+
* propagated to the other job.
|
|
136
|
+
*/
|
|
137
|
+
function createLoggerJob(job, logger) {
|
|
138
|
+
const handler = (argument, context) => {
|
|
139
|
+
context.inboundBus.pipe(operators_1.tap(message => logger.info(`Input: ${JSON.stringify(message)}`))).subscribe();
|
|
140
|
+
return job(argument, context).pipe(operators_1.tap(message => logger.info(`Message: ${JSON.stringify(message)}`), error => logger.warn(`Error: ${JSON.stringify(error)}`), () => logger.info(`Completed`)));
|
|
141
|
+
};
|
|
142
|
+
return Object.assign(handler, job);
|
|
143
|
+
}
|
|
144
|
+
exports.createLoggerJob = createLoggerJob;
|
|
145
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWpvYi1oYW5kbGVyLmpzIiwic291cmNlUm9vdCI6Ii4vIiwic291cmNlcyI6WyJwYWNrYWdlcy9hbmd1bGFyX2RldmtpdC9jb3JlL3NyYy9leHBlcmltZW50YWwvam9icy9jcmVhdGUtam9iLWhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7Ozs7OztHQU9HO0FBQ0gsK0JBQXVGO0FBQ3ZGLDhDQUFnRDtBQUNoRCxpREFBc0Q7QUFFdEQsOENBQXVEO0FBQ3ZELDZDQUE4QztBQUM5QywrQkFPZTtBQUdmLE1BQWEsNEJBQTZCLFNBQVEscUJBQWE7SUFDN0QsWUFBWSxJQUFZO1FBQ3RCLEtBQUssQ0FBQyxXQUFXLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDMUQsQ0FBQztDQUNGO0FBSkQsb0VBSUM7QUE0QkQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsZ0JBQWdCLENBQzlCLEVBQStCLEVBQy9CLFVBQW1DLEVBQUU7SUFFckMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxRQUFXLEVBQUUsT0FBbUMsRUFBRSxFQUFFO1FBQ25FLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUM7UUFDeEMsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztRQUN0QyxNQUFNLFlBQVksR0FBRyxJQUFJLGNBQU8sRUFBYSxDQUFDO1FBQzlDLElBQUksWUFBMEIsQ0FBQztRQUUvQixPQUFPLElBQUksaUJBQVUsQ0FBd0IsT0FBTyxDQUFDLEVBQUU7WUFDckQsZ0JBQWdCO1lBQ2hCLFVBQVUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQzdCLFFBQVEsT0FBTyxDQUFDLElBQUksRUFBRTtvQkFDcEIsS0FBSywyQkFBcUIsQ0FBQyxJQUFJO3dCQUM3QixPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLDRCQUFzQixDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsRUFB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R0FBRyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQ2hDLGVBQUcsQ0FDRCxPQUFPLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFDN0QsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQ3ZELEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQy9CLENBQ0YsQ0FBQztJQUNKLENBQUMsQ0FBQztJQUVGLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDckMsQ0FBQztBQW5CRCwwQ0FtQkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICpcbiAqL1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgT2JzZXJ2ZXIsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgZnJvbSwgaXNPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEJhc2VFeGNlcHRpb24gfSBmcm9tICcuLi8uLi9leGNlcHRpb24vaW5kZXgnO1xuaW1wb3J0IHsgSnNvblZhbHVlIH0gZnJvbSAnLi4vLi4vanNvbi9pbmRleCc7XG5pbXBvcnQgeyBMb2dnZXIsIExvZ2dlckFwaSB9IGZyb20gJy4uLy4uL2xvZ2dlci9pbmRleCc7XG5pbXBvcnQgeyBpc1Byb21pc2UgfSBmcm9tICcuLi8uLi91dGlscy9pbmRleCc7XG5pbXBvcnQge1xuICBKb2JEZXNjcmlwdGlvbixcbiAgSm9iSGFuZGxlcixcbiAgSm9iSGFuZGxlckNvbnRleHQsXG4gIEpvYkluYm91bmRNZXNzYWdlS2luZCxcbiAgSm9iT3V0Ym91bmRNZXNzYWdlLFxuICBKb2JPdXRib3VuZE1lc3NhZ2VLaW5kLFxufSBmcm9tICcuL2FwaSc7XG5cblxuZXhwb3J0IGNsYXNzIENoYW5uZWxBbHJlYWR5RXhpc3RFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoYENoYW5uZWwgJHtKU09OLnN0cmluZ2lmeShuYW1lKX0gYWxyZWFkeSBleGlzdC5gKTtcbiAgfVxufVxuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgdGhlIEpvYkhhbmRsZXIgY29udGV4dCB0aGF0IGlzIHVzZWQgd2hlbiB1c2luZyBgY3JlYXRlSm9iSGFuZGxlcigpYC4gSXQgZXh0ZW5kc1xuICogdGhlIGJhc2ljIGBKb2JIYW5kbGVyQ29udGV4dGAgd2l0aCBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2ltcGxlSm9iSGFuZGxlckNvbnRleHQ8XG4gIEEgZXh0ZW5kcyBKc29uVmFsdWUsXG4gIEkgZXh0ZW5kcyBKc29uVmFsdWUsXG4gIE8gZXh0ZW5kcyBKc29uVmFsdWUsXG4+IGV4dGVuZHMgSm9iSGFuZGxlckNvbnRleHQ8QSwgSSwgTz4ge1xuICBsb2dnZXI6IExvZ2dlckFwaTtcbiAgY3JlYXRlQ2hhbm5lbDogKG5hbWU6IHN0cmluZykgPT4gT2JzZXJ2ZXI8SnNvblZhbHVlPjtcbiAgaW5wdXQ6IE9ic2VydmFibGU8SnNvblZhbHVlPjtcbn1cblxuXG4vKipcbiAqIEEgc2ltcGxlIHZlcnNpb24gb2YgdGhlIEpvYkhhbmRsZXIuIFRoaXMgc2ltcGxpZmllcyBhIGxvdCBvZiB0aGUgaW50ZXJhY3Rpb24gd2l0aCB0aGUgam9iXG4gKiBzY2hlZHVsZXIgYW5kIHJlZ2lzdHJ5LiBGb3IgZXhhbXBsZSwgaW5zdGVhZCBvZiByZXR1cm5pbmcgYSBKb2JPdXRib3VuZE1lc3NhZ2Ugb2JzZXJ2YWJsZSwgeW91XG4gKiBjYW4gZGlyZWN0bHkgcmV0dXJuIGFuIG91dHB1dC5cbiAqL1xuZXhwb3J0IHR5cGUgU2ltcGxlSm9iSGFuZGxlckZuPEEgZXh0ZW5kcyBKc29uVmFsdWUsIEkgZXh0ZW5kcyBKc29uVmFsdWUsIE8gZXh0ZW5kcyBKc29uVmFsdWU+ID0gKFxuICBpbnB1dDogQSxcbiAgY29udGV4dDogU2ltcGxlSm9iSGFuZGxlckNvbnRleHQ8QSwgSSwgTz4sXG4pID0+IE8gfCBQcm9taXNlPE8+IHwgT2JzZXJ2YWJsZTxPPjtcblxuXG4vKipcbiAqIE1ha2UgYSBzaW1wbGUgam9iIGhhbmRsZXIgdGhhdCBzZXRzIHN0YXJ0IGFuZCBlbmQgZnJvbSBhIGZ1bmN0aW9uIHRoYXQncyBzeW5jaHJvbm91cy5cbiAqXG4gKiBAcGFyYW0gZm4gVGhlIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIGhhbmRsZXIgZm9yLlxuICogQHBhcmFtIG9wdGlvbnMgQW4gb3B0aW9uYWwgc2V0IG9mIHByb3BlcnRpZXMgdG8gc2V0IG9uIHRoZSBoYW5kbGVyLiBTb21lIGZpZWxkcyBtaWdodCBiZVxuICogICByZXF1aXJlZCBieSByZWdpc3RyeSBvciBzY2hlZHVsZXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSm9iSGFuZGxlcjxBIGV4dGVuZHMgSnNvblZhbHVlLCBJIGV4dGVuZHMgSnNvblZhbHVlLCBPIGV4dGVuZHMgSnNvblZhbHVlPihcbiAgZm46IFNpbXBsZUpvYkhhbmRsZXJGbjxBLCBJLCBPPixcbiAgb3B0aW9uczogUGFydGlhbDxKb2JEZXNjcmlwdGlvbj4gPSB7fSxcbik6IEpvYkhhbmRsZXI8QSwgSSwgTz4ge1xuICBjb25zdCBoYW5kbGVyID0gKGFyZ3VtZW50OiBBLCBjb250ZXh0OiBKb2JIYW5kbGVyQ29udGV4dDxBLCBJLCBPPikgPT4ge1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gY29udGV4dC5kZXNjcmlwdGlvbjtcbiAgICBjb25zdCBpbmJvdW5kQnVzID0gY29udGV4dC5pbmJvdW5kQnVzO1xuICAgIGNvbnN0IGlucHV0Q2hhbm5lbCA9IG5ldyBTdWJqZWN0PEpzb25WYWx1ZT4oKTtcbiAgICBsZXQgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8Sm9iT3V0Ym91bmRNZXNzYWdlPE8+PihzdWJqZWN0ID0+IHtcbiAgICAgIC8vIEhhbmRsZSBpbnB1dC5cbiAgICAgIGluYm91bmRCdXMuc3Vic2NyaWJlKG1lc3NhZ2UgPT4ge1xuICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uua2luZCkge1xuICAgICAgICAgIGNhc2UgSm9iSW5ib3VuZE1lc3NhZ2VLaW5kLlBpbmc6XG4gICAgICAgICAgICBzdWJqZWN0Lm5leHQoeyBraW5kOiBKb2JPdXRib3VuZE1lc3NhZ2VLaW5kLlBvbmcsIGRlc2NyaXB0aW9uLCBpZDogbWVzc2FnZS5pZCB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBKb2JJbmJvdW5kTWVzc2FnZUtpbmQuU3RvcDpcbiAgICAgICAgICAgIC8vIFRoZXJlJ3Mgbm8gd2F5IHRvIGNhbmNlbCBhIHByb21pc2Ugb3IgYSBzeW5jaHJvbm91cyBmdW5jdGlvbiwgYnV0IHdlIGRvIGNhbmNlbFxuICAgICAgICAgICAgLy8gb2JzZXJ2YWJsZXMgd2hlcmUgcG9zc2libGUuXG4gICAgICAgICAgICBpZiAoc3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3ViamVjdC5uZXh0KHsga2luZDogSm9iT3V0Ym91bmRNZXNzYWdlS2luZC5FbmQsIGRlc2NyaXB0aW9uIH0pO1xuICAgICAgICAgICAgc3ViamVjdC5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgLy8gQ2xvc2UgYWxsIGNoYW5uZWxzLlxuICAgICAgICAgICAgY2hhbm5lbHMuZm9yRWFjaCh4ID0+IHguY29tcGxldGUoKSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgSm9iSW5ib3VuZE1lc3NhZ2VLaW5kLklucHV0OlxuICAgICAgICAgICAgaW5wdXRDaGFubmVsLm5leHQobWVzc2FnZS52YWx1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIENvbmZpZ3VyZSBhIGxvZ2dlciB0byBwYXNzIGluIGFzIGFkZGl0aW9uYWwgY29udGV4dC5cbiAgICAgIGNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIoJ2pvYicpO1xuICAgICAgbG9nZ2VyLnN1YnNjcmliZShlbnRyeSA9PiB7XG4gICAgICAgIHN1YmplY3QubmV4dCh7XG4gICAgICAgICAga2luZDogSm9iT3V0Ym91bmRNZXNzYWdlS2luZC5Mb2csXG4gICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgZW50cnksXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIEV4ZWN1dGUgdGhlIGZ1bmN0aW9uIHdpdGggdGhlIGFkZGl0aW9uYWwgY29udGV4dC5cbiAgICAgIHN1YmplY3QubmV4dCh7IGtpbmQ6IEpvYk91dGJvdW5kTWVzc2FnZUtpbmQuU3RhcnQsIGRlc2NyaXB0aW9uIH0pO1xuXG4gICAgICBjb25zdCBjaGFubmVscyA9IG5ldyBNYXA8c3RyaW5nLCBTdWJqZWN0PEpzb25WYWx1ZT4+KCk7XG5cbiAgICAgIGNvbnN0IG5ld0NvbnRleHQgPSB7XG4gICAgICAgIC4uLmNvbnRleHQsXG4gICAgICAgIGlucHV0OiBpbnB1dENoYW5uZWwuYXNPYnNlcnZhYmxlKCksXG4gICAgICAgIGxvZ2dlcixcbiAgICAgICAgY3JlYXRlQ2hhbm5lbChuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgICBpZiAoY2hhbm5lbHMuaGFzKG5hbWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQ2hhbm5lbEFscmVhZHlFeGlzdEV4Y2VwdGlvbihuYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgY2hhbm5lbFN1YmplY3QgPSBuZXcgU3ViamVjdDxKc29uVmFsdWU+KCk7XG4gICAgICAgICAgY2hhbm5lbFN1YmplY3Quc3Vic2NyaWJlKFxuICAgICAgICAgICAgbWVzc2FnZSA9PiB7XG4gICAgICAgICAgICAgIHN1YmplY3QubmV4dCh7XG4gICAgICAgICAgICAgICAga2luZDogSm9iT3V0Ym91bmRNZXNzYWdlS2luZC5DaGFubmVsTWVzc2FnZSwgZGVzY3JpcHRpb24sIG5hbWUsIG1lc3NhZ2UsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgc3ViamVjdC5uZXh0KHsga2luZDogSm9iT3V0Ym91bmRNZXNzYWdlS2luZC5DaGFubmVsRXJyb3IsIGRlc2NyaXB0aW9uLCBuYW1lLCBlcnJvciB9KTtcbiAgICAgICAgICAgICAgLy8gVGhpcyBjYW4gYmUgcmVvcGVuZWQuXG4gICAgICAgICAgICAgIGNoYW5uZWxzLmRlbGV0ZShuYW1lKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgIHN1YmplY3QubmV4dCh7IGtpbmQ6IEpvYk91dGJvdW5kTWVzc2FnZUtpbmQuQ2hhbm5lbENvbXBsZXRlLCBkZXNjcmlwdGlvbiwgbmFtZSB9KTtcbiAgICAgICAgICAgICAgLy8gVGhpcyBjYW4gYmUgcmVvcGVuZWQuXG4gICAgICAgICAgICAgIGNoYW5uZWxzLmRlbGV0ZShuYW1lKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNoYW5uZWxzLnNldChuYW1lLCBjaGFubmVsU3ViamVjdCk7XG5cbiAgICAgICAgICByZXR1cm4gY2hhbm5lbFN1YmplY3Q7XG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBmbihhcmd1bWVudCwgbmV3Q29udGV4dCk7XG4gICAgICAvLyBJZiB0aGUgcmVzdWx0IGlzIGEgcHJvbWlzZSwgc2ltcGx5IHdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlIGJlZm9yZSByZXBvcnRpbmcgdGhlIHJlc3VsdC5cbiAgICAgIGlmIChpc1Byb21pc2UocmVzdWx0KSkge1xuICAgICAgICByZXN1bHQudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICAgIHN1YmplY3QubmV4dCh7IGtpbmQ6IEpvYk91dGJvdW5kTWVzc2FnZUtpbmQuT3V0cHV0LCBkZXNjcmlwdGlvbiwgdmFsdWU6IHJlc3VsdCB9KTtcbiAgICAgICAgICBzdWJqZWN0Lm5leHQoeyBraW5kOiBKb2JPdXRib3VuZE1lc3NhZ2VLaW5kLkVuZCwgZGVzY3JpcHRpb24gfSk7XG4gICAgICAgICAgc3ViamVjdC5jb21wbGV0ZSgpO1xuICAgICAgICB9LCBlcnIgPT4gc3ViamVjdC5lcnJvcihlcnIpKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNPYnNlcnZhYmxlKHJlc3VsdCkpIHtcbiAgICAgICAgc3Vic2NyaXB0aW9uID0gKHJlc3VsdCBhcyBPYnNlcnZhYmxlPE8+KS5zdWJzY3JpYmUoXG4gICAgICAgICAgKHZhbHVlOiBPKSA9PiBzdWJqZWN0Lm5leHQoeyBraW5kOiBKb2JPdXRib3VuZE1lc3NhZ2VLaW5kLk91dHB1dCwgZGVzY3JpcHRpb24sIHZhbHVlIH0pLFxuICAgICAgICAgIGVycm9yID0+IHN1YmplY3QuZXJyb3IoZXJyb3IpLFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHN1YmplY3QubmV4dCh7IGtpbmQ6IEpvYk91dGJvdW5kTWVzc2FnZUtpbmQuRW5kLCBkZXNjcmlwdGlvbiB9KTtcbiAgICAgICAgICAgIHN1YmplY3QuY29tcGxldGUoKTtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBzdWJzY3JpcHRpb247XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZiBpdCdzIGEgc2NhbGFyIHZhbHVlLCByZXBvcnQgaXQgc3luY2hyb25vdXNseS5cbiAgICAgICAgc3ViamVjdC5uZXh0KHsga2luZDogSm9iT3V0Ym91bmRNZXNzYWdlS2luZC5PdXRwdXQsIGRlc2NyaXB0aW9uLCB2YWx1ZTogcmVzdWx0IGFzIE8gfSk7XG4gICAgICAgIHN1YmplY3QubmV4dCh7IGtpbmQ6IEpvYk91dGJvdW5kTWVzc2FnZUtpbmQuRW5kLCBkZXNjcmlwdGlvbiB9KTtcbiAgICAgICAgc3ViamVjdC5jb21wbGV0ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiBPYmplY3QuYXNzaWduKGhhbmRsZXIsIHsgam9iRGVzY3JpcHRpb246IG9wdGlvbnMgfSk7XG59XG5cblxuLyoqXG4gKiBMYXppbHkgY3JlYXRlIGEgam9iIHVzaW5nIGEgZnVuY3Rpb24uXG4gKiBAcGFyYW0gbG9hZGVyIEEgZmFjdG9yeSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBwcm9taXNlL29ic2VydmFibGUgb2YgYSBKb2JIYW5kbGVyLlxuICogQHBhcmFtIG9wdGlvbnMgU2FtZSBvcHRpb25zIGFzIGNyZWF0ZUpvYi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUpvYkZhY3Rvcnk8QSBleHRlbmRzIEpzb25WYWx1ZSwgSSBleHRlbmRzIEpzb25WYWx1ZSwgTyBleHRlbmRzIEpzb25WYWx1ZT4oXG4gIGxvYWRlcjogKCkgPT4gUHJvbWlzZTxKb2JIYW5kbGVyPEEsIEksIE8+PixcbiAgb3B0aW9uczogUGFydGlhbDxKb2JEZXNjcmlwdGlvbj4sXG4pOiBKb2JIYW5kbGVyPEEsIEksIE8+IHtcbiAgY29uc3QgaGFuZGxlciA9IChhcmd1bWVudDogQSwgY29udGV4dDogSm9iSGFuZGxlckNvbnRleHQ8QSwgSSwgTz4pID0+IHtcbiAgICByZXR1cm4gZnJvbShsb2FkZXIoKSlcbiAgICAgIC5waXBlKHN3aXRjaE1hcChmbiA9PiBmbihhcmd1bWVudCwgY29udGV4dCkpKTtcbiAgfTtcblxuICByZXR1cm4gT2JqZWN0LmFzc2lnbihoYW5kbGVyLCB7IGpvYkRlc2NyaXB0aW9uOiBvcHRpb25zIH0pO1xufVxuXG5cbi8qKlxuICogQ3JlYXRlcyBhIGpvYiB0aGF0IGxvZ3Mgb3V0IGlucHV0L291dHB1dCBtZXNzYWdlcyBvZiBhbm90aGVyIEpvYi4gVGhlIG1lc3NhZ2VzIGFyZSBzdGlsbFxuICogcHJvcGFnYXRlZCB0byB0aGUgb3RoZXIgam9iLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTG9nZ2VySm9iPEEgZXh0ZW5kcyBKc29uVmFsdWUsIEkgZXh0ZW5kcyBKc29uVmFsdWUsIE8gZXh0ZW5kcyBKc29uVmFsdWU+KFxuICBqb2I6IEpvYkhhbmRsZXI8QSwgSSwgTz4sXG4gIGxvZ2dlcjogTG9nZ2VyQXBpLFxuKTogSm9iSGFuZGxlcjxBLCBJLCBPPiB7XG4gIGNvbnN0IGhhbmRsZXIgPSAoYXJndW1lbnQ6IEEsIGNvbnRleHQ6IEpvYkhhbmRsZXJDb250ZXh0PEEsIEksIE8+KSA9PiB7XG4gICAgY29udGV4dC5pbmJvdW5kQnVzLnBpcGUoXG4gICAgICB0YXAobWVzc2FnZSA9PiBsb2dnZXIuaW5mbyhgSW5wdXQ6ICR7SlNPTi5zdHJpbmdpZnkobWVzc2FnZSl9YCkpLFxuICAgICkuc3Vic2NyaWJlKCk7XG5cbiAgICByZXR1cm4gam9iKGFyZ3VtZW50LCBjb250ZXh0KS5waXBlKFxuICAgICAgdGFwKFxuICAgICAgICBtZXNzYWdlID0+IGxvZ2dlci5pbmZvKGBNZXNzYWdlOiAke0pTT04uc3RyaW5naWZ5KG1lc3NhZ2UpfWApLFxuICAgICAgICBlcnJvciA9PiBsb2dnZXIud2FybihgRXJyb3I6ICR7SlNPTi5zdHJpbmdpZnkoZXJyb3IpfWApLFxuICAgICAgICAoKSA9PiBsb2dnZXIuaW5mbyhgQ29tcGxldGVkYCksXG4gICAgICApLFxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oaGFuZGxlciwgam9iKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright Google Inc. All Rights Reserved.
|
|
4
|
+
*
|
|
5
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
+
* found in the LICENSE file at https://angular.io/license
|
|
7
|
+
*
|
|
8
|
+
*/
|
|
9
|
+
import { JsonValue } from '../../json/index';
|
|
10
|
+
import { Readwrite } from '../../utils/index';
|
|
11
|
+
import { JobDescription, JobHandler, JobName } from './api';
|
|
12
|
+
/**
|
|
13
|
+
* A JobDispatcher can be used to dispatch between multiple jobs.
|
|
14
|
+
*/
|
|
15
|
+
export interface JobDispatcher<A extends JsonValue, I extends JsonValue, O extends JsonValue> extends JobHandler<A, I, O> {
|
|
16
|
+
/**
|
|
17
|
+
* Set the default job if all conditionals failed.
|
|
18
|
+
* @param name The default name if all conditions are false.
|
|
19
|
+
*/
|
|
20
|
+
setDefaultJob(name: JobName | null | JobHandler<JsonValue, JsonValue, JsonValue>): void;
|
|
21
|
+
/**
|
|
22
|
+
* Add a conditional job that will be selected if the input fits a predicate.
|
|
23
|
+
* @param predicate
|
|
24
|
+
* @param name
|
|
25
|
+
*/
|
|
26
|
+
addConditionalJob(predicate: (args: A) => boolean, name: string): void;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* OnReady a dispatcher that can dispatch to a sub job, depending on conditions.
|
|
30
|
+
* @param options
|
|
31
|
+
*/
|
|
32
|
+
export declare function createDispatcher<A extends JsonValue, I extends JsonValue, O extends JsonValue>(options?: Partial<Readwrite<JobDescription>>): JobDispatcher<A, I, O>;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const api_1 = require("./api");
|
|
4
|
+
const exception_1 = require("./exception");
|
|
5
|
+
/**
|
|
6
|
+
* OnReady a dispatcher that can dispatch to a sub job, depending on conditions.
|
|
7
|
+
* @param options
|
|
8
|
+
*/
|
|
9
|
+
function createDispatcher(options = {}) {
|
|
10
|
+
let defaultDelegate = null;
|
|
11
|
+
const conditionalDelegateList = [];
|
|
12
|
+
const job = Object.assign((argument, context) => {
|
|
13
|
+
const maybeDelegate = conditionalDelegateList.find(([predicate]) => predicate(argument));
|
|
14
|
+
let delegate = null;
|
|
15
|
+
if (maybeDelegate) {
|
|
16
|
+
delegate = context.scheduler.schedule(maybeDelegate[1], argument);
|
|
17
|
+
}
|
|
18
|
+
else if (defaultDelegate) {
|
|
19
|
+
delegate = context.scheduler.schedule(defaultDelegate, argument);
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
throw new exception_1.JobDoesNotExistException('<null>');
|
|
23
|
+
}
|
|
24
|
+
context.inboundBus.subscribe(delegate.inboundBus);
|
|
25
|
+
return delegate.outboundBus;
|
|
26
|
+
}, {
|
|
27
|
+
jobDescription: options,
|
|
28
|
+
});
|
|
29
|
+
return Object.assign(job, {
|
|
30
|
+
setDefaultJob(name) {
|
|
31
|
+
if (api_1.isJobHandler(name)) {
|
|
32
|
+
name = name.jobDescription.name === undefined ? null : name.jobDescription.name;
|
|
33
|
+
}
|
|
34
|
+
defaultDelegate = name;
|
|
35
|
+
},
|
|
36
|
+
addConditionalJob(predicate, name) {
|
|
37
|
+
conditionalDelegateList.push([predicate, name]);
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
exports.createDispatcher = createDispatcher;
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzcGF0Y2hlci5qcyIsInNvdXJjZVJvb3QiOiIuLyIsInNvdXJjZXMiOlsicGFja2FnZXMvYW5ndWxhcl9kZXZraXQvY29yZS9zcmMvZXhwZXJpbWVudGFsL2pvYnMvZGlzcGF0Y2hlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQVVBLCtCQU9lO0FBQ2YsMkNBQXVEO0FBeUJ2RDs7O0dBR0c7QUFDSCxTQUFnQixnQkFBZ0IsQ0FLOUIsVUFBOEMsRUFBRTtJQUVoRCxJQUFJLGVBQWUsR0FBbUIsSUFBSSxDQUFDO0lBQzNDLE1BQU0sdUJBQXVCLEdBQXNDLEVBQUUsQ0FBQztJQUV0RSxNQUFNLEdBQUcsR0FBd0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVcsRUFBRSxPQUEwQixFQUFFLEVBQUU7UUFDekYsTUFBTSxhQUFhLEdBQUcsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDekYsSUFBSSxRQUFRLEdBQXdCLElBQUksQ0FBQztRQUV6QyxJQUFJLGFBQWEsRUFBRTtZQUNqQixRQUFRLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQ25FO2FBQU0sSUFBSSxlQUFlLEVBQUU7WUFDMUIsUUFBUSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxRQUFRLENBQUMsQ0FBQztTQUNsRTthQUFNO1lBQ0wsTUFBTSxJQUFJLG9DQUF3QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzlDO1FBRUQsT0FBTyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRWxELE9BQU8sUUFBUSxDQUFDLFdBQVcsQ0FBQztJQUM5QixDQUFDLEVBQUU7UUFDRCxjQUFjLEVBQUUsT0FBTztLQUN4QixDQUFDLENBQUM7SUFFSCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFO1FBQ3hCLGFBQWEsQ0FBQyxJQUFrRTtZQUM5RSxJQUFJLGtCQUFZLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ3RCLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUM7YUFDakY7WUFFRCxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLENBQUM7UUFDRCxpQkFBaUIsQ0FBQyxTQUErQixFQUFFLElBQWE7WUFDOUQsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDbEQsQ0FBQztLQUNGLENBQUMsQ0FBQztBQUNMLENBQUM7QUF6Q0QsNENBeUNDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqXG4gKi9cbmltcG9ydCB7IEpzb25WYWx1ZSB9IGZyb20gJy4uLy4uL2pzb24vaW5kZXgnO1xuaW1wb3J0IHsgUmVhZHdyaXRlIH0gZnJvbSAnLi4vLi4vdXRpbHMvaW5kZXgnO1xuaW1wb3J0IHtcbiAgSm9iLFxuICBKb2JEZXNjcmlwdGlvbixcbiAgSm9iSGFuZGxlcixcbiAgSm9iSGFuZGxlckNvbnRleHQsXG4gIEpvYk5hbWUsXG4gIGlzSm9iSGFuZGxlcixcbn0gZnJvbSAnLi9hcGknO1xuaW1wb3J0IHsgSm9iRG9lc05vdEV4aXN0RXhjZXB0aW9uIH0gZnJvbSAnLi9leGNlcHRpb24nO1xuXG4vKipcbiAqIEEgSm9iRGlzcGF0Y2hlciBjYW4gYmUgdXNlZCB0byBkaXNwYXRjaCBiZXR3ZWVuIG11bHRpcGxlIGpvYnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSm9iRGlzcGF0Y2hlcjxcbiAgQSBleHRlbmRzIEpzb25WYWx1ZSxcbiAgSSBleHRlbmRzIEpzb25WYWx1ZSxcbiAgTyBleHRlbmRzIEpzb25WYWx1ZSxcbj4gZXh0ZW5kcyBKb2JIYW5kbGVyPEEsIEksIE8+IHtcbiAgLyoqXG4gICAqIFNldCB0aGUgZGVmYXVsdCBqb2IgaWYgYWxsIGNvbmRpdGlvbmFscyBmYWlsZWQuXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBkZWZhdWx0IG5hbWUgaWYgYWxsIGNvbmRpdGlvbnMgYXJlIGZhbHNlLlxuICAgKi9cbiAgc2V0RGVmYXVsdEpvYihuYW1lOiBKb2JOYW1lIHwgbnVsbCB8IEpvYkhhbmRsZXI8SnNvblZhbHVlLCBKc29uVmFsdWUsIEpzb25WYWx1ZT4pOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBZGQgYSBjb25kaXRpb25hbCBqb2IgdGhhdCB3aWxsIGJlIHNlbGVjdGVkIGlmIHRoZSBpbnB1dCBmaXRzIGEgcHJlZGljYXRlLlxuICAgKiBAcGFyYW0gcHJlZGljYXRlXG4gICAqIEBwYXJhbSBuYW1lXG4gICAqL1xuICBhZGRDb25kaXRpb25hbEpvYihwcmVkaWNhdGU6IChhcmdzOiBBKSA9PiBib29sZWFuLCBuYW1lOiBzdHJpbmcpOiB2b2lkO1xufVxuXG5cbi8qKlxuICogT25SZWFkeSBhIGRpc3BhdGNoZXIgdGhhdCBjYW4gZGlzcGF0Y2ggdG8gYSBzdWIgam9iLCBkZXBlbmRpbmcgb24gY29uZGl0aW9ucy5cbiAqIEBwYXJhbSBvcHRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEaXNwYXRjaGVyPFxuICBBIGV4dGVuZHMgSnNvblZhbHVlLFxuICBJIGV4dGVuZHMgSnNvblZhbHVlLFxuICBPIGV4dGVuZHMgSnNvblZhbHVlLFxuPihcbiAgb3B0aW9uczogUGFydGlhbDxSZWFkd3JpdGU8Sm9iRGVzY3JpcHRpb24+PiA9IHt9LFxuKTogSm9iRGlzcGF0Y2hlcjxBLCBJLCBPPiB7XG4gIGxldCBkZWZhdWx0RGVsZWdhdGU6IEpvYk5hbWUgfCBudWxsID0gbnVsbDtcbiAgY29uc3QgY29uZGl0aW9uYWxEZWxlZ2F0ZUxpc3Q6IFsoYXJnczogQSkgPT4gYm9vbGVhbiwgSm9iTmFtZV1bXSA9IFtdO1xuXG4gIGNvbnN0IGpvYjogSm9iSGFuZGxlcjxBLCBJLCBPPiA9IE9iamVjdC5hc3NpZ24oKGFyZ3VtZW50OiBBLCBjb250ZXh0OiBKb2JIYW5kbGVyQ29udGV4dCkgPT4ge1xuICAgIGNvbnN0IG1heWJlRGVsZWdhdGUgPSBjb25kaXRpb25hbERlbGVnYXRlTGlzdC5maW5kKChbcHJlZGljYXRlXSkgPT4gcHJlZGljYXRlKGFyZ3VtZW50KSk7XG4gICAgbGV0IGRlbGVnYXRlOiBKb2I8QSwgSSwgTz4gfCBudWxsID0gbnVsbDtcblxuICAgIGlmIChtYXliZURlbGVnYXRlKSB7XG4gICAgICBkZWxlZ2F0ZSA9IGNvbnRleHQuc2NoZWR1bGVyLnNjaGVkdWxlKG1heWJlRGVsZWdhdGVbMV0sIGFyZ3VtZW50KTtcbiAgICB9IGVsc2UgaWYgKGRlZmF1bHREZWxlZ2F0ZSkge1xuICAgICAgZGVsZWdhdGUgPSBjb250ZXh0LnNjaGVkdWxlci5zY2hlZHVsZShkZWZhdWx0RGVsZWdhdGUsIGFyZ3VtZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEpvYkRvZXNOb3RFeGlzdEV4Y2VwdGlvbignPG51bGw+Jyk7XG4gICAgfVxuXG4gICAgY29udGV4dC5pbmJvdW5kQnVzLnN1YnNjcmliZShkZWxlZ2F0ZS5pbmJvdW5kQnVzKTtcblxuICAgIHJldHVybiBkZWxlZ2F0ZS5vdXRib3VuZEJ1cztcbiAgfSwge1xuICAgIGpvYkRlc2NyaXB0aW9uOiBvcHRpb25zLFxuICB9KTtcblxuICByZXR1cm4gT2JqZWN0LmFzc2lnbihqb2IsIHtcbiAgICBzZXREZWZhdWx0Sm9iKG5hbWU6IEpvYk5hbWUgfCBudWxsIHwgSm9iSGFuZGxlcjxKc29uVmFsdWUsIEpzb25WYWx1ZSwgSnNvblZhbHVlPikge1xuICAgICAgaWYgKGlzSm9iSGFuZGxlcihuYW1lKSkge1xuICAgICAgICBuYW1lID0gbmFtZS5qb2JEZXNjcmlwdGlvbi5uYW1lID09PSB1bmRlZmluZWQgPyBudWxsIDogbmFtZS5qb2JEZXNjcmlwdGlvbi5uYW1lO1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0RGVsZWdhdGUgPSBuYW1lO1xuICAgIH0sXG4gICAgYWRkQ29uZGl0aW9uYWxKb2IocHJlZGljYXRlOiAoYXJnczogQSkgPT4gYm9vbGVhbiwgbmFtZTogSm9iTmFtZSkge1xuICAgICAgY29uZGl0aW9uYWxEZWxlZ2F0ZUxpc3QucHVzaChbcHJlZGljYXRlLCBuYW1lXSk7XG4gICAgfSxcbiAgfSk7XG59XG4iXX0=
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright Google Inc. All Rights Reserved.
|
|
4
|
+
*
|
|
5
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
+
* found in the LICENSE file at https://angular.io/license
|
|
7
|
+
*/
|
|
8
|
+
import { BaseException } from '../../exception/index';
|
|
9
|
+
import { JobName } from './api';
|
|
10
|
+
export declare class JobNameAlreadyRegisteredException extends BaseException {
|
|
11
|
+
constructor(name: JobName);
|
|
12
|
+
}
|
|
13
|
+
export declare class JobDoesNotExistException extends BaseException {
|
|
14
|
+
constructor(name: JobName);
|
|
15
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/**
|
|
4
|
+
* @license
|
|
5
|
+
* Copyright Google Inc. All Rights Reserved.
|
|
6
|
+
*
|
|
7
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
8
|
+
* found in the LICENSE file at https://angular.io/license
|
|
9
|
+
*/
|
|
10
|
+
const index_1 = require("../../exception/index");
|
|
11
|
+
class JobNameAlreadyRegisteredException extends index_1.BaseException {
|
|
12
|
+
constructor(name) {
|
|
13
|
+
super(`Job named ${JSON.stringify(name)} already exists.`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.JobNameAlreadyRegisteredException = JobNameAlreadyRegisteredException;
|
|
17
|
+
class JobDoesNotExistException extends index_1.BaseException {
|
|
18
|
+
constructor(name) {
|
|
19
|
+
super(`Job name ${JSON.stringify(name)} does not exist.`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
exports.JobDoesNotExistException = JobDoesNotExistException;
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhjZXB0aW9uLmpzIiwic291cmNlUm9vdCI6Ii4vIiwic291cmNlcyI6WyJwYWNrYWdlcy9hbmd1bGFyX2RldmtpdC9jb3JlL3NyYy9leHBlcmltZW50YWwvam9icy9leGNlcHRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7Ozs7O0dBTUc7QUFDSCxpREFBc0Q7QUFHdEQsTUFBYSxpQ0FBa0MsU0FBUSxxQkFBYTtJQUNsRSxZQUFZLElBQWE7UUFDdkIsS0FBSyxDQUFDLGFBQWEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUM3RCxDQUFDO0NBQ0Y7QUFKRCw4RUFJQztBQUVELE1BQWEsd0JBQXlCLFNBQVEscUJBQWE7SUFDekQsWUFBWSxJQUFhO1FBQ3ZCLEtBQUssQ0FBQyxZQUFZLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDNUQsQ0FBQztDQUNGO0FBSkQsNERBSUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5pbXBvcnQgeyBCYXNlRXhjZXB0aW9uIH0gZnJvbSAnLi4vLi4vZXhjZXB0aW9uL2luZGV4JztcbmltcG9ydCB7IEpvYk5hbWUgfSBmcm9tICcuL2FwaSc7XG5cbmV4cG9ydCBjbGFzcyBKb2JOYW1lQWxyZWFkeVJlZ2lzdGVyZWRFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcbiAgY29uc3RydWN0b3IobmFtZTogSm9iTmFtZSkge1xuICAgIHN1cGVyKGBKb2IgbmFtZWQgJHtKU09OLnN0cmluZ2lmeShuYW1lKX0gYWxyZWFkeSBleGlzdHMuYCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEpvYkRvZXNOb3RFeGlzdEV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuICBjb25zdHJ1Y3RvcihuYW1lOiBKb2JOYW1lKSB7XG4gICAgc3VwZXIoYEpvYiBuYW1lICR7SlNPTi5zdHJpbmdpZnkobmFtZSl9IGRvZXMgbm90IGV4aXN0LmApO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright Google Inc. All Rights Reserved.
|
|
4
|
+
*
|
|
5
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
+
* found in the LICENSE file at https://angular.io/license
|
|
7
|
+
*/
|
|
8
|
+
export * from './api';
|
|
9
|
+
export * from './create-job-handler';
|
|
10
|
+
export * from './exception';
|
|
11
|
+
export * from './dispatcher';
|
|
12
|
+
export * from './simple-registry';
|
|
13
|
+
export * from './simple-scheduler';
|
|
14
|
+
export * from './strategy';
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
function __export(m) {
|
|
3
|
+
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
|
|
4
|
+
}
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
/**
|
|
7
|
+
* @license
|
|
8
|
+
* Copyright Google Inc. All Rights Reserved.
|
|
9
|
+
*
|
|
10
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
11
|
+
* found in the LICENSE file at https://angular.io/license
|
|
12
|
+
*/
|
|
13
|
+
__export(require("./api"));
|
|
14
|
+
__export(require("./create-job-handler"));
|
|
15
|
+
__export(require("./exception"));
|
|
16
|
+
__export(require("./dispatcher"));
|
|
17
|
+
__export(require("./simple-registry"));
|
|
18
|
+
__export(require("./simple-scheduler"));
|
|
19
|
+
__export(require("./strategy"));
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiLi8iLCJzb3VyY2VzIjpbInBhY2thZ2VzL2FuZ3VsYXJfZGV2a2l0L2NvcmUvc3JjL2V4cGVyaW1lbnRhbC9qb2JzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7Ozs7OztHQU1HO0FBQ0gsMkJBQXNCO0FBQ3RCLDBDQUFxQztBQUNyQyxpQ0FBNEI7QUFDNUIsa0NBQTZCO0FBQzdCLHVDQUFrQztBQUNsQyx3Q0FBbUM7QUFDbkMsZ0NBQTJCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuZXhwb3J0ICogZnJvbSAnLi9hcGknO1xuZXhwb3J0ICogZnJvbSAnLi9jcmVhdGUtam9iLWhhbmRsZXInO1xuZXhwb3J0ICogZnJvbSAnLi9leGNlcHRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9kaXNwYXRjaGVyJztcbmV4cG9ydCAqIGZyb20gJy4vc2ltcGxlLXJlZ2lzdHJ5JztcbmV4cG9ydCAqIGZyb20gJy4vc2ltcGxlLXNjaGVkdWxlcic7XG5leHBvcnQgKiBmcm9tICcuL3N0cmF0ZWd5JztcbiJdfQ==
|