@venok/http 1.0.1-canary.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/adapter/adapter.d.ts +57 -0
- package/adapter/adapter.js +58 -0
- package/adapter/host.d.ts +27 -0
- package/adapter/host.js +33 -0
- package/application/application.d.ts +18 -0
- package/application/application.js +51 -0
- package/application/config.d.ts +16 -0
- package/application/config.js +47 -0
- package/application/http.module-defenition.d.ts +8 -0
- package/application/http.module-defenition.js +6 -0
- package/application/http.module.d.ts +3 -0
- package/application/http.module.js +21 -0
- package/application/http.service.d.ts +11 -0
- package/application/http.service.js +43 -0
- package/application/starter.d.ts +41 -0
- package/application/starter.js +140 -0
- package/constants.d.ts +12 -0
- package/constants.js +15 -0
- package/context/context.d.ts +56 -0
- package/context/context.js +102 -0
- package/context/response.controller.d.ts +30 -0
- package/context/response.controller.js +86 -0
- package/decorators/controller.decorator.d.ts +82 -0
- package/decorators/controller.decorator.js +53 -0
- package/decorators/header.decorator.d.ts +12 -0
- package/decorators/header.decorator.js +23 -0
- package/decorators/http-code.decorator.d.ts +9 -0
- package/decorators/http-code.decorator.js +19 -0
- package/decorators/index.d.ts +9 -0
- package/decorators/index.js +25 -0
- package/decorators/redirect.decorator.d.ts +6 -0
- package/decorators/redirect.decorator.js +16 -0
- package/decorators/render.decorator.d.ts +10 -0
- package/decorators/render.decorator.js +20 -0
- package/decorators/request-mapping.decorator.d.ts +78 -0
- package/decorators/request-mapping.decorator.js +98 -0
- package/decorators/route-params.decorator.d.ts +378 -0
- package/decorators/route-params.decorator.js +227 -0
- package/decorators/sse.decorator.d.ts +6 -0
- package/decorators/sse.decorator.js +20 -0
- package/decorators/version.decorator.d.ts +7 -0
- package/decorators/version.decorator.js +20 -0
- package/enums/http-status.enum.d.ts +53 -0
- package/enums/http-status.enum.js +57 -0
- package/enums/index.d.ts +4 -0
- package/enums/index.js +20 -0
- package/enums/request-method.enum.d.ts +11 -0
- package/enums/request-method.enum.js +15 -0
- package/enums/route-paramtypes.enum.d.ts +14 -0
- package/enums/route-paramtypes.enum.js +18 -0
- package/enums/version-type.enum.d.ts +9 -0
- package/enums/version-type.enum.js +13 -0
- package/errors/bad-gateway.exception.d.ts +33 -0
- package/errors/bad-gateway.exception.js +41 -0
- package/errors/bad-request.exception.d.ts +33 -0
- package/errors/bad-request.exception.js +41 -0
- package/errors/conflict.exception.d.ts +33 -0
- package/errors/conflict.exception.js +41 -0
- package/errors/forbidden.exception.d.ts +33 -0
- package/errors/forbidden.exception.js +41 -0
- package/errors/gateway-timeout.exception.d.ts +33 -0
- package/errors/gateway-timeout.exception.js +41 -0
- package/errors/gone.exception.d.ts +33 -0
- package/errors/gone.exception.js +41 -0
- package/errors/http-version-not-supported.exception.d.ts +33 -0
- package/errors/http-version-not-supported.exception.js +41 -0
- package/errors/http.exception.d.ts +79 -0
- package/errors/http.exception.js +123 -0
- package/errors/im-a-teapot.exception.d.ts +36 -0
- package/errors/im-a-teapot.exception.js +44 -0
- package/errors/index.d.ts +11 -0
- package/errors/index.js +27 -0
- package/errors/internal-server-error.exception.d.ts +33 -0
- package/errors/internal-server-error.exception.js +41 -0
- package/errors/invalid-middleware-configuration.exception.d.ts +4 -0
- package/errors/invalid-middleware-configuration.exception.js +11 -0
- package/errors/invalid-middleware.exception.d.ts +4 -0
- package/errors/invalid-middleware.exception.js +11 -0
- package/errors/not-found.exception.d.ts +33 -0
- package/errors/not-found.exception.js +41 -0
- package/errors/unknown-request-mapping.exception.d.ts +5 -0
- package/errors/unknown-request-mapping.exception.js +11 -0
- package/exceptions/messages.d.ts +4 -0
- package/exceptions/messages.js +13 -0
- package/explorers/path.explorer.d.ts +8 -0
- package/explorers/path.explorer.js +38 -0
- package/explorers/router.explorer.d.ts +51 -0
- package/explorers/router.explorer.js +195 -0
- package/factory/context-id.factory.d.ts +41 -0
- package/factory/context-id.factory.js +52 -0
- package/factory/index.d.ts +4 -0
- package/factory/index.js +20 -0
- package/factory/method.factory.d.ts +5 -0
- package/factory/method.factory.js +30 -0
- package/factory/params.factory.d.ts +5 -0
- package/factory/params.factory.js +39 -0
- package/factory/path.factory.d.ts +13 -0
- package/factory/path.factory.js +95 -0
- package/filters/context.d.ts +9 -0
- package/filters/context.js +15 -0
- package/filters/filter.d.ts +22 -0
- package/filters/filter.js +78 -0
- package/helpers/adapter.helper.d.ts +27 -0
- package/helpers/adapter.helper.js +37 -0
- package/helpers/exclude-route.helper.d.ts +4 -0
- package/helpers/exclude-route.helper.js +18 -0
- package/helpers/flatten-routes.helper.d.ts +5 -0
- package/helpers/flatten-routes.helper.js +27 -0
- package/helpers/index.d.ts +6 -0
- package/helpers/index.js +22 -0
- package/helpers/messages.helper.d.ts +6 -0
- package/helpers/messages.helper.js +25 -0
- package/helpers/path.helper.d.ts +3 -0
- package/helpers/path.helper.js +13 -0
- package/helpers/sse.helper.d.ts +45 -0
- package/helpers/sse.helper.js +83 -0
- package/index.d.ts +1 -0
- package/index.js +3 -0
- package/interfaces/http/cors.interface.d.ts +58 -0
- package/interfaces/http/cors.interface.js +2 -0
- package/interfaces/http/exception.interface.d.ts +6 -0
- package/interfaces/http/exception.interface.js +2 -0
- package/interfaces/http/exclude-route.interface.d.ts +15 -0
- package/interfaces/http/exclude-route.interface.js +2 -0
- package/interfaces/http/index.d.ts +10 -0
- package/interfaces/http/index.js +26 -0
- package/interfaces/http/message-event.interface.d.ts +6 -0
- package/interfaces/http/message-event.interface.js +2 -0
- package/interfaces/http/module.inteface.d.ts +5 -0
- package/interfaces/http/module.inteface.js +2 -0
- package/interfaces/http/options.interface.d.ts +127 -0
- package/interfaces/http/options.interface.js +2 -0
- package/interfaces/http/path-metadata.interface.d.ts +31 -0
- package/interfaces/http/path-metadata.interface.js +2 -0
- package/interfaces/http/prefix-options.interface.d.ts +7 -0
- package/interfaces/http/prefix-options.interface.js +2 -0
- package/interfaces/http/raw-request.d.ts +4 -0
- package/interfaces/http/raw-request.js +2 -0
- package/interfaces/http/routes.interface.d.ts +7 -0
- package/interfaces/http/routes.interface.js +2 -0
- package/interfaces/http/server.interface.d.ts +54 -0
- package/interfaces/http/server.interface.js +2 -0
- package/interfaces/index.d.ts +3 -0
- package/interfaces/index.js +19 -0
- package/interfaces/middleware/config-proxy.interface.d.ts +23 -0
- package/interfaces/middleware/config-proxy.interface.js +2 -0
- package/interfaces/middleware/configuration.interface.d.ts +12 -0
- package/interfaces/middleware/configuration.interface.js +2 -0
- package/interfaces/middleware/consumer.interface.d.ts +16 -0
- package/interfaces/middleware/consumer.interface.js +2 -0
- package/interfaces/middleware/index.d.ts +4 -0
- package/interfaces/middleware/index.js +20 -0
- package/interfaces/middleware/middleware.interface.d.ts +7 -0
- package/interfaces/middleware/middleware.interface.js +2 -0
- package/interfaces/router/callback-paramtypes.interface.d.ts +1 -0
- package/interfaces/router/callback-paramtypes.interface.js +2 -0
- package/interfaces/router/definition.interface.d.ts +10 -0
- package/interfaces/router/definition.interface.js +2 -0
- package/interfaces/router/index.d.ts +3 -0
- package/interfaces/router/index.js +19 -0
- package/interfaces/router/version-options.interface.d.ts +92 -0
- package/interfaces/router/version-options.interface.js +9 -0
- package/middleware/builder.d.ts +15 -0
- package/middleware/builder.js +78 -0
- package/middleware/container.d.ts +13 -0
- package/middleware/container.js +50 -0
- package/middleware/extractor.d.ts +15 -0
- package/middleware/extractor.js +50 -0
- package/middleware/index.d.ts +1 -0
- package/middleware/index.js +17 -0
- package/middleware/module.d.ts +33 -0
- package/middleware/module.js +180 -0
- package/middleware/resolver.d.ts +10 -0
- package/middleware/resolver.js +27 -0
- package/middleware/routes-mapper.d.ts +19 -0
- package/middleware/routes-mapper.js +111 -0
- package/middleware/utils.d.ts +8 -0
- package/middleware/utils.js +86 -0
- package/package.json +41 -0
- package/router/module.d.ts +18 -0
- package/router/module.js +88 -0
- package/router/resolver.d.ts +31 -0
- package/router/resolver.js +128 -0
- package/storage/http-instance.storage.d.ts +9 -0
- package/storage/http-instance.storage.js +19 -0
- package/stream/index.d.ts +1 -0
- package/stream/index.js +17 -0
- package/stream/interfaces/index.d.ts +2 -0
- package/stream/interfaces/index.js +18 -0
- package/stream/interfaces/streamable-handler-response.interface.d.ts +12 -0
- package/stream/interfaces/streamable-handler-response.interface.js +2 -0
- package/stream/interfaces/streamable-options.interface.d.ts +10 -0
- package/stream/interfaces/streamable-options.interface.js +2 -0
- package/stream/streamable-file.d.ts +22 -0
- package/stream/streamable-file.js +55 -0
- package/test/context/response.controller.spec.d.ts +1 -0
- package/test/context/response.controller.spec.js +328 -0
- package/test/decorators/controller.decorator.spec.d.ts +1 -0
- package/test/decorators/controller.decorator.spec.js +113 -0
- package/test/decorators/header.decorator.spec.d.ts +1 -0
- package/test/decorators/header.decorator.spec.js +33 -0
- package/test/decorators/http-code.decorator.spec.d.ts +1 -0
- package/test/decorators/http-code.decorator.spec.js +30 -0
- package/test/decorators/redirect.decorator.spec.d.ts +1 -0
- package/test/decorators/redirect.decorator.spec.js +36 -0
- package/test/decorators/render.decorator.spec.d.ts +1 -0
- package/test/decorators/render.decorator.spec.js +30 -0
- package/test/decorators/request-mapping.decorator.spec.d.ts +1 -0
- package/test/decorators/request-mapping.decorator.spec.js +85 -0
- package/test/decorators/route-params.decorator.spec.d.ts +1 -0
- package/test/decorators/route-params.decorator.spec.js +493 -0
- package/test/decorators/sse.decorator.spec.d.ts +1 -0
- package/test/decorators/sse.decorator.spec.js +35 -0
- package/test/decorators/version.decorator.spec.d.ts +1 -0
- package/test/decorators/version.decorator.spec.js +43 -0
- package/test/exceptions/handler.spec.d.ts +1 -0
- package/test/exceptions/handler.spec.js +145 -0
- package/test/exceptions/proxy.spec.d.ts +1 -0
- package/test/exceptions/proxy.spec.js +74 -0
- package/test/explorers/path.explorer.spec.d.ts +1 -0
- package/test/explorers/path.explorer.spec.js +190 -0
- package/test/explorers/router.explorer.spec.d.ts +1 -0
- package/test/explorers/router.explorer.spec.js +206 -0
- package/test/factory/method.factory.spec.d.ts +1 -0
- package/test/factory/method.factory.spec.js +33 -0
- package/test/factory/params.factory.spec.d.ts +1 -0
- package/test/factory/params.factory.spec.js +104 -0
- package/test/factory/path.factory.spec.d.ts +1 -0
- package/test/factory/path.factory.spec.js +260 -0
- package/test/filters/context.spec.d.ts +1 -0
- package/test/filters/context.spec.js +96 -0
- package/test/filters/filter.spec.d.ts +1 -0
- package/test/filters/filter.spec.js +96 -0
- package/test/helpers/flatten-routes.helper.spec.d.ts +1 -0
- package/test/helpers/flatten-routes.helper.spec.js +131 -0
- package/test/helpers/sse.helper.spec.d.ts +1 -0
- package/test/helpers/sse.helper.spec.js +132 -0
- package/test/middleware/builder.spec.d.ts +1 -0
- package/test/middleware/builder.spec.js +235 -0
- package/test/middleware/container.spec.d.ts +1 -0
- package/test/middleware/container.spec.js +81 -0
- package/test/middleware/module.spec.d.ts +1 -0
- package/test/middleware/module.spec.js +206 -0
- package/test/middleware/route-info-path-extractor.spec.d.ts +1 -0
- package/test/middleware/route-info-path-extractor.spec.js +123 -0
- package/test/middleware/routes-mapper.spec.d.ts +1 -0
- package/test/middleware/routes-mapper.spec.js +162 -0
- package/test/middleware/utils.spec.d.ts +1 -0
- package/test/middleware/utils.spec.js +132 -0
- package/test/router/module.spec.d.ts +1 -0
- package/test/router/module.spec.js +40 -0
- package/test/router/resolver.spec.d.ts +1 -0
- package/test/router/resolver.spec.js +326 -0
- package/tsconfig.tsbuildinfo +1 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RoutePathFactory = void 0;
|
|
4
|
+
const interfaces_1 = require("../interfaces");
|
|
5
|
+
const enums_1 = require("../enums");
|
|
6
|
+
const flatten_helper_1 = require("../../core/helpers/flatten.helper");
|
|
7
|
+
const helpers_1 = require("../helpers");
|
|
8
|
+
const shared_helper_1 = require("../../core/helpers/shared.helper");
|
|
9
|
+
class RoutePathFactory {
|
|
10
|
+
constructor(config) {
|
|
11
|
+
this.config = config;
|
|
12
|
+
}
|
|
13
|
+
create(metadata, requestMethod) {
|
|
14
|
+
let paths = [""];
|
|
15
|
+
const versionOrVersions = this.getVersion(metadata);
|
|
16
|
+
if (versionOrVersions && metadata.versioningOptions?.type === enums_1.VersioningType.URI) {
|
|
17
|
+
const versionPrefix = this.getVersionPrefix(metadata.versioningOptions);
|
|
18
|
+
if (Array.isArray(versionOrVersions)) {
|
|
19
|
+
paths = (0, flatten_helper_1.flatten)(paths.map((path) => versionOrVersions.map((version) =>
|
|
20
|
+
// Version Neutral - Do not include version in URL
|
|
21
|
+
version === interfaces_1.VERSION_NEUTRAL ? path : `${path}/${versionPrefix}${version}`)));
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
// Version Neutral - Do not include version in URL
|
|
25
|
+
if (versionOrVersions !== interfaces_1.VERSION_NEUTRAL) {
|
|
26
|
+
paths = paths.map((path) => `${path}/${versionPrefix}${versionOrVersions}`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
paths = this.appendToAllIfDefined(paths, metadata.modulePath);
|
|
31
|
+
paths = this.appendToAllIfDefined(paths, metadata.ctrlPath);
|
|
32
|
+
paths = this.appendToAllIfDefined(paths, metadata.methodPath);
|
|
33
|
+
if (metadata.globalPrefix) {
|
|
34
|
+
paths = paths.map((path) => {
|
|
35
|
+
if (this.isExcludedFromGlobalPrefix(path, requestMethod, versionOrVersions, metadata.versioningOptions)) {
|
|
36
|
+
return path;
|
|
37
|
+
}
|
|
38
|
+
return (0, helpers_1.stripEndSlash)(metadata.globalPrefix || "") + path;
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
return paths.map((path) => (0, helpers_1.addLeadingSlash)(path || "/")).map((path) => (path !== "/" ? (0, helpers_1.stripEndSlash)(path) : path));
|
|
42
|
+
}
|
|
43
|
+
getVersion(metadata) {
|
|
44
|
+
// The version will be either the path version or the controller version,
|
|
45
|
+
// with the pathVersion taking priority.
|
|
46
|
+
return metadata.methodVersion || metadata.controllerVersion;
|
|
47
|
+
}
|
|
48
|
+
getVersionPrefix(versioningOptions) {
|
|
49
|
+
const defaultPrefix = "v";
|
|
50
|
+
if (versioningOptions.type === enums_1.VersioningType.URI) {
|
|
51
|
+
if (versioningOptions.prefix === false) {
|
|
52
|
+
return "";
|
|
53
|
+
}
|
|
54
|
+
else if (versioningOptions.prefix !== undefined) {
|
|
55
|
+
return versioningOptions.prefix;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return defaultPrefix;
|
|
59
|
+
}
|
|
60
|
+
appendToAllIfDefined(paths, fragmentToAppend) {
|
|
61
|
+
if (!fragmentToAppend) {
|
|
62
|
+
return paths;
|
|
63
|
+
}
|
|
64
|
+
const concatPaths = (a, b) => (0, helpers_1.stripEndSlash)(a) + (0, helpers_1.addLeadingSlash)(b);
|
|
65
|
+
if (Array.isArray(fragmentToAppend)) {
|
|
66
|
+
const paths2dArray = paths.map((path) => fragmentToAppend.map((fragment) => concatPaths(path, fragment)));
|
|
67
|
+
return (0, flatten_helper_1.flatten)(paths2dArray);
|
|
68
|
+
}
|
|
69
|
+
return paths.map((path) => concatPaths(path, fragmentToAppend));
|
|
70
|
+
}
|
|
71
|
+
isExcludedFromGlobalPrefix(path, requestMethod, versionOrVersions, versioningOptions) {
|
|
72
|
+
if ((0, shared_helper_1.isUndefined)(requestMethod)) {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
const options = this.config.getGlobalPrefixOptions();
|
|
76
|
+
const excludedRoutes = options.exclude;
|
|
77
|
+
if (versionOrVersions && versionOrVersions !== interfaces_1.VERSION_NEUTRAL && versioningOptions?.type === enums_1.VersioningType.URI) {
|
|
78
|
+
path = this.truncateVersionPrefixFromPath(path, versionOrVersions, versioningOptions);
|
|
79
|
+
}
|
|
80
|
+
return Array.isArray(excludedRoutes) && (0, helpers_1.isRouteExcluded)(excludedRoutes, path, requestMethod);
|
|
81
|
+
}
|
|
82
|
+
truncateVersionPrefixFromPath(path, versionValue, versioningOptions) {
|
|
83
|
+
if (typeof versionValue !== "string") {
|
|
84
|
+
versionValue.forEach((version) => {
|
|
85
|
+
if (typeof version === "string") {
|
|
86
|
+
path = this.truncateVersionPrefixFromPath(path, version, versioningOptions);
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
return path;
|
|
90
|
+
}
|
|
91
|
+
const prefix = `/${this.getVersionPrefix(versioningOptions)}${versionValue}`;
|
|
92
|
+
return path.startsWith(prefix) ? path.replace(prefix, "") : path;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
exports.RoutePathFactory = RoutePathFactory;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ApplicationConfig, VenokContainer } from "@venok/core";
|
|
2
|
+
import { HttpServer } from "../interfaces";
|
|
3
|
+
import { HttpExceptionFilter } from "./filter";
|
|
4
|
+
import { VenokExceptionFilterContext } from "@venok/core/filters/context";
|
|
5
|
+
export declare class RouterExceptionFiltersContext extends VenokExceptionFilterContext {
|
|
6
|
+
private readonly applicationRef;
|
|
7
|
+
constructor(container: VenokContainer, config: ApplicationConfig, applicationRef: HttpServer);
|
|
8
|
+
getExceptionFilter(): HttpExceptionFilter<any>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RouterExceptionFiltersContext = void 0;
|
|
4
|
+
const filter_1 = require("./filter");
|
|
5
|
+
const context_1 = require("../../core/filters/context");
|
|
6
|
+
class RouterExceptionFiltersContext extends context_1.VenokExceptionFilterContext {
|
|
7
|
+
constructor(container, config, applicationRef) {
|
|
8
|
+
super(container, config);
|
|
9
|
+
this.applicationRef = applicationRef;
|
|
10
|
+
}
|
|
11
|
+
getExceptionFilter() {
|
|
12
|
+
return new filter_1.HttpExceptionFilter(this.applicationRef);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
exports.RouterExceptionFiltersContext = RouterExceptionFiltersContext;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ExceptionFilter } from "@venok/core/interfaces/features/exception-filter.interface";
|
|
2
|
+
import { ArgumentsHost } from "@venok/core/interfaces/context/arguments-host.interface";
|
|
3
|
+
import { HttpServer } from "../interfaces";
|
|
4
|
+
import { HttpAdapterHost } from "../adapter/host";
|
|
5
|
+
import { AbstractHttpAdapter } from "../adapter/adapter";
|
|
6
|
+
export declare class HttpExceptionFilter<T = any> implements ExceptionFilter<T> {
|
|
7
|
+
protected readonly applicationRef?: HttpServer<any, any, any> | undefined;
|
|
8
|
+
private static readonly logger;
|
|
9
|
+
protected readonly httpAdapterHost?: HttpAdapterHost;
|
|
10
|
+
constructor(applicationRef?: HttpServer<any, any, any> | undefined);
|
|
11
|
+
catch(exception: T, host: ArgumentsHost): void;
|
|
12
|
+
handleUnknownError(exception: T, host: ArgumentsHost, applicationRef: AbstractHttpAdapter | HttpServer): void;
|
|
13
|
+
isExceptionObject(err: any): err is Error;
|
|
14
|
+
/**
|
|
15
|
+
* Checks if the thrown error comes from the "http-errors" library.
|
|
16
|
+
* @param err error object
|
|
17
|
+
*/
|
|
18
|
+
isHttpError(err: any): err is {
|
|
19
|
+
statusCode: number;
|
|
20
|
+
message: string;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.HttpExceptionFilter = void 0;
|
|
13
|
+
const logger_service_1 = require("../../core/services/logger.service");
|
|
14
|
+
const core_1 = require("../../core/index.ts");
|
|
15
|
+
const shared_helper_1 = require("../../core/helpers/shared.helper");
|
|
16
|
+
const constants_1 = require("../../core/constants");
|
|
17
|
+
const enums_1 = require("../enums");
|
|
18
|
+
const host_1 = require("../adapter/host");
|
|
19
|
+
const errors_1 = require("../errors");
|
|
20
|
+
class HttpExceptionFilter {
|
|
21
|
+
constructor(applicationRef) {
|
|
22
|
+
this.applicationRef = applicationRef;
|
|
23
|
+
}
|
|
24
|
+
catch(exception, host) {
|
|
25
|
+
const applicationRef = this.applicationRef || (this.httpAdapterHost && this.httpAdapterHost.httpAdapter);
|
|
26
|
+
if (!(exception instanceof errors_1.HttpException)) {
|
|
27
|
+
return this.handleUnknownError(exception, host, applicationRef);
|
|
28
|
+
}
|
|
29
|
+
const res = exception.getResponse();
|
|
30
|
+
const message = (0, shared_helper_1.isObject)(res)
|
|
31
|
+
? res
|
|
32
|
+
: {
|
|
33
|
+
statusCode: exception.getStatus(),
|
|
34
|
+
message: res,
|
|
35
|
+
};
|
|
36
|
+
const response = host.getArgByIndex(1);
|
|
37
|
+
if (!applicationRef.isHeadersSent(response))
|
|
38
|
+
applicationRef.reply(response, message, exception.getStatus());
|
|
39
|
+
else
|
|
40
|
+
applicationRef.end(response);
|
|
41
|
+
}
|
|
42
|
+
handleUnknownError(exception, host, applicationRef) {
|
|
43
|
+
const body = this.isHttpError(exception)
|
|
44
|
+
? {
|
|
45
|
+
statusCode: exception.statusCode,
|
|
46
|
+
message: exception.message,
|
|
47
|
+
}
|
|
48
|
+
: {
|
|
49
|
+
statusCode: enums_1.HttpStatus.INTERNAL_SERVER_ERROR,
|
|
50
|
+
message: constants_1.MESSAGES.UNKNOWN_EXCEPTION_MESSAGE,
|
|
51
|
+
};
|
|
52
|
+
const response = host.getArgByIndex(1);
|
|
53
|
+
if (!applicationRef.isHeadersSent(response))
|
|
54
|
+
applicationRef.reply(response, body, body.statusCode);
|
|
55
|
+
else
|
|
56
|
+
applicationRef.end(response);
|
|
57
|
+
if (this.isExceptionObject(exception))
|
|
58
|
+
return HttpExceptionFilter.logger.error(exception.message, exception.stack);
|
|
59
|
+
return HttpExceptionFilter.logger.error(exception);
|
|
60
|
+
}
|
|
61
|
+
isExceptionObject(err) {
|
|
62
|
+
return (0, shared_helper_1.isObject)(err) && !!err.message;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Checks if the thrown error comes from the "http-errors" library.
|
|
66
|
+
* @param err error object
|
|
67
|
+
*/
|
|
68
|
+
isHttpError(err) {
|
|
69
|
+
return err?.statusCode && err?.message;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
exports.HttpExceptionFilter = HttpExceptionFilter;
|
|
73
|
+
HttpExceptionFilter.logger = new logger_service_1.Logger("ExceptionsHandler");
|
|
74
|
+
__decorate([
|
|
75
|
+
(0, core_1.Optional)(),
|
|
76
|
+
(0, core_1.Inject)(),
|
|
77
|
+
__metadata("design:type", host_1.HttpAdapterHost)
|
|
78
|
+
], HttpExceptionFilter.prototype, "httpAdapterHost", void 0);
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { AbstractHttpAdapter } from "@venok/http/adapter/adapter";
|
|
2
|
+
import { RequestMethod } from "@venok/http/enums";
|
|
3
|
+
import { VersioningOptions, VersionValue } from "../interfaces/router/version-options.interface";
|
|
4
|
+
export declare class NoopHttpAdapter extends AbstractHttpAdapter {
|
|
5
|
+
constructor(instance: any);
|
|
6
|
+
close(): any;
|
|
7
|
+
initHttpServer(options: any): any;
|
|
8
|
+
useStaticAssets(...args: any[]): any;
|
|
9
|
+
setViewEngine(engine: string): any;
|
|
10
|
+
getRequestHostname(request: any): any;
|
|
11
|
+
getRequestMethod(request: any): any;
|
|
12
|
+
getRequestUrl(request: any): any;
|
|
13
|
+
reply(response: any, body: any): any;
|
|
14
|
+
end(response: any, message?: any): any;
|
|
15
|
+
status(response: any, statusCode: number): any;
|
|
16
|
+
render(response: any, view: string, options: any): any;
|
|
17
|
+
redirect(response: any, statusCode: number, url: string): void;
|
|
18
|
+
setErrorHandler(handler: Function, prefix?: string): any;
|
|
19
|
+
setNotFoundHandler(handler: Function, prefix?: string): any;
|
|
20
|
+
isHeadersSent(response: any): any;
|
|
21
|
+
setHeader(response: any, name: string, value: string): any;
|
|
22
|
+
registerParserMiddleware(): any;
|
|
23
|
+
enableCors(options: any): any;
|
|
24
|
+
createMiddlewareFactory(requestMethod: RequestMethod): any;
|
|
25
|
+
getType(): string;
|
|
26
|
+
applyVersionFilter(handler: Function, version: VersionValue, versioningOptions: VersioningOptions): (req: any, res: any, next: any) => () => void;
|
|
27
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NoopHttpAdapter = void 0;
|
|
4
|
+
const adapter_1 = require("@venok/http/adapter/adapter");
|
|
5
|
+
class NoopHttpAdapter extends adapter_1.AbstractHttpAdapter {
|
|
6
|
+
constructor(instance) {
|
|
7
|
+
super(instance);
|
|
8
|
+
}
|
|
9
|
+
close() { }
|
|
10
|
+
initHttpServer(options) { }
|
|
11
|
+
useStaticAssets(...args) { }
|
|
12
|
+
setViewEngine(engine) { }
|
|
13
|
+
getRequestHostname(request) { }
|
|
14
|
+
getRequestMethod(request) { }
|
|
15
|
+
getRequestUrl(request) { }
|
|
16
|
+
reply(response, body) { }
|
|
17
|
+
end(response, message) { }
|
|
18
|
+
status(response, statusCode) { }
|
|
19
|
+
render(response, view, options) { }
|
|
20
|
+
redirect(response, statusCode, url) { }
|
|
21
|
+
setErrorHandler(handler, prefix = "/") { }
|
|
22
|
+
setNotFoundHandler(handler, prefix = "/") { }
|
|
23
|
+
isHeadersSent(response) { }
|
|
24
|
+
setHeader(response, name, value) { }
|
|
25
|
+
registerParserMiddleware() { }
|
|
26
|
+
enableCors(options) { }
|
|
27
|
+
createMiddlewareFactory(requestMethod) { }
|
|
28
|
+
getType() {
|
|
29
|
+
return "";
|
|
30
|
+
}
|
|
31
|
+
applyVersionFilter(handler, version, versioningOptions) {
|
|
32
|
+
return (req, res, next) => {
|
|
33
|
+
return () => { };
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
exports.NoopHttpAdapter = NoopHttpAdapter;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { RequestMethod } from "../enums";
|
|
2
|
+
import { ExcludeRouteMetadata } from "../interfaces/http/exclude-route.interface";
|
|
3
|
+
export declare const isRequestMethodAll: (method: RequestMethod) => boolean;
|
|
4
|
+
export declare function isRouteExcluded(excludedRoutes: ExcludeRouteMetadata[], path: string, requestMethod?: RequestMethod): boolean;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isRouteExcluded = exports.isRequestMethodAll = void 0;
|
|
4
|
+
const enums_1 = require("../enums");
|
|
5
|
+
const path_helper_1 = require("./path.helper");
|
|
6
|
+
const isRequestMethodAll = (method) => {
|
|
7
|
+
return enums_1.RequestMethod.ALL === method || method === -1;
|
|
8
|
+
};
|
|
9
|
+
exports.isRequestMethodAll = isRequestMethodAll;
|
|
10
|
+
function isRouteExcluded(excludedRoutes, path, requestMethod) {
|
|
11
|
+
return excludedRoutes.some((route) => {
|
|
12
|
+
if ((0, exports.isRequestMethodAll)(route.requestMethod) || route.requestMethod === requestMethod) {
|
|
13
|
+
return route.pathRegex.exec((0, path_helper_1.addLeadingSlash)(path));
|
|
14
|
+
}
|
|
15
|
+
return false;
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
exports.isRouteExcluded = isRouteExcluded;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.flattenRoutePaths = void 0;
|
|
4
|
+
const shared_helper_1 = require("../../core/helpers/shared.helper");
|
|
5
|
+
const path_helper_1 = require("./path.helper");
|
|
6
|
+
function flattenRoutePaths(routes) {
|
|
7
|
+
const result = [];
|
|
8
|
+
routes.forEach((item) => {
|
|
9
|
+
if (item.module && item.path) {
|
|
10
|
+
result.push({ module: item.module, path: item.path });
|
|
11
|
+
}
|
|
12
|
+
if (item.children) {
|
|
13
|
+
const childrenRef = item.children;
|
|
14
|
+
childrenRef.forEach((child) => {
|
|
15
|
+
if (!(0, shared_helper_1.isString)(child) && child.path) {
|
|
16
|
+
child.path = (0, path_helper_1.normalizePath)((0, path_helper_1.normalizePath)(item.path) + (0, path_helper_1.normalizePath)(child.path));
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
result.push({ path: item.path, module: child });
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
result.push(...flattenRoutePaths(childrenRef));
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
return result;
|
|
26
|
+
}
|
|
27
|
+
exports.flattenRoutePaths = flattenRoutePaths;
|
package/helpers/index.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./adapter.helper"), exports);
|
|
18
|
+
__exportStar(require("./exclude-route.helper"), exports);
|
|
19
|
+
__exportStar(require("./flatten-routes.helper"), exports);
|
|
20
|
+
__exportStar(require("./messages.helper"), exports);
|
|
21
|
+
__exportStar(require("./path.helper"), exports);
|
|
22
|
+
__exportStar(require("./sse.helper"), exports);
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { VersionValue } from "../interfaces/router/version-options.interface";
|
|
2
|
+
export declare const ROUTE_MAPPED_MESSAGE: (path: string, method: string | number) => string;
|
|
3
|
+
export declare const VERSIONED_ROUTE_MAPPED_MESSAGE: (path: string, method: string | number, version: VersionValue) => string;
|
|
4
|
+
export declare const CONTROLLER_MAPPING_MESSAGE: (name: string, path: string) => string;
|
|
5
|
+
export declare const VERSIONED_CONTROLLER_MAPPING_MESSAGE: (name: string, path: string, version: VersionValue) => string;
|
|
6
|
+
export declare const VENOK_HTTP_SERVER_START: (port: string | number) => string;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VENOK_HTTP_SERVER_START = exports.VERSIONED_CONTROLLER_MAPPING_MESSAGE = exports.CONTROLLER_MAPPING_MESSAGE = exports.VERSIONED_ROUTE_MAPPED_MESSAGE = exports.ROUTE_MAPPED_MESSAGE = void 0;
|
|
4
|
+
const enums_1 = require("../enums");
|
|
5
|
+
const version_options_interface_1 = require("../interfaces/router/version-options.interface");
|
|
6
|
+
const ROUTE_MAPPED_MESSAGE = (path, method) => `Mapped {${path}, ${enums_1.RequestMethod[method]}} route`;
|
|
7
|
+
exports.ROUTE_MAPPED_MESSAGE = ROUTE_MAPPED_MESSAGE;
|
|
8
|
+
const VERSIONED_ROUTE_MAPPED_MESSAGE = (path, method, version) => {
|
|
9
|
+
const controllerVersions = Array.isArray(version) ? version : [version];
|
|
10
|
+
const versions = controllerVersions.map((version) => (version === version_options_interface_1.VERSION_NEUTRAL ? "Neutral" : version)).join(",");
|
|
11
|
+
return `Mapped {${path}, ${enums_1.RequestMethod[method]}} (version: ${versions}) route`;
|
|
12
|
+
};
|
|
13
|
+
exports.VERSIONED_ROUTE_MAPPED_MESSAGE = VERSIONED_ROUTE_MAPPED_MESSAGE;
|
|
14
|
+
const CONTROLLER_MAPPING_MESSAGE = (name, path) => `${name} {${path}}:`;
|
|
15
|
+
exports.CONTROLLER_MAPPING_MESSAGE = CONTROLLER_MAPPING_MESSAGE;
|
|
16
|
+
const VERSIONED_CONTROLLER_MAPPING_MESSAGE = (name, path, version) => {
|
|
17
|
+
const controllerVersions = Array.isArray(version) ? version : [version];
|
|
18
|
+
const versions = controllerVersions.map((version) => (version === version_options_interface_1.VERSION_NEUTRAL ? "Neutral" : version)).join(",");
|
|
19
|
+
return `${name} {${path}} (version: ${versions}):`;
|
|
20
|
+
};
|
|
21
|
+
exports.VERSIONED_CONTROLLER_MAPPING_MESSAGE = VERSIONED_CONTROLLER_MAPPING_MESSAGE;
|
|
22
|
+
const VENOK_HTTP_SERVER_START = (port) => {
|
|
23
|
+
return `Venok start Http server on port: ${port}`;
|
|
24
|
+
};
|
|
25
|
+
exports.VENOK_HTTP_SERVER_START = VENOK_HTTP_SERVER_START;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.stripEndSlash = exports.normalizePath = exports.addLeadingSlash = void 0;
|
|
4
|
+
const addLeadingSlash = (path) => path && typeof path === "string" ? (path.charAt(0) !== "/" ? "/" + path : path) : "";
|
|
5
|
+
exports.addLeadingSlash = addLeadingSlash;
|
|
6
|
+
const normalizePath = (path) => path
|
|
7
|
+
? path.startsWith("/")
|
|
8
|
+
? ("/" + path.replace(/\/+$/, "")).replace(/\/+/g, "/")
|
|
9
|
+
: "/" + path.replace(/\/+$/, "")
|
|
10
|
+
: "/";
|
|
11
|
+
exports.normalizePath = normalizePath;
|
|
12
|
+
const stripEndSlash = (path) => (path[path.length - 1] === "/" ? path.slice(0, path.length - 1) : path);
|
|
13
|
+
exports.stripEndSlash = stripEndSlash;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
/// <reference types="node" />
|
|
4
|
+
import { IncomingMessage, OutgoingHttpHeaders } from "http";
|
|
5
|
+
import { Transform } from "stream";
|
|
6
|
+
import { MessageEvent } from "@venok/http/interfaces/http/message-event.interface";
|
|
7
|
+
export type AdditionalHeaders = Record<string, string[] | string | number | undefined>;
|
|
8
|
+
interface ReadHeaders {
|
|
9
|
+
getHeaders?(): AdditionalHeaders;
|
|
10
|
+
}
|
|
11
|
+
interface WriteHeaders {
|
|
12
|
+
writableEnded?: boolean;
|
|
13
|
+
writeHead?(statusCode: number, reasonPhrase?: string, headers?: OutgoingHttpHeaders): void;
|
|
14
|
+
writeHead?(statusCode: number, headers?: OutgoingHttpHeaders): void;
|
|
15
|
+
flushHeaders?(): void;
|
|
16
|
+
}
|
|
17
|
+
export type WritableHeaderStream = NodeJS.WritableStream & WriteHeaders;
|
|
18
|
+
export type HeaderStream = WritableHeaderStream & ReadHeaders;
|
|
19
|
+
/**
|
|
20
|
+
* Adapted from https://raw.githubusercontent.com/EventSource/node-ssestream
|
|
21
|
+
* Transforms "messages" to W3C event stream content.
|
|
22
|
+
* See https://html.spec.whatwg.org/multipage/server-sent-events.html
|
|
23
|
+
* A message is an object with one or more of the following properties:
|
|
24
|
+
* - data (String or object, which gets turned into JSON)
|
|
25
|
+
* - type
|
|
26
|
+
* - id
|
|
27
|
+
* - retry
|
|
28
|
+
*
|
|
29
|
+
* If constructed with an HTTP Request, it will optimise the socket for streaming.
|
|
30
|
+
* If this stream is piped to an HTTP Response, it will set appropriate headers.
|
|
31
|
+
*/
|
|
32
|
+
export declare class SseStream extends Transform {
|
|
33
|
+
private lastEventId;
|
|
34
|
+
constructor(req?: IncomingMessage);
|
|
35
|
+
pipe<T extends WritableHeaderStream>(destination: T, options?: {
|
|
36
|
+
additionalHeaders?: AdditionalHeaders;
|
|
37
|
+
end?: boolean;
|
|
38
|
+
}): T;
|
|
39
|
+
_transform(message: MessageEvent, encoding: string, callback: (error?: Error | null, data?: any) => void): void;
|
|
40
|
+
/**
|
|
41
|
+
* Calls `.write` but handles the drain if needed
|
|
42
|
+
*/
|
|
43
|
+
writeMessage(message: MessageEvent, cb: (error: Error | null | undefined) => void): void;
|
|
44
|
+
}
|
|
45
|
+
export {};
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SseStream = void 0;
|
|
4
|
+
const stream_1 = require("../../../../../../stream");
|
|
5
|
+
const shared_helper_1 = require("../../core/helpers/shared.helper");
|
|
6
|
+
function toDataString(data) {
|
|
7
|
+
if ((0, shared_helper_1.isObject)(data)) {
|
|
8
|
+
return toDataString(JSON.stringify(data));
|
|
9
|
+
}
|
|
10
|
+
return data
|
|
11
|
+
.split(/\r\n|\r|\n/)
|
|
12
|
+
.map((line) => `data: ${line}\n`)
|
|
13
|
+
.join("");
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Adapted from https://raw.githubusercontent.com/EventSource/node-ssestream
|
|
17
|
+
* Transforms "messages" to W3C event stream content.
|
|
18
|
+
* See https://html.spec.whatwg.org/multipage/server-sent-events.html
|
|
19
|
+
* A message is an object with one or more of the following properties:
|
|
20
|
+
* - data (String or object, which gets turned into JSON)
|
|
21
|
+
* - type
|
|
22
|
+
* - id
|
|
23
|
+
* - retry
|
|
24
|
+
*
|
|
25
|
+
* If constructed with an HTTP Request, it will optimise the socket for streaming.
|
|
26
|
+
* If this stream is piped to an HTTP Response, it will set appropriate headers.
|
|
27
|
+
*/
|
|
28
|
+
class SseStream extends stream_1.Transform {
|
|
29
|
+
constructor(req) {
|
|
30
|
+
super({ objectMode: true });
|
|
31
|
+
this.lastEventId = 0;
|
|
32
|
+
if (req && req.socket) {
|
|
33
|
+
req.socket.setKeepAlive(true);
|
|
34
|
+
req.socket.setNoDelay(true);
|
|
35
|
+
req.socket.setTimeout(0);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
pipe(destination, options) {
|
|
39
|
+
if (destination.writeHead) {
|
|
40
|
+
destination.writeHead(200, {
|
|
41
|
+
...options?.additionalHeaders,
|
|
42
|
+
// See https://github.com/dunglas/mercure/blob/master/hub/subscribe.go#L124-L130
|
|
43
|
+
"Content-Type": "text/event-stream",
|
|
44
|
+
Connection: "keep-alive",
|
|
45
|
+
// Disable cache, even for old browsers and proxies
|
|
46
|
+
"Cache-Control": "private, no-cache, no-store, must-revalidate, max-age=0, no-transform",
|
|
47
|
+
Pragma: "no-cache",
|
|
48
|
+
Expire: "0",
|
|
49
|
+
// NGINX support https://www.nginx.com/resources/wiki/start/topics/examples/x-accel/#x-accel-buffering
|
|
50
|
+
"X-Accel-Buffering": "no",
|
|
51
|
+
});
|
|
52
|
+
if (destination.flushHeaders)
|
|
53
|
+
destination.flushHeaders();
|
|
54
|
+
}
|
|
55
|
+
destination.write("\n");
|
|
56
|
+
return super.pipe(destination, options);
|
|
57
|
+
}
|
|
58
|
+
_transform(message, encoding, callback) {
|
|
59
|
+
let data = message.type ? `event: ${message.type}\n` : "";
|
|
60
|
+
data += message.id ? `id: ${message.id}\n` : "";
|
|
61
|
+
data += message.retry ? `retry: ${message.retry}\n` : "";
|
|
62
|
+
data += message.data ? toDataString(message.data) : "";
|
|
63
|
+
data += "\n";
|
|
64
|
+
this.push(data);
|
|
65
|
+
callback();
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Calls `.write` but handles the drain if needed
|
|
69
|
+
*/
|
|
70
|
+
writeMessage(message, cb) {
|
|
71
|
+
if (!message.id) {
|
|
72
|
+
this.lastEventId++;
|
|
73
|
+
message.id = this.lastEventId.toString();
|
|
74
|
+
}
|
|
75
|
+
if (!this.write(message, "utf-8", cb)) {
|
|
76
|
+
this.once("drain", cb);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
process.nextTick(cb);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
exports.SseStream = SseStream;
|
package/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import "reflect-metadata";
|
package/index.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
type StaticOrigin = boolean | string | RegExp | (string | RegExp)[];
|
|
2
|
+
/**
|
|
3
|
+
* Set origin to a function implementing some custom logic. The function takes the
|
|
4
|
+
* request origin as the first parameter and a callback (which expects the signature
|
|
5
|
+
* err [object], allow [bool]) as the second.
|
|
6
|
+
*
|
|
7
|
+
* @see https://github.com/expressjs/cors
|
|
8
|
+
*
|
|
9
|
+
* @publicApi
|
|
10
|
+
*/
|
|
11
|
+
export type CustomOrigin = (requestOrigin: string, callback: (err: Error | null, origin?: StaticOrigin) => void) => void;
|
|
12
|
+
/**
|
|
13
|
+
* Interface describing CORS options that can be set.
|
|
14
|
+
*
|
|
15
|
+
* @see https://github.com/expressjs/cors
|
|
16
|
+
* @publicApi
|
|
17
|
+
*/
|
|
18
|
+
export interface CorsOptions {
|
|
19
|
+
/**
|
|
20
|
+
* Configures the `Access-Control-Allow-Origins` CORS header. See [here for more detail.](https://github.com/expressjs/cors#configuration-options)
|
|
21
|
+
*/
|
|
22
|
+
origin?: StaticOrigin | CustomOrigin;
|
|
23
|
+
/**
|
|
24
|
+
* Configures the Access-Control-Allow-Methods CORS header.
|
|
25
|
+
*/
|
|
26
|
+
methods?: string | string[];
|
|
27
|
+
/**
|
|
28
|
+
* Configures the Access-Control-Allow-Headers CORS header.
|
|
29
|
+
*/
|
|
30
|
+
allowedHeaders?: string | string[];
|
|
31
|
+
/**
|
|
32
|
+
* Configures the Access-Control-Expose-Headers CORS header.
|
|
33
|
+
*/
|
|
34
|
+
exposedHeaders?: string | string[];
|
|
35
|
+
/**
|
|
36
|
+
* Configures the Access-Control-Allow-Credentials CORS header.
|
|
37
|
+
*/
|
|
38
|
+
credentials?: boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Configures the Access-Control-Max-Age CORS header.
|
|
41
|
+
*/
|
|
42
|
+
maxAge?: number;
|
|
43
|
+
/**
|
|
44
|
+
* Whether to pass the CORS preflight response to the next handler.
|
|
45
|
+
*/
|
|
46
|
+
preflightContinue?: boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Provides a status code to use for successful OPTIONS requests.
|
|
49
|
+
*/
|
|
50
|
+
optionsSuccessStatus?: number;
|
|
51
|
+
}
|
|
52
|
+
export interface CorsOptionsCallback {
|
|
53
|
+
s(error: Error, options: CorsOptions): void;
|
|
54
|
+
}
|
|
55
|
+
export interface CorsOptionsDelegate<T> {
|
|
56
|
+
(req: T, cb: CorsOptionsCallback): void;
|
|
57
|
+
}
|
|
58
|
+
export {};
|