@cspell/cspell-service-bus 6.2.4-alpha.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2017 Jason Dent
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # `@cspell/cspell-service-bus`
2
+
3
+ A Library for connecting requests to services that can fulfill them.
package/dist/bus.d.ts ADDED
@@ -0,0 +1,33 @@
1
+ import { IsARequest, RequestResponseType, ServiceRequest } from './request';
2
+ export interface Dispatcher {
3
+ dispatch<R extends ServiceRequest>(request: R): R['__r'];
4
+ }
5
+ export declare class ServiceBus implements Dispatcher {
6
+ readonly handlers: Handler[];
7
+ constructor(handlers: Handler[]);
8
+ addHandler(handler: Handler): void;
9
+ dispatch<R extends ServiceRequest>(request: R): RequestResponseType<R>;
10
+ }
11
+ export declare function createServiceBus(handlers?: Handler[]): ServiceBus;
12
+ export declare type HandleRequestFn<R extends ServiceRequest> = (request: R) => RequestResponseType<R>;
13
+ export interface HandleRequest {
14
+ <R extends ServiceRequest>(request: R): RequestResponseType<any>;
15
+ }
16
+ interface HandlerNext {
17
+ (next: HandleRequest): HandleRequest;
18
+ }
19
+ export interface Handler {
20
+ (dispatcher: Dispatcher): HandlerNext;
21
+ }
22
+ export declare function createRequestHandler<T extends ServiceRequest>(isA: IsARequest<T>, fn: HandleRequestFn<T>): Handler;
23
+ export declare class ErrorUnhandledRequest extends Error {
24
+ readonly request: ServiceRequest;
25
+ constructor(request: ServiceRequest);
26
+ }
27
+ export declare class ErrorServiceRequestDepthExceeded extends Error {
28
+ readonly request: ServiceRequest;
29
+ readonly depth: number;
30
+ constructor(request: ServiceRequest, depth: number);
31
+ }
32
+ export {};
33
+ //# sourceMappingURL=bus.d.ts.map
package/dist/bus.js ADDED
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ErrorServiceRequestDepthExceeded = exports.ErrorUnhandledRequest = exports.createRequestHandler = exports.createServiceBus = exports.ServiceBus = void 0;
4
+ const request_1 = require("./request");
5
+ const MAX_DEPTH = 10;
6
+ class ServiceBus {
7
+ constructor(handlers) {
8
+ this.handlers = handlers;
9
+ }
10
+ addHandler(handler) {
11
+ this.handlers.push(handler);
12
+ }
13
+ dispatch(request) {
14
+ let depth = 0;
15
+ const dispatcher = {
16
+ dispatch,
17
+ };
18
+ const unhandledHandler = (request) => {
19
+ return (0, request_1.createResponseFail)(request, new ErrorUnhandledRequest(request));
20
+ };
21
+ const handlers = this.handlers.reverse().map((m) => m(dispatcher));
22
+ function dispatch(request) {
23
+ ++depth;
24
+ if (depth >= MAX_DEPTH) {
25
+ return (0, request_1.createResponseFail)(request, new ErrorServiceRequestDepthExceeded(request, depth));
26
+ }
27
+ const defaultHandler = unhandledHandler;
28
+ const handler = handlers.reduce((next, h) => h(next), defaultHandler);
29
+ const response = handler(request);
30
+ --depth;
31
+ return response;
32
+ }
33
+ return dispatch(request);
34
+ }
35
+ }
36
+ exports.ServiceBus = ServiceBus;
37
+ function createServiceBus(handlers = []) {
38
+ return new ServiceBus(handlers);
39
+ }
40
+ exports.createServiceBus = createServiceBus;
41
+ function createRequestHandler(isA, fn) {
42
+ return (_service) => (next) => (request) => isA(request) ? fn(request) : next(request);
43
+ }
44
+ exports.createRequestHandler = createRequestHandler;
45
+ class ErrorUnhandledRequest extends Error {
46
+ constructor(request) {
47
+ super(`Unhandled Request: ${request.type}`);
48
+ this.request = request;
49
+ }
50
+ }
51
+ exports.ErrorUnhandledRequest = ErrorUnhandledRequest;
52
+ class ErrorServiceRequestDepthExceeded extends Error {
53
+ constructor(request, depth) {
54
+ super(`Service Request Depth ${depth} Exceeded: ${request.type}`);
55
+ this.request = request;
56
+ this.depth = depth;
57
+ }
58
+ }
59
+ exports.ErrorServiceRequestDepthExceeded = ErrorServiceRequestDepthExceeded;
60
+ //# sourceMappingURL=bus.js.map
@@ -0,0 +1,3 @@
1
+ export { ServiceRequest, ServiceRequestAsync, ServiceRequestSync } from './request';
2
+ export { ServiceBus, createServiceBus } from './bus';
3
+ //# sourceMappingURL=index.d.ts.map
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createServiceBus = exports.ServiceBus = exports.ServiceRequestSync = exports.ServiceRequestAsync = void 0;
4
+ var request_1 = require("./request");
5
+ Object.defineProperty(exports, "ServiceRequestAsync", { enumerable: true, get: function () { return request_1.ServiceRequestAsync; } });
6
+ Object.defineProperty(exports, "ServiceRequestSync", { enumerable: true, get: function () { return request_1.ServiceRequestSync; } });
7
+ var bus_1 = require("./bus");
8
+ Object.defineProperty(exports, "ServiceBus", { enumerable: true, get: function () { return bus_1.ServiceBus; } });
9
+ Object.defineProperty(exports, "createServiceBus", { enumerable: true, get: function () { return bus_1.createServiceBus; } });
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,43 @@
1
+ export interface ServiceRequest<T = string, R = unknown> {
2
+ readonly type: T;
3
+ __r?: ServiceResponseBase<R>;
4
+ }
5
+ export declare class BaseServiceRequest<T extends string, R> implements ServiceRequest<T, R> {
6
+ readonly type: T;
7
+ readonly __r?: ServiceResponseBase<R>;
8
+ constructor(type: T);
9
+ }
10
+ export declare class ServiceRequestSync<T extends string, R> extends BaseServiceRequest<T, R> {
11
+ readonly sync = true;
12
+ constructor(type: T);
13
+ }
14
+ export declare class ServiceRequestAsync<T extends string, R> extends BaseServiceRequest<T, R> {
15
+ constructor(type: T);
16
+ }
17
+ interface ServiceResponseBase<T> {
18
+ ___T?: T;
19
+ }
20
+ export interface ServiceResponseSuccess<T> extends ServiceResponseBase<T> {
21
+ value: T;
22
+ error?: undefined;
23
+ }
24
+ export interface ServiceResponseFailure<T> extends ServiceResponseBase<T> {
25
+ error: Error;
26
+ }
27
+ export declare type ServiceResponse<T> = ServiceResponseSuccess<T> | ServiceResponseFailure<T>;
28
+ export declare type IsARequest<T extends ServiceRequest> = (r: ServiceRequest) => r is T;
29
+ export declare function createResponse<T>(value: T): ServiceResponseSuccess<T>;
30
+ declare type VT<T> = T extends {
31
+ ___T?: infer R;
32
+ } ? R : never;
33
+ export declare type RequestResponseType<T> = T extends {
34
+ __r?: infer R;
35
+ } ? R : never;
36
+ export declare function createResponseFail<R extends ServiceRequest, E extends Error>(_request: R, error: E): ServiceResponseFailure<VT<RequestResponseType<R>>>;
37
+ export declare function isServiceResponseSuccess<T>(res: ServiceResponseBase<T>): res is ServiceResponseSuccess<T>;
38
+ export declare function isServiceResponseFailure<T>(res: ServiceResponseBase<T>): res is ServiceResponseFailure<T>;
39
+ export declare function isInstanceOfFn<T>(constructor: {
40
+ new (): T;
41
+ }): (t: unknown) => t is T;
42
+ export {};
43
+ //# sourceMappingURL=request.d.ts.map
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isInstanceOfFn = exports.isServiceResponseFailure = exports.isServiceResponseSuccess = exports.createResponseFail = exports.createResponse = exports.ServiceRequestAsync = exports.ServiceRequestSync = exports.BaseServiceRequest = void 0;
4
+ class BaseServiceRequest {
5
+ constructor(type) {
6
+ this.type = type;
7
+ }
8
+ }
9
+ exports.BaseServiceRequest = BaseServiceRequest;
10
+ class ServiceRequestSync extends BaseServiceRequest {
11
+ constructor(type) {
12
+ super(type);
13
+ this.sync = true;
14
+ }
15
+ }
16
+ exports.ServiceRequestSync = ServiceRequestSync;
17
+ class ServiceRequestAsync extends BaseServiceRequest {
18
+ constructor(type) {
19
+ super(type);
20
+ }
21
+ }
22
+ exports.ServiceRequestAsync = ServiceRequestAsync;
23
+ function createResponse(value) {
24
+ return { value };
25
+ }
26
+ exports.createResponse = createResponse;
27
+ function createResponseFail(_request, error) {
28
+ return { error };
29
+ }
30
+ exports.createResponseFail = createResponseFail;
31
+ function isServiceResponseSuccess(res) {
32
+ return 'value' in res && res.error === undefined;
33
+ }
34
+ exports.isServiceResponseSuccess = isServiceResponseSuccess;
35
+ function isServiceResponseFailure(res) {
36
+ return res.error !== undefined;
37
+ }
38
+ exports.isServiceResponseFailure = isServiceResponseFailure;
39
+ function isInstanceOfFn(constructor) {
40
+ return (t) => t instanceof constructor;
41
+ }
42
+ exports.isInstanceOfFn = isInstanceOfFn;
43
+ //# sourceMappingURL=request.js.map
package/package.json ADDED
@@ -0,0 +1,78 @@
1
+ {
2
+ "name": "@cspell/cspell-service-bus",
3
+ "publishConfig": {
4
+ "access": "public"
5
+ },
6
+ "version": "6.2.4-alpha.0",
7
+ "description": "A Library for connecting requests to services that can fulfill them.",
8
+ "keywords": [
9
+ "cspell"
10
+ ],
11
+ "author": "Jason Dent <jason@streetsidesoftware.nl>",
12
+ "homepage": "https://github.com/streetsidesoftware/cspell/tree/main/packages/cspell-service-bus#readme",
13
+ "license": "MIT",
14
+ "main": "dist/index.js",
15
+ "directories": {
16
+ "dist": "dist"
17
+ },
18
+ "exports": {
19
+ ".": {
20
+ "require": "./dist/index.js"
21
+ },
22
+ "./*": {
23
+ "require": "./dist/*.js"
24
+ },
25
+ "./index": "./dist/index.js",
26
+ "./index.js": "./dist/index.js",
27
+ "./index.d.ts": "./dist/index.d.ts"
28
+ },
29
+ "typings": "dist/index.d.ts",
30
+ "typesVersions": {
31
+ "*": {
32
+ "index.d.ts": [
33
+ "dist/index.d.ts"
34
+ ],
35
+ "dist/index.d.ts": [
36
+ "dist/index.d.ts"
37
+ ],
38
+ "*": [
39
+ "dist/*",
40
+ "dist/*/index.d.ts"
41
+ ]
42
+ }
43
+ },
44
+ "files": [
45
+ "dist",
46
+ "!**/__mocks__",
47
+ "!**/*.spec.*",
48
+ "!**/*.test.*",
49
+ "!**/test/**",
50
+ "!**/*.map"
51
+ ],
52
+ "scripts": {
53
+ "build": "tsc -p .",
54
+ "build-dev": "tsc -p tsconfig.dev.json",
55
+ "watch": "tsc -p . -w",
56
+ "clean": "rimraf dist coverage .tsbuildinfo",
57
+ "clean-build": "npm run clean && npm run build",
58
+ "coverage": "jest --coverage",
59
+ "test-watch": "jest --watch",
60
+ "test": "jest"
61
+ },
62
+ "repository": {
63
+ "type": "git",
64
+ "url": "git+https://github.com/streetsidesoftware/cspell.git"
65
+ },
66
+ "bugs": {
67
+ "url": "https://github.com/streetsidesoftware/cspell/labels/cspell-service-bus"
68
+ },
69
+ "engines": {
70
+ "node": ">=14"
71
+ },
72
+ "devDependencies": {
73
+ "@types/node": "^18.0.3",
74
+ "jest": "^28.1.2",
75
+ "rimraf": "^3.0.2"
76
+ },
77
+ "gitHead": "3509b9fb14722e573713ba1828af6da6088a24e8"
78
+ }