@cspell/cspell-service-bus 6.19.1 → 6.20.0
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/dist/{Dispatcher.d.ts → cjs/Dispatcher.d.ts} +1 -1
- package/dist/{ServiceRequestFactory.d.ts → cjs/ServiceRequestFactory.d.ts} +2 -2
- package/dist/{SystemServiceBus.d.ts → cjs/SystemServiceBus.d.ts} +4 -4
- package/dist/{assert.d.ts → cjs/assert.d.ts} +0 -0
- package/dist/{bus.d.ts → cjs/bus.d.ts} +4 -4
- package/dist/{createRequestHandler.d.ts → cjs/createRequestHandler.d.ts} +3 -3
- package/dist/{errors.d.ts → cjs/errors.d.ts} +1 -1
- package/dist/{handlers.d.ts → cjs/handlers.d.ts} +3 -3
- package/dist/cjs/index.cjs +142 -0
- package/dist/cjs/index.d.ts +9 -0
- package/dist/{request.d.ts → cjs/request.d.ts} +1 -1
- package/dist/{requestFactory.d.ts → cjs/requestFactory.d.ts} +2 -2
- package/dist/esm/Dispatcher.d.ts +5 -0
- package/dist/esm/Dispatcher.js +2 -0
- package/dist/esm/ServiceRequestFactory.d.ts +16 -0
- package/dist/esm/ServiceRequestFactory.js +2 -0
- package/dist/esm/SystemServiceBus.d.ts +33 -0
- package/dist/{SystemServiceBus.js → esm/SystemServiceBus.js} +22 -27
- package/dist/esm/assert.d.ts +2 -0
- package/dist/esm/assert.js +7 -0
- package/dist/esm/bus.d.ts +16 -0
- package/dist/{bus.js → esm/bus.js} +7 -12
- package/dist/esm/createRequestHandler.d.ts +7 -0
- package/dist/esm/createRequestHandler.js +14 -0
- package/dist/esm/errors.d.ts +21 -0
- package/dist/esm/errors.js +28 -0
- package/dist/esm/handlers.d.ts +30 -0
- package/dist/esm/handlers.js +2 -0
- package/dist/esm/index.d.ts +9 -0
- package/dist/esm/index.js +5 -0
- package/dist/esm/request.d.ts +46 -0
- package/dist/esm/request.js +30 -0
- package/dist/esm/requestFactory.d.ts +4 -0
- package/dist/esm/requestFactory.js +21 -0
- package/dist/types/Dispatcher.d.ts +5 -0
- package/dist/types/ServiceRequestFactory.d.ts +16 -0
- package/dist/types/SystemServiceBus.d.ts +33 -0
- package/dist/types/assert.d.ts +2 -0
- package/dist/types/bus.d.ts +16 -0
- package/dist/types/createRequestHandler.d.ts +7 -0
- package/dist/types/errors.d.ts +21 -0
- package/dist/types/handlers.d.ts +30 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/request.d.ts +46 -0
- package/dist/types/requestFactory.d.ts +4 -0
- package/package.json +16 -38
- package/dist/Dispatcher.js +0 -3
- package/dist/ServiceRequestFactory.js +0 -3
- package/dist/assert.js +0 -11
- package/dist/createRequestHandler.js +0 -20
- package/dist/errors.js +0 -35
- package/dist/handlers.js +0 -3
- package/dist/index.d.ts +0 -6
- package/dist/index.js +0 -17
- package/dist/request.js +0 -39
- package/dist/requestFactory.js +0 -25
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { Handler, HandleRequestFn } from './handlers';
|
|
2
|
-
import type { ServiceRequest } from './request';
|
|
1
|
+
import type { Handler, HandleRequestFn } from './handlers.js';
|
|
2
|
+
import type { ServiceRequest } from './request.js';
|
|
3
3
|
export interface ServiceRequestFactory<R extends ServiceRequest, P = R['params'], T extends string = R['type']> {
|
|
4
4
|
type: T;
|
|
5
5
|
is: (r: ServiceRequest | R) => r is R;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { Dispatcher } from './Dispatcher';
|
|
2
|
-
import type { Handler, HandleRequestFn } from './handlers';
|
|
3
|
-
import type { ServiceRequest } from './request';
|
|
4
|
-
import type { ServiceRequestFactory } from './ServiceRequestFactory';
|
|
1
|
+
import type { Dispatcher } from './Dispatcher.js';
|
|
2
|
+
import type { Handler, HandleRequestFn } from './handlers.js';
|
|
3
|
+
import type { ServiceRequest } from './request.js';
|
|
4
|
+
import type { ServiceRequestFactory } from './ServiceRequestFactory.js';
|
|
5
5
|
export interface SystemServiceBus extends Dispatcher {
|
|
6
6
|
registerHandler(requestPrefix: string, handler: Handler): this;
|
|
7
7
|
registerRequestHandler<T extends ServiceRequest>(requestDef: ServiceRequestFactory<T>, fn: HandleRequestFn<T>, name?: string | undefined, description?: string | undefined): this;
|
|
File without changes
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import type { Dispatcher } from './Dispatcher';
|
|
2
|
-
import type { Handler, HandleRequest, HandlerFn } from './handlers';
|
|
3
|
-
import type { RequestResponseType, ServiceRequest } from './request';
|
|
1
|
+
import type { Dispatcher } from './Dispatcher.js';
|
|
2
|
+
import type { Handler, HandleRequest, HandlerFn } from './handlers.js';
|
|
3
|
+
import type { RequestResponseType, ServiceRequest } from './request.js';
|
|
4
4
|
export declare class ServiceBus implements Dispatcher {
|
|
5
5
|
readonly handlers: Handler[];
|
|
6
6
|
constructor(handlers?: Handler[]);
|
|
7
7
|
addHandler(handler: HandlerFn, name: string, description?: string): this;
|
|
8
8
|
addHandler(handler: Handler): this;
|
|
9
9
|
dispatch<R extends ServiceRequest>(request: R): RequestResponseType<R>;
|
|
10
|
-
defaultHandler<T extends ServiceRequest>(request: T): import("./request").ServiceResponseFailure<RequestResponseType<T> extends infer T_1 ? T_1 extends RequestResponseType<T> ? T_1 extends {
|
|
10
|
+
defaultHandler<T extends ServiceRequest>(request: T): import("./request.js").ServiceResponseFailure<RequestResponseType<T> extends infer T_1 ? T_1 extends RequestResponseType<T> ? T_1 extends {
|
|
11
11
|
___T?: infer R;
|
|
12
12
|
} ? R : never : never : never>;
|
|
13
13
|
protected reduceHandlers<R extends ServiceRequest>(handlers: readonly Handler[], request: R, dispatcher: Dispatcher, defaultHandler: HandleRequest): HandleRequest;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { Handler, HandleRequestFn, HandlerFn } from './handlers';
|
|
2
|
-
import type { IsARequest, ServiceRequest } from './request';
|
|
3
|
-
import type { ServiceRequestFactory } from './ServiceRequestFactory';
|
|
1
|
+
import type { Handler, HandleRequestFn, HandlerFn } from './handlers.js';
|
|
2
|
+
import type { IsARequest, ServiceRequest } from './request.js';
|
|
3
|
+
import type { ServiceRequestFactory } from './ServiceRequestFactory.js';
|
|
4
4
|
export declare function createRequestHandler<T extends ServiceRequest>(requestDef: ServiceRequestFactory<T>, fn: HandleRequestFn<T>, name?: string, description?: string): Handler;
|
|
5
5
|
export declare function createIsRequestHandlerFn<T extends ServiceRequest>(isA: IsARequest<T>, fn: HandleRequestFn<T>): HandlerFn;
|
|
6
6
|
export declare function createIsRequestHandler<T extends ServiceRequest>(isA: IsARequest<T>, fn: HandleRequestFn<T>, name: string, description?: string): Handler;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { Dispatcher } from './Dispatcher';
|
|
2
|
-
import type { RequestResponseType, ServiceRequest } from './request';
|
|
3
|
-
import type { ServiceRequestFactory, ServiceRequestFactoryRequestType } from './ServiceRequestFactory';
|
|
1
|
+
import type { Dispatcher } from './Dispatcher.js';
|
|
2
|
+
import type { RequestResponseType, ServiceRequest } from './request.js';
|
|
3
|
+
import type { ServiceRequestFactory, ServiceRequestFactoryRequestType } from './ServiceRequestFactory.js';
|
|
4
4
|
export type HandleRequestFn<R extends ServiceRequest> = (request: R, next: HandleRequest, dispatch: Dispatcher) => RequestResponseType<R>;
|
|
5
5
|
export interface HandleRequest {
|
|
6
6
|
<R extends ServiceRequest>(request: R): any;
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
class ErrorUnhandledRequest extends Error {
|
|
4
|
+
constructor(request) {
|
|
5
|
+
super(`Unhandled Request: ${request.type}`);
|
|
6
|
+
this.request = request;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
class ErrorServiceRequestDepthExceeded extends Error {
|
|
10
|
+
constructor(request, depth) {
|
|
11
|
+
super(`Service Request Depth ${depth} Exceeded: ${request.type}`);
|
|
12
|
+
this.request = request;
|
|
13
|
+
this.depth = depth;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
class UnhandledHandlerError extends Error {
|
|
17
|
+
constructor(handlerName, handlerDescription, cause) {
|
|
18
|
+
super(`Unhandled Error in Handler: ${handlerName}`);
|
|
19
|
+
this.handlerName = handlerName;
|
|
20
|
+
this.handlerDescription = handlerDescription;
|
|
21
|
+
this.cause = cause;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
class BaseServiceRequest {
|
|
26
|
+
constructor(type, params) {
|
|
27
|
+
this.type = type;
|
|
28
|
+
this.params = params;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
class ServiceRequestCls extends BaseServiceRequest {
|
|
32
|
+
constructor(type, params) {
|
|
33
|
+
super(type, params);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function createResponse(value, _req) {
|
|
37
|
+
return { value };
|
|
38
|
+
}
|
|
39
|
+
function createResponseFail(_request, error) {
|
|
40
|
+
return { error };
|
|
41
|
+
}
|
|
42
|
+
function isServiceResponseSuccess(res) {
|
|
43
|
+
return 'value' in res && res.error === undefined;
|
|
44
|
+
}
|
|
45
|
+
function isServiceResponseFailure(res) {
|
|
46
|
+
return res.error !== undefined;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const MAX_DEPTH = 10;
|
|
50
|
+
class ServiceBus {
|
|
51
|
+
constructor(handlers = []) {
|
|
52
|
+
this.handlers = [];
|
|
53
|
+
handlers.forEach((h) => this.addHandler(h));
|
|
54
|
+
}
|
|
55
|
+
addHandler(handler, name = 'anonymous', description) {
|
|
56
|
+
const h = typeof handler === 'function' ? { fn: handler, name, description } : handler;
|
|
57
|
+
const { fn, name: _name, description: _description } = h;
|
|
58
|
+
this.handlers.push({ fn, name: _name, description: _description });
|
|
59
|
+
return this;
|
|
60
|
+
}
|
|
61
|
+
dispatch(request) {
|
|
62
|
+
let depth = 0;
|
|
63
|
+
const dispatcher = { dispatch };
|
|
64
|
+
const handler = this.reduceHandlers(this.handlers, request, dispatcher, this.defaultHandler);
|
|
65
|
+
function dispatch(request) {
|
|
66
|
+
++depth;
|
|
67
|
+
if (depth >= MAX_DEPTH) {
|
|
68
|
+
return createResponseFail(request, new ErrorServiceRequestDepthExceeded(request, depth));
|
|
69
|
+
}
|
|
70
|
+
const response = handler(request);
|
|
71
|
+
--depth;
|
|
72
|
+
return response;
|
|
73
|
+
}
|
|
74
|
+
return dispatch(request);
|
|
75
|
+
}
|
|
76
|
+
defaultHandler(request) {
|
|
77
|
+
return createResponseFail(request, new ErrorUnhandledRequest(request));
|
|
78
|
+
}
|
|
79
|
+
reduceHandlers(handlers, request, dispatcher, defaultHandler) {
|
|
80
|
+
const _handlers = handlers.map((m) => ({ ...m, fn: m.fn(dispatcher) }));
|
|
81
|
+
const handler = _handlers.reduce((next, h) => {
|
|
82
|
+
const fn = h.fn(next);
|
|
83
|
+
return (req) => {
|
|
84
|
+
try {
|
|
85
|
+
return fn(req);
|
|
86
|
+
}
|
|
87
|
+
catch (e) {
|
|
88
|
+
return createResponseFail(request, new UnhandledHandlerError(h.name, h.description, e));
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
}, defaultHandler);
|
|
92
|
+
return handler;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
function createServiceBus(handlers = []) {
|
|
96
|
+
return new ServiceBus(handlers);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function createRequestHandler(requestDef, fn, name, description) {
|
|
100
|
+
return createIsRequestHandler(requestDef.is, fn, name ?? requestDef.type, description);
|
|
101
|
+
}
|
|
102
|
+
function createIsRequestHandlerFn(isA, fn) {
|
|
103
|
+
return (dispatcher) => (next) => (request) => isA(request) ? fn(request, next, dispatcher) : next(request);
|
|
104
|
+
}
|
|
105
|
+
function createIsRequestHandler(isA, fn, name, description) {
|
|
106
|
+
return {
|
|
107
|
+
fn: createIsRequestHandlerFn(isA, fn),
|
|
108
|
+
name,
|
|
109
|
+
description,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function requestFactory(requestType) {
|
|
114
|
+
class RequestClass extends ServiceRequestCls {
|
|
115
|
+
constructor(params) {
|
|
116
|
+
super(requestType, params);
|
|
117
|
+
}
|
|
118
|
+
static is(req) {
|
|
119
|
+
return req instanceof RequestClass && req.type === requestType;
|
|
120
|
+
}
|
|
121
|
+
static create(params) {
|
|
122
|
+
return new RequestClass(params);
|
|
123
|
+
}
|
|
124
|
+
static createRequestHandler(fn, name, description) {
|
|
125
|
+
return createRequestHandler(RequestClass, fn, name, description);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
RequestClass.type = requestType;
|
|
129
|
+
return RequestClass;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
exports.ServiceBus = ServiceBus;
|
|
133
|
+
exports.ServiceRequestCls = ServiceRequestCls;
|
|
134
|
+
exports.createIsRequestHandler = createIsRequestHandler;
|
|
135
|
+
exports.createRequestHandler = createRequestHandler;
|
|
136
|
+
exports.createResponse = createResponse;
|
|
137
|
+
exports.createResponseFail = createResponseFail;
|
|
138
|
+
exports.createServiceBus = createServiceBus;
|
|
139
|
+
exports.isServiceResponseFailure = isServiceResponseFailure;
|
|
140
|
+
exports.isServiceResponseSuccess = isServiceResponseSuccess;
|
|
141
|
+
exports.requestFactory = requestFactory;
|
|
142
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { createServiceBus, ServiceBus } from './bus.js';
|
|
2
|
+
export { createIsRequestHandler, createRequestHandler } from './createRequestHandler.js';
|
|
3
|
+
export { Dispatcher } from './Dispatcher.js';
|
|
4
|
+
export type { Handler } from './handlers.js';
|
|
5
|
+
export type { ServiceRequest } from './request.js';
|
|
6
|
+
export { createResponse, createResponseFail, isServiceResponseFailure, isServiceResponseSuccess, ServiceRequestCls, ServiceResponse, } from './request.js';
|
|
7
|
+
export { requestFactory } from './requestFactory.js';
|
|
8
|
+
export type { ServiceRequestFactory, ServiceRequestFactoryRequestType } from './ServiceRequestFactory.js';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -9,7 +9,7 @@ declare class BaseServiceRequest<T extends string, P, R> implements ServiceReque
|
|
|
9
9
|
readonly __r?: ServiceResponseBase<R>;
|
|
10
10
|
constructor(type: T, params: P);
|
|
11
11
|
}
|
|
12
|
-
export declare class
|
|
12
|
+
export declare class ServiceRequestCls<T extends string, P, R> extends BaseServiceRequest<T, P, R> {
|
|
13
13
|
constructor(type: T, params: P);
|
|
14
14
|
}
|
|
15
15
|
interface ServiceResponseBase<T> {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ServiceRequest } from './request';
|
|
2
|
-
import type { ServiceRequestFactory } from './ServiceRequestFactory';
|
|
1
|
+
import type { ServiceRequest } from './request.js';
|
|
2
|
+
import type { ServiceRequestFactory } from './ServiceRequestFactory.js';
|
|
3
3
|
export declare function requestFactory<T extends string, P, R>(requestType: T): ServiceRequestFactory<ServiceRequest<T, P, R>>;
|
|
4
4
|
//# sourceMappingURL=requestFactory.d.ts.map
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Handler, HandleRequestFn } from './handlers.js';
|
|
2
|
+
import type { ServiceRequest } from './request.js';
|
|
3
|
+
export interface ServiceRequestFactory<R extends ServiceRequest, P = R['params'], T extends string = R['type']> {
|
|
4
|
+
type: T;
|
|
5
|
+
is: (r: ServiceRequest | R) => r is R;
|
|
6
|
+
create(params: P): R;
|
|
7
|
+
createRequestHandler(fn: HandleRequestFn<R>, name?: string, description?: string): Handler;
|
|
8
|
+
/**
|
|
9
|
+
* Place holder property used to determine the request type. It is NEVER set.
|
|
10
|
+
*/
|
|
11
|
+
__request?: R;
|
|
12
|
+
}
|
|
13
|
+
export type ServiceRequestFactoryRequestType<T> = T extends {
|
|
14
|
+
__request?: infer R;
|
|
15
|
+
} ? R : never;
|
|
16
|
+
//# sourceMappingURL=ServiceRequestFactory.d.ts.map
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { Dispatcher } from './Dispatcher.js';
|
|
2
|
+
import type { Handler, HandleRequestFn } from './handlers.js';
|
|
3
|
+
import type { ServiceRequest } from './request.js';
|
|
4
|
+
import type { ServiceRequestFactory } from './ServiceRequestFactory.js';
|
|
5
|
+
export interface SystemServiceBus extends Dispatcher {
|
|
6
|
+
registerHandler(requestPrefix: string, handler: Handler): this;
|
|
7
|
+
registerRequestHandler<T extends ServiceRequest>(requestDef: ServiceRequestFactory<T>, fn: HandleRequestFn<T>, name?: string | undefined, description?: string | undefined): this;
|
|
8
|
+
createSubsystem(name: string, requestPattern: string | RegExp): SubsystemServiceBus;
|
|
9
|
+
readonly subsystems: Map<string, SubsystemServiceBus>;
|
|
10
|
+
}
|
|
11
|
+
export declare function createSystemServiceBus(): SystemServiceBus;
|
|
12
|
+
export declare const RequestRegisterHandlerFactory: ServiceRequestFactory<ServiceRequest<"System:RegisterHandler", {
|
|
13
|
+
readonly requestPrefix: string;
|
|
14
|
+
readonly handler: Handler;
|
|
15
|
+
}, SubsystemServiceBus>, {
|
|
16
|
+
readonly requestPrefix: string;
|
|
17
|
+
readonly handler: Handler;
|
|
18
|
+
}, "System:RegisterHandler">;
|
|
19
|
+
export declare const RequestCreateSubsystemFactory: ServiceRequestFactory<ServiceRequest<"System:CreateSubsystem", {
|
|
20
|
+
readonly name: string;
|
|
21
|
+
readonly requestPattern: string | RegExp;
|
|
22
|
+
}, SubsystemServiceBus>, {
|
|
23
|
+
readonly name: string;
|
|
24
|
+
readonly requestPattern: string | RegExp;
|
|
25
|
+
}, "System:CreateSubsystem">;
|
|
26
|
+
interface SubsystemServiceBus extends Dispatcher {
|
|
27
|
+
readonly name: string;
|
|
28
|
+
readonly requestPattern: string | RegExp;
|
|
29
|
+
readonly handler: Handler;
|
|
30
|
+
}
|
|
31
|
+
export declare function createSubsystemServiceBus(name: string, requestPattern: string | RegExp): SubsystemServiceBus;
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=SystemServiceBus.d.ts.map
|
|
@@ -1,61 +1,57 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const errors_1 = require("./errors");
|
|
8
|
-
const request_1 = require("./request");
|
|
9
|
-
const requestFactory_1 = require("./requestFactory");
|
|
1
|
+
import { assert } from './assert.js';
|
|
2
|
+
import { createServiceBus, ServiceBus } from './bus.js';
|
|
3
|
+
import { createRequestHandler } from './createRequestHandler.js';
|
|
4
|
+
import { ErrorDuplicateSubsystem } from './errors.js';
|
|
5
|
+
import { createResponse } from './request.js';
|
|
6
|
+
import { requestFactory } from './requestFactory.js';
|
|
10
7
|
class SystemServiceBusImpl {
|
|
11
8
|
constructor() {
|
|
12
|
-
this.serviceBus =
|
|
9
|
+
this.serviceBus = createServiceBus();
|
|
13
10
|
this._subsystems = new Map();
|
|
14
11
|
this.bindDefaultHandlers();
|
|
15
12
|
this.createSubsystem('Default Subsystem', '' /* match everything */);
|
|
16
13
|
}
|
|
17
14
|
bindDefaultHandlers() {
|
|
18
|
-
this.serviceBus.addHandler(
|
|
15
|
+
this.serviceBus.addHandler(createRequestHandler(RequestCreateSubsystemFactory, (req) => {
|
|
19
16
|
const { name, requestPattern } = req.params;
|
|
20
17
|
if (this._subsystems.has(name)) {
|
|
21
|
-
throw new
|
|
18
|
+
throw new ErrorDuplicateSubsystem(name);
|
|
22
19
|
}
|
|
23
20
|
const sub = createSubsystemServiceBus(name, requestPattern);
|
|
24
21
|
this._subsystems.set(name, sub);
|
|
25
22
|
this.serviceBus.addHandler(sub.handler);
|
|
26
|
-
return
|
|
23
|
+
return createResponse(sub);
|
|
27
24
|
}));
|
|
28
25
|
}
|
|
29
26
|
dispatch(request) {
|
|
30
27
|
return this.serviceBus.dispatch(request);
|
|
31
28
|
}
|
|
32
29
|
createSubsystem(name, requestPattern) {
|
|
33
|
-
const res = this.dispatch(
|
|
34
|
-
|
|
30
|
+
const res = this.dispatch(RequestCreateSubsystemFactory.create({ name, requestPattern }));
|
|
31
|
+
assert(res?.value);
|
|
35
32
|
return res.value;
|
|
36
33
|
}
|
|
37
34
|
registerHandler(requestPrefix, handler) {
|
|
38
|
-
const request =
|
|
35
|
+
const request = RequestRegisterHandlerFactory.create({ requestPrefix, handler });
|
|
39
36
|
this.serviceBus.dispatch(request);
|
|
40
37
|
return this;
|
|
41
38
|
}
|
|
42
39
|
registerRequestHandler(requestDef, fn, name, description) {
|
|
43
|
-
this.registerHandler(requestDef.type,
|
|
40
|
+
this.registerHandler(requestDef.type, createRequestHandler(requestDef, fn, name, description));
|
|
44
41
|
return this;
|
|
45
42
|
}
|
|
46
43
|
get subsystems() {
|
|
47
44
|
return new Map(this._subsystems);
|
|
48
45
|
}
|
|
49
46
|
}
|
|
50
|
-
function createSystemServiceBus() {
|
|
47
|
+
export function createSystemServiceBus() {
|
|
51
48
|
return new SystemServiceBusImpl();
|
|
52
49
|
}
|
|
53
|
-
exports.createSystemServiceBus = createSystemServiceBus;
|
|
54
50
|
const TypeRequestRegisterHandler = 'System:RegisterHandler';
|
|
55
|
-
|
|
51
|
+
export const RequestRegisterHandlerFactory = requestFactory(TypeRequestRegisterHandler);
|
|
56
52
|
const TypeRequestCreateSubsystem = 'System:CreateSubsystem';
|
|
57
|
-
|
|
58
|
-
class SubsystemServiceBusImpl extends
|
|
53
|
+
export const RequestCreateSubsystemFactory = requestFactory(TypeRequestCreateSubsystem);
|
|
54
|
+
class SubsystemServiceBusImpl extends ServiceBus {
|
|
59
55
|
constructor(name, requestPattern) {
|
|
60
56
|
super();
|
|
61
57
|
this.name = name;
|
|
@@ -64,7 +60,7 @@ class SubsystemServiceBusImpl extends bus_1.ServiceBus {
|
|
|
64
60
|
typeof requestPattern === 'string'
|
|
65
61
|
? (reqType) => reqType.startsWith(requestPattern)
|
|
66
62
|
: (reqType) => requestPattern.test(reqType);
|
|
67
|
-
const handleRegistration =
|
|
63
|
+
const handleRegistration = createRequestHandler(RequestRegisterHandlerFactory, (req, next) => this.handleRegistrationReq(req, next), 'Subsystem Register Handlers for ' + name, `Matches against: <${requestPattern.toString()}>`);
|
|
68
64
|
this.addHandler(handleRegistration);
|
|
69
65
|
this.handler = {
|
|
70
66
|
name: 'Subsystem: ' + name,
|
|
@@ -80,19 +76,18 @@ class SubsystemServiceBusImpl extends bus_1.ServiceBus {
|
|
|
80
76
|
}
|
|
81
77
|
// console.log(`${this.name}.handleRegistrationReq add ***`);
|
|
82
78
|
this.addHandler(request.params.handler);
|
|
83
|
-
return
|
|
79
|
+
return createResponse(this);
|
|
84
80
|
}
|
|
85
81
|
_handler(dispatcher) {
|
|
86
82
|
return (next) => (req) => {
|
|
87
|
-
if (!this.canHandleType(req.type) && !
|
|
83
|
+
if (!this.canHandleType(req.type) && !RequestRegisterHandlerFactory.is(req))
|
|
88
84
|
return next(req);
|
|
89
85
|
const dispatch = this.reduceHandlers(this.handlers, req, dispatcher, next);
|
|
90
86
|
return dispatch(req);
|
|
91
87
|
};
|
|
92
88
|
}
|
|
93
89
|
}
|
|
94
|
-
function createSubsystemServiceBus(name, requestPattern) {
|
|
90
|
+
export function createSubsystemServiceBus(name, requestPattern) {
|
|
95
91
|
return new SubsystemServiceBusImpl(name, requestPattern);
|
|
96
92
|
}
|
|
97
|
-
exports.createSubsystemServiceBus = createSubsystemServiceBus;
|
|
98
93
|
//# sourceMappingURL=SystemServiceBus.js.map
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Dispatcher } from './Dispatcher.js';
|
|
2
|
+
import type { Handler, HandleRequest, HandlerFn } from './handlers.js';
|
|
3
|
+
import type { RequestResponseType, ServiceRequest } from './request.js';
|
|
4
|
+
export declare class ServiceBus implements Dispatcher {
|
|
5
|
+
readonly handlers: Handler[];
|
|
6
|
+
constructor(handlers?: Handler[]);
|
|
7
|
+
addHandler(handler: HandlerFn, name: string, description?: string): this;
|
|
8
|
+
addHandler(handler: Handler): this;
|
|
9
|
+
dispatch<R extends ServiceRequest>(request: R): RequestResponseType<R>;
|
|
10
|
+
defaultHandler<T extends ServiceRequest>(request: T): import("./request.js").ServiceResponseFailure<RequestResponseType<T> extends infer T_1 ? T_1 extends RequestResponseType<T> ? T_1 extends {
|
|
11
|
+
___T?: infer R;
|
|
12
|
+
} ? R : never : never : never>;
|
|
13
|
+
protected reduceHandlers<R extends ServiceRequest>(handlers: readonly Handler[], request: R, dispatcher: Dispatcher, defaultHandler: HandleRequest): HandleRequest;
|
|
14
|
+
}
|
|
15
|
+
export declare function createServiceBus(handlers?: Handler[]): ServiceBus;
|
|
16
|
+
//# sourceMappingURL=bus.d.ts.map
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.createServiceBus = exports.ServiceBus = void 0;
|
|
4
|
-
const errors_1 = require("./errors");
|
|
5
|
-
const request_1 = require("./request");
|
|
1
|
+
import { ErrorServiceRequestDepthExceeded, ErrorUnhandledRequest, UnhandledHandlerError } from './errors.js';
|
|
2
|
+
import { createResponseFail } from './request.js';
|
|
6
3
|
const MAX_DEPTH = 10;
|
|
7
|
-
class ServiceBus {
|
|
4
|
+
export class ServiceBus {
|
|
8
5
|
constructor(handlers = []) {
|
|
9
6
|
this.handlers = [];
|
|
10
7
|
handlers.forEach((h) => this.addHandler(h));
|
|
@@ -22,7 +19,7 @@ class ServiceBus {
|
|
|
22
19
|
function dispatch(request) {
|
|
23
20
|
++depth;
|
|
24
21
|
if (depth >= MAX_DEPTH) {
|
|
25
|
-
return
|
|
22
|
+
return createResponseFail(request, new ErrorServiceRequestDepthExceeded(request, depth));
|
|
26
23
|
}
|
|
27
24
|
const response = handler(request);
|
|
28
25
|
--depth;
|
|
@@ -31,7 +28,7 @@ class ServiceBus {
|
|
|
31
28
|
return dispatch(request);
|
|
32
29
|
}
|
|
33
30
|
defaultHandler(request) {
|
|
34
|
-
return
|
|
31
|
+
return createResponseFail(request, new ErrorUnhandledRequest(request));
|
|
35
32
|
}
|
|
36
33
|
reduceHandlers(handlers, request, dispatcher, defaultHandler) {
|
|
37
34
|
const _handlers = handlers.map((m) => ({ ...m, fn: m.fn(dispatcher) }));
|
|
@@ -42,16 +39,14 @@ class ServiceBus {
|
|
|
42
39
|
return fn(req);
|
|
43
40
|
}
|
|
44
41
|
catch (e) {
|
|
45
|
-
return
|
|
42
|
+
return createResponseFail(request, new UnhandledHandlerError(h.name, h.description, e));
|
|
46
43
|
}
|
|
47
44
|
};
|
|
48
45
|
}, defaultHandler);
|
|
49
46
|
return handler;
|
|
50
47
|
}
|
|
51
48
|
}
|
|
52
|
-
|
|
53
|
-
function createServiceBus(handlers = []) {
|
|
49
|
+
export function createServiceBus(handlers = []) {
|
|
54
50
|
return new ServiceBus(handlers);
|
|
55
51
|
}
|
|
56
|
-
exports.createServiceBus = createServiceBus;
|
|
57
52
|
//# sourceMappingURL=bus.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Handler, HandleRequestFn, HandlerFn } from './handlers.js';
|
|
2
|
+
import type { IsARequest, ServiceRequest } from './request.js';
|
|
3
|
+
import type { ServiceRequestFactory } from './ServiceRequestFactory.js';
|
|
4
|
+
export declare function createRequestHandler<T extends ServiceRequest>(requestDef: ServiceRequestFactory<T>, fn: HandleRequestFn<T>, name?: string, description?: string): Handler;
|
|
5
|
+
export declare function createIsRequestHandlerFn<T extends ServiceRequest>(isA: IsARequest<T>, fn: HandleRequestFn<T>): HandlerFn;
|
|
6
|
+
export declare function createIsRequestHandler<T extends ServiceRequest>(isA: IsARequest<T>, fn: HandleRequestFn<T>, name: string, description?: string): Handler;
|
|
7
|
+
//# sourceMappingURL=createRequestHandler.d.ts.map
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export function createRequestHandler(requestDef, fn, name, description) {
|
|
2
|
+
return createIsRequestHandler(requestDef.is, fn, name ?? requestDef.type, description);
|
|
3
|
+
}
|
|
4
|
+
export function createIsRequestHandlerFn(isA, fn) {
|
|
5
|
+
return (dispatcher) => (next) => (request) => isA(request) ? fn(request, next, dispatcher) : next(request);
|
|
6
|
+
}
|
|
7
|
+
export function createIsRequestHandler(isA, fn, name, description) {
|
|
8
|
+
return {
|
|
9
|
+
fn: createIsRequestHandlerFn(isA, fn),
|
|
10
|
+
name,
|
|
11
|
+
description,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=createRequestHandler.js.map
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ServiceRequest } from './request.js';
|
|
2
|
+
export declare class ErrorUnhandledRequest extends Error {
|
|
3
|
+
readonly request: ServiceRequest;
|
|
4
|
+
constructor(request: ServiceRequest);
|
|
5
|
+
}
|
|
6
|
+
export declare class ErrorServiceRequestDepthExceeded extends Error {
|
|
7
|
+
readonly request: ServiceRequest;
|
|
8
|
+
readonly depth: number;
|
|
9
|
+
constructor(request: ServiceRequest, depth: number);
|
|
10
|
+
}
|
|
11
|
+
export declare class UnhandledHandlerError extends Error {
|
|
12
|
+
readonly handlerName: string;
|
|
13
|
+
readonly handlerDescription: string | undefined;
|
|
14
|
+
readonly cause: unknown;
|
|
15
|
+
constructor(handlerName: string, handlerDescription: string | undefined, cause: unknown);
|
|
16
|
+
}
|
|
17
|
+
export declare class ErrorDuplicateSubsystem extends Error {
|
|
18
|
+
readonly subsystemName: string;
|
|
19
|
+
constructor(subsystemName: string);
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export class ErrorUnhandledRequest extends Error {
|
|
2
|
+
constructor(request) {
|
|
3
|
+
super(`Unhandled Request: ${request.type}`);
|
|
4
|
+
this.request = request;
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
export class ErrorServiceRequestDepthExceeded extends Error {
|
|
8
|
+
constructor(request, depth) {
|
|
9
|
+
super(`Service Request Depth ${depth} Exceeded: ${request.type}`);
|
|
10
|
+
this.request = request;
|
|
11
|
+
this.depth = depth;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export class UnhandledHandlerError extends Error {
|
|
15
|
+
constructor(handlerName, handlerDescription, cause) {
|
|
16
|
+
super(`Unhandled Error in Handler: ${handlerName}`);
|
|
17
|
+
this.handlerName = handlerName;
|
|
18
|
+
this.handlerDescription = handlerDescription;
|
|
19
|
+
this.cause = cause;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export class ErrorDuplicateSubsystem extends Error {
|
|
23
|
+
constructor(subsystemName) {
|
|
24
|
+
super(`Duplicate subsystem: ${subsystemName}`);
|
|
25
|
+
this.subsystemName = subsystemName;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Dispatcher } from './Dispatcher.js';
|
|
2
|
+
import type { RequestResponseType, ServiceRequest } from './request.js';
|
|
3
|
+
import type { ServiceRequestFactory, ServiceRequestFactoryRequestType } from './ServiceRequestFactory.js';
|
|
4
|
+
export type HandleRequestFn<R extends ServiceRequest> = (request: R, next: HandleRequest, dispatch: Dispatcher) => RequestResponseType<R>;
|
|
5
|
+
export interface HandleRequest {
|
|
6
|
+
<R extends ServiceRequest>(request: R): any;
|
|
7
|
+
}
|
|
8
|
+
export interface HandleRequestKnown<R extends ServiceRequest> {
|
|
9
|
+
(request: R): RequestResponseType<R>;
|
|
10
|
+
}
|
|
11
|
+
export type FactoryRequestHandler<T extends ServiceRequestFactory<ServiceRequest>, R extends ServiceRequest = ServiceRequestFactoryRequestType<T>> = HandleRequestKnown<R>;
|
|
12
|
+
export interface HandlerNext {
|
|
13
|
+
(next: HandleRequest): HandleRequest;
|
|
14
|
+
}
|
|
15
|
+
export interface HandlerFn {
|
|
16
|
+
(dispatcher: Dispatcher): HandlerNext;
|
|
17
|
+
}
|
|
18
|
+
export interface Handler {
|
|
19
|
+
/**
|
|
20
|
+
* Name of the Handler.
|
|
21
|
+
* Useful for debugging and uncaught exceptions.
|
|
22
|
+
*/
|
|
23
|
+
readonly name: string;
|
|
24
|
+
/**
|
|
25
|
+
* Optional description of the Handler.
|
|
26
|
+
*/
|
|
27
|
+
readonly description?: string | undefined;
|
|
28
|
+
readonly fn: HandlerFn;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=handlers.d.ts.map
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { createServiceBus, ServiceBus } from './bus.js';
|
|
2
|
+
export { createIsRequestHandler, createRequestHandler } from './createRequestHandler.js';
|
|
3
|
+
export { Dispatcher } from './Dispatcher.js';
|
|
4
|
+
export type { Handler } from './handlers.js';
|
|
5
|
+
export type { ServiceRequest } from './request.js';
|
|
6
|
+
export { createResponse, createResponseFail, isServiceResponseFailure, isServiceResponseSuccess, ServiceRequestCls, ServiceResponse, } from './request.js';
|
|
7
|
+
export { requestFactory } from './requestFactory.js';
|
|
8
|
+
export type { ServiceRequestFactory, ServiceRequestFactoryRequestType } from './ServiceRequestFactory.js';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { createServiceBus, ServiceBus } from './bus.js';
|
|
2
|
+
export { createIsRequestHandler, createRequestHandler } from './createRequestHandler.js';
|
|
3
|
+
export { createResponse, createResponseFail, isServiceResponseFailure, isServiceResponseSuccess, ServiceRequestCls, } from './request.js';
|
|
4
|
+
export { requestFactory } from './requestFactory.js';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|