@entity-access/server-pages 1.0.6 → 1.0.7

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.
Files changed (74) hide show
  1. package/dist/ClusterInstance.d.ts +25 -0
  2. package/dist/ClusterInstance.d.ts.map +1 -0
  3. package/dist/ClusterInstance.js +87 -0
  4. package/dist/ClusterInstance.js.map +1 -0
  5. package/dist/Content.d.ts +46 -0
  6. package/dist/Content.d.ts.map +1 -0
  7. package/dist/Content.js +135 -0
  8. package/dist/Content.js.map +1 -0
  9. package/dist/Invokable.d.ts +11 -0
  10. package/dist/Invokable.d.ts.map +1 -0
  11. package/dist/Invokable.js +51 -0
  12. package/dist/Invokable.js.map +1 -0
  13. package/dist/NotFoundPage.d.ts +6 -0
  14. package/dist/NotFoundPage.d.ts.map +1 -0
  15. package/dist/NotFoundPage.js +7 -0
  16. package/dist/NotFoundPage.js.map +1 -0
  17. package/dist/Page.d.ts +91 -0
  18. package/dist/Page.d.ts.map +1 -0
  19. package/dist/Page.js +97 -0
  20. package/dist/Page.js.map +1 -0
  21. package/dist/ServerPages.d.ts +19 -0
  22. package/dist/ServerPages.d.ts.map +1 -0
  23. package/dist/ServerPages.js +172 -0
  24. package/dist/ServerPages.js.map +1 -0
  25. package/dist/core/LocalFile.d.ts +23 -0
  26. package/dist/core/LocalFile.d.ts.map +1 -0
  27. package/dist/core/LocalFile.js +76 -0
  28. package/dist/core/LocalFile.js.map +1 -0
  29. package/dist/core/RouteTree.d.ts +24 -0
  30. package/dist/core/RouteTree.d.ts.map +1 -0
  31. package/dist/core/RouteTree.js +94 -0
  32. package/dist/core/RouteTree.js.map +1 -0
  33. package/dist/core/SessionUser.d.ts +42 -0
  34. package/dist/core/SessionUser.d.ts.map +1 -0
  35. package/dist/core/SessionUser.js +62 -0
  36. package/dist/core/SessionUser.js.map +1 -0
  37. package/dist/core/TempFolder.d.ts +8 -0
  38. package/dist/core/TempFolder.d.ts.map +1 -0
  39. package/dist/core/TempFolder.js +35 -0
  40. package/dist/core/TempFolder.js.map +1 -0
  41. package/dist/html/HtmlDocument.d.ts +5 -0
  42. package/dist/html/HtmlDocument.d.ts.map +1 -0
  43. package/dist/html/HtmlDocument.js +5 -0
  44. package/dist/html/HtmlDocument.js.map +1 -0
  45. package/dist/html/XNode.d.ts +9 -0
  46. package/dist/html/XNode.d.ts.map +1 -0
  47. package/dist/html/XNode.js +45 -0
  48. package/dist/html/XNode.js.map +1 -0
  49. package/dist/services/CookieService.d.ts +13 -0
  50. package/dist/services/CookieService.d.ts.map +1 -0
  51. package/dist/services/CookieService.js +136 -0
  52. package/dist/services/CookieService.js.map +1 -0
  53. package/dist/services/KeyProvider.d.ts +13 -0
  54. package/dist/services/KeyProvider.d.ts.map +1 -0
  55. package/dist/services/KeyProvider.js +59 -0
  56. package/dist/services/KeyProvider.js.map +1 -0
  57. package/dist/services/TokenService.d.ts +30 -0
  58. package/dist/services/TokenService.d.ts.map +1 -0
  59. package/dist/services/TokenService.js +65 -0
  60. package/dist/services/TokenService.js.map +1 -0
  61. package/dist/services/UserSessionProvider.d.ts +5 -0
  62. package/dist/services/UserSessionProvider.d.ts.map +1 -0
  63. package/dist/services/UserSessionProvider.js +19 -0
  64. package/dist/services/UserSessionProvider.js.map +1 -0
  65. package/dist/tests/logger/api/log/post.d.ts +3 -0
  66. package/dist/tests/logger/api/log/post.d.ts.map +1 -0
  67. package/dist/tests/logger/api/log/post.js +5 -0
  68. package/dist/tests/logger/api/log/post.js.map +1 -0
  69. package/dist/tests/logger/index.d.ts +4 -0
  70. package/dist/tests/logger/index.d.ts.map +1 -0
  71. package/dist/tests/logger/index.js +14 -0
  72. package/dist/tests/logger/index.js.map +1 -0
  73. package/dist/tsconfig.tsbuildinfo +1 -0
  74. package/package.json +1 -1
@@ -0,0 +1,25 @@
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ import { Worker } from "cluster";
3
+ import { Invokable } from "./Invokable.js";
4
+ export declare class RecycledWorker<T = any> {
5
+ get worker(): Worker;
6
+ private currentWorker;
7
+ private destroyed;
8
+ private eventMap;
9
+ constructor(env?: any);
10
+ on(msg: string, handler: any): void;
11
+ send(a: any): void;
12
+ destroy(): void;
13
+ }
14
+ export default abstract class ClusterInstance<T> extends Invokable {
15
+ protected isPrimary: boolean;
16
+ protected readonly workers: RecycledWorker[];
17
+ run(arg: T): void;
18
+ protected abstract runPrimary(arg: T): Promise<void>;
19
+ protected abstract runWorker(arg: T): Promise<void>;
20
+ protected fork(env?: any): RecycledWorker<any>;
21
+ protected setupPrimary(arg: T): Promise<void>;
22
+ protected setupWorker(arg: T): Promise<void>;
23
+ protected invoke(invoke: string, ...args: any[]): Promise<any>;
24
+ }
25
+ //# sourceMappingURL=ClusterInstance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClusterInstance.d.ts","sourceRoot":"","sources":["../src/ClusterInstance.ts"],"names":[],"mappings":";AACA,OAAgB,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAgB,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEzD,qBAAa,cAAc,CAAC,CAAC,GAAG,GAAG;IAE/B,IAAW,MAAM,WAEhB;IAED,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,SAAS,CAAU;IAE3B,OAAO,CAAC,QAAQ,CAA8B;gBAElC,GAAG,CAAC,KAAA;IAaT,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,KAAA;IAQvB,IAAI,CAAC,CAAC,KAAA;IAON,OAAO;CAMjB;AAED,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,eAAe,CAAC,CAAC,CAAE,SAAQ,SAAS;IAE9D,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC;IAE7B,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,cAAc,EAAE,CAAM;IAE3C,GAAG,CAAC,GAAG,EAAE,CAAC;IAWjB,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IACpD,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAEnD,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,KAAA;cAOH,YAAY,CAAC,GAAG,EAAE,CAAC;cAQnB,WAAW,CAAC,GAAG,EAAE,CAAC;IAalC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;CAMjE"}
@@ -0,0 +1,87 @@
1
+ /* eslint-disable no-console */
2
+ import cluster from "cluster";
3
+ import { Invokable } from "./Invokable.js";
4
+ export class RecycledWorker {
5
+ get worker() {
6
+ return this.currentWorker;
7
+ }
8
+ constructor(env) {
9
+ this.eventMap = new Map();
10
+ this.currentWorker = cluster.fork(env);
11
+ this.currentWorker.on("exit", () => {
12
+ if (this.destroyed) {
13
+ return;
14
+ }
15
+ this.currentWorker = cluster.fork(env);
16
+ for (const [msg, handler] of this.eventMap) {
17
+ this.currentWorker.on(msg, handler);
18
+ }
19
+ });
20
+ }
21
+ on(msg, handler) {
22
+ this.eventMap.set(msg, handler);
23
+ if (this.destroyed) {
24
+ return;
25
+ }
26
+ this.currentWorker.on(msg, handler);
27
+ }
28
+ send(a) {
29
+ if (this.destroyed) {
30
+ return;
31
+ }
32
+ this.currentWorker.send(a);
33
+ }
34
+ destroy() {
35
+ this.destroyed = true;
36
+ this.currentWorker = null;
37
+ this.currentWorker.destroy();
38
+ }
39
+ }
40
+ export default class ClusterInstance extends Invokable {
41
+ constructor() {
42
+ super(...arguments);
43
+ this.workers = [];
44
+ }
45
+ run(arg) {
46
+ this.isPrimary = cluster.isPrimary;
47
+ if (cluster.isPrimary) {
48
+ console.log(`Initializing Primary Cluster`);
49
+ this.setupPrimary(arg).catch(console.error);
50
+ }
51
+ else {
52
+ this.setupWorker(arg).catch(console.error);
53
+ console.log(`Initializing Cluster Worker`);
54
+ }
55
+ }
56
+ fork(env) {
57
+ const worker = new RecycledWorker(env);
58
+ this.install(worker);
59
+ this.workers.push(worker);
60
+ return worker;
61
+ }
62
+ async setupPrimary(arg) {
63
+ try {
64
+ await this.runPrimary(arg);
65
+ }
66
+ catch (error) {
67
+ console.error(error);
68
+ }
69
+ }
70
+ async setupWorker(arg) {
71
+ try {
72
+ this.install(process);
73
+ await this.runWorker(arg);
74
+ process.send({ cmd: "ready" });
75
+ }
76
+ catch (error) {
77
+ console.error(error);
78
+ }
79
+ }
80
+ invoke(invoke, ...args) {
81
+ if (!this.isPrimary) {
82
+ return Invokable.invoke(this, process, invoke, args);
83
+ }
84
+ return Promise.all(this.workers.map((worker) => Invokable.invoke(this, worker, invoke, args)));
85
+ }
86
+ }
87
+ //# sourceMappingURL=ClusterInstance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClusterInstance.js","sourceRoot":"","sources":["../src/ClusterInstance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ import { Response } from "express";
3
+ import XNode from "./html/XNode.js";
4
+ import { LocalFile } from "./core/LocalFile.js";
5
+ import SessionUser from "./core/SessionUser.js";
6
+ export interface IPageResult {
7
+ send(res: Response): Promise<any>;
8
+ }
9
+ export declare class TempFileResult implements IPageResult {
10
+ private file;
11
+ contentDisposition: "inline" | "attachment";
12
+ cacheControl: boolean;
13
+ maxAge: number;
14
+ etag: boolean;
15
+ immutable: boolean;
16
+ constructor(file: LocalFile, { contentDisposition, cacheControl, maxAge, etag, immutable }?: Partial<TempFileResult>);
17
+ send(res: Response<any, Record<string, any>>): Promise<void>;
18
+ }
19
+ export declare class FileResult implements IPageResult {
20
+ private filePath;
21
+ contentDisposition: "inline" | "attachment";
22
+ cacheControl: boolean;
23
+ maxAge: number;
24
+ etag: boolean;
25
+ immutable: boolean;
26
+ private fileName;
27
+ constructor(filePath: string, { contentDisposition, cacheControl, maxAge, etag, immutable }?: Partial<FileResult>);
28
+ send(res: Response<any, Record<string, any>>): Promise<void>;
29
+ }
30
+ export declare class Redirect implements IPageResult {
31
+ location: string;
32
+ status: number;
33
+ constructor(location: string, status?: number);
34
+ send(res: Response): Promise<void>;
35
+ }
36
+ export default class Content implements IPageResult {
37
+ static json(json: any, status?: number): Content;
38
+ static html(html: any, status?: number): Content;
39
+ static create(body: Partial<Content>): Content;
40
+ status: number;
41
+ contentType: string;
42
+ body: string | Buffer | Blob | XNode;
43
+ private constructor();
44
+ send(res: Response, user?: SessionUser): Promise<void>;
45
+ }
46
+ //# sourceMappingURL=Content.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Content.d.ts","sourceRoot":"","sources":["../src/Content.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,KAAK,MAAM,iBAAiB,CAAC;AAEpC,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,WAAW,MAAM,uBAAuB,CAAC;AAEhD,MAAM,WAAW,WAAW;IACxB,IAAI,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;CACrC;AAED,qBAAa,cAAe,YAAW,WAAW;IAQ1C,OAAO,CAAC,IAAI;IANT,kBAAkB,EAAE,QAAQ,GAAG,YAAY,CAAY;IACvD,YAAY,UAAQ;IACpB,MAAM,SAAW;IACjB,IAAI,UAAS;IACb,SAAS,UAAS;gBAEb,IAAI,EAAE,SAAS,EACvB,EACI,kBAA6B,EAC7B,YAAmB,EACnB,MAAgB,EAChB,IAAY,EACZ,SAAiB,EACpB,GAAE,OAAO,CAAC,cAAc,CAAM;IASnC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAuB/C;AAED,qBAAa,UAAW,YAAW,WAAW;IAStC,OAAO,CAAC,QAAQ;IAPb,kBAAkB,EAAE,QAAQ,GAAG,YAAY,CAAY;IACvD,YAAY,UAAQ;IACpB,MAAM,SAAW;IACjB,IAAI,UAAS;IACb,SAAS,UAAS;IACzB,OAAO,CAAC,QAAQ,CAAC;gBAEL,QAAQ,EAAE,MAAM,EACxB,EACI,kBAA6B,EAC7B,YAAmB,EACnB,MAAgB,EAChB,IAAY,EACZ,SAAiB,EACpB,GAAE,OAAO,CAAC,UAAU,CAAM;IAW/B,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAmB/C;AAED,qBAAa,QAAS,YAAW,WAAW;IAErB,QAAQ,EAAE,MAAM;IAAS,MAAM;gBAA/B,QAAQ,EAAE,MAAM,EAAS,MAAM,SAAM;IAIlD,IAAI,CAAC,GAAG,EAAE,QAAQ;CAI3B;AAED,MAAM,CAAC,OAAO,OAAO,OAAQ,YAAW,WAAW;WAEjC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,SAAM;WAQ5B,IAAI,CAAC,IAAI,KAAA,EAAE,MAAM,SAAM;WAQvB,MAAM,CAChB,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC;IAMnB,MAAM,EAAE,MAAM,CAAC;IAEf,WAAW,EAAE,MAAM,CAAC;IAEpB,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,KAAK,CAAC;IAE5C,OAAO;IAOM,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,WAAW;CA2BtD"}
@@ -0,0 +1,135 @@
1
+ import XNode from "./html/XNode.js";
2
+ import { parse } from "path";
3
+ export class TempFileResult {
4
+ constructor(file, { contentDisposition = "inline", cacheControl = true, maxAge = 2592000, etag = false, immutable = false } = {}) {
5
+ this.file = file;
6
+ this.contentDisposition = "inline";
7
+ this.cacheControl = true;
8
+ this.maxAge = 2592000;
9
+ this.etag = false;
10
+ this.immutable = false;
11
+ this.contentDisposition = contentDisposition;
12
+ this.cacheControl = cacheControl;
13
+ this.maxAge = maxAge;
14
+ this.etag = etag;
15
+ this.immutable = immutable;
16
+ }
17
+ send(res) {
18
+ return new Promise((resolve, reject) => {
19
+ res = res.header("content-disposition", `${this.contentDisposition};filename=${encodeURIComponent(this.file.fileName)}`);
20
+ res.sendFile(this.file.path, {
21
+ headers: {
22
+ "content-type": this.file.contentType
23
+ },
24
+ acceptRanges: true,
25
+ cacheControl: this.cacheControl,
26
+ maxAge: this.maxAge,
27
+ etag: this.etag,
28
+ immutable: this.immutable,
29
+ lastModified: false
30
+ }, (error) => {
31
+ if (error) {
32
+ reject(error);
33
+ return;
34
+ }
35
+ resolve();
36
+ });
37
+ });
38
+ }
39
+ }
40
+ export class FileResult {
41
+ constructor(filePath, { contentDisposition = "inline", cacheControl = true, maxAge = 2592000, etag = false, immutable = false } = {}) {
42
+ this.filePath = filePath;
43
+ this.contentDisposition = "inline";
44
+ this.cacheControl = true;
45
+ this.maxAge = 2592000;
46
+ this.etag = false;
47
+ this.immutable = false;
48
+ this.contentDisposition = contentDisposition;
49
+ this.cacheControl = cacheControl;
50
+ this.maxAge = maxAge;
51
+ this.etag = etag;
52
+ this.immutable = immutable;
53
+ const parsed = parse(filePath);
54
+ this.fileName = parsed.base;
55
+ }
56
+ send(res) {
57
+ return new Promise((resolve, reject) => {
58
+ res = res.header("content-disposition", `${this.contentDisposition};filename=${encodeURIComponent(this.fileName)}`);
59
+ res.sendFile(this.filePath, {
60
+ acceptRanges: true,
61
+ cacheControl: this.cacheControl,
62
+ maxAge: this.maxAge,
63
+ etag: this.etag,
64
+ immutable: this.immutable
65
+ }, (error) => {
66
+ if (error) {
67
+ reject(error);
68
+ return;
69
+ }
70
+ resolve();
71
+ });
72
+ });
73
+ }
74
+ }
75
+ export class Redirect {
76
+ constructor(location, status = 301) {
77
+ this.location = location;
78
+ this.status = status;
79
+ }
80
+ async send(res) {
81
+ res.redirect(this.status, this.location);
82
+ }
83
+ }
84
+ export default class Content {
85
+ static json(json, status = 200) {
86
+ return new Content({
87
+ body: JSON.stringify(json),
88
+ contentType: "application/json",
89
+ status
90
+ });
91
+ }
92
+ static html(html, status = 200) {
93
+ return new Content({
94
+ body: html,
95
+ contentType: "text/html",
96
+ status
97
+ });
98
+ }
99
+ static create(body) {
100
+ return new Content(body);
101
+ }
102
+ constructor(p) {
103
+ Object.setPrototypeOf(p, Content.prototype);
104
+ p.contentType ??= "text/plain";
105
+ p.status ??= 200;
106
+ return p;
107
+ }
108
+ async send(res, user) {
109
+ const { status, body, contentType } = this;
110
+ const r = res.setHeader("content-type", contentType)
111
+ .status(status);
112
+ if (typeof body === "string") {
113
+ if (status >= 300) {
114
+ const u = user ? `User: ${user.userID},${user.userName}` : "User: Anonymous";
115
+ console.error(`${res.req.method} ${res.req.url}\n${status}\n${u}\n${body}`);
116
+ }
117
+ res.send(body);
118
+ return;
119
+ }
120
+ if (body instanceof XNode) {
121
+ const text = body.render();
122
+ if (status >= 300) {
123
+ console.error(`${res.req.method} ${res.req.url}\n${status}\n${text}`);
124
+ }
125
+ res.send(text);
126
+ return;
127
+ }
128
+ if (status >= 300) {
129
+ console.error(`${res.req.method} ${res.req.url}\n${status}\nBINARY DATA`);
130
+ }
131
+ res.send(body);
132
+ return;
133
+ }
134
+ }
135
+ //# sourceMappingURL=Content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Content.js","sourceRoot":"","sources":["../src/Content.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export interface IProcessLike {
2
+ on(key: "message", fx: (data: any) => any): any;
3
+ send?(data: any): any;
4
+ postMessage?(data: any): any;
5
+ }
6
+ export declare class Invokable {
7
+ protected static invoke<T = any>(caller: Invokable, process: IProcessLike, invoke: string, ...args: any[]): Promise<T>;
8
+ private promiseMap;
9
+ protected install(process: IProcessLike): void;
10
+ }
11
+ //# sourceMappingURL=Invokable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Invokable.d.ts","sourceRoot":"","sources":["../src/Invokable.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,YAAY;IACzB,EAAE,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,GAAG,OAAE;IAC3C,IAAI,CAAC,CAAC,IAAI,KAAA,OAAE;IACZ,WAAW,CAAC,CAAC,IAAI,KAAA,OAAE;CACtB;AAMD,qBAAa,SAAS;IAElB,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,GAAI,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC;IASvH,OAAO,CAAC,UAAU,CAA8C;IAEhE,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,YAAY;CA8C1C"}
@@ -0,0 +1,51 @@
1
+ const defaultResult = null;
2
+ let newId = 1;
3
+ export class Invokable {
4
+ constructor() {
5
+ this.promiseMap = new Map();
6
+ }
7
+ static invoke(caller, process, invoke, ...args) {
8
+ const id = newId++;
9
+ return new Promise((resolve, reject) => {
10
+ caller.promiseMap.set(id, { resolve, reject });
11
+ const send = process.send ?? process.postMessage;
12
+ send.call(process, { id, invoke, args });
13
+ });
14
+ }
15
+ install(process) {
16
+ process.on("message", ({ id, invoke, args = [], result: resultReceived, error: errorReceived }) => {
17
+ const send = process.send ?? process.postMessage;
18
+ if (!invoke) {
19
+ if (typeof resultReceived !== "undefined") {
20
+ const p = this.promiseMap.get(id);
21
+ if (p) {
22
+ this.promiseMap.delete(id);
23
+ p.resolve(resultReceived);
24
+ }
25
+ return;
26
+ }
27
+ if (errorReceived) {
28
+ const p = this.promiseMap.get(id);
29
+ if (p) {
30
+ this.promiseMap.delete(id);
31
+ p.reject(errorReceived);
32
+ }
33
+ }
34
+ return;
35
+ }
36
+ try {
37
+ const r = this[invoke](...args) ?? defaultResult;
38
+ if (r.then) {
39
+ r.then((result = defaultResult) => send.call(process, { id, result }), (error) => send.call(process, { id, error }));
40
+ }
41
+ else {
42
+ send.call(process, { id, result: r });
43
+ }
44
+ }
45
+ catch (error) {
46
+ send.call(process, { id, error });
47
+ }
48
+ });
49
+ }
50
+ }
51
+ //# sourceMappingURL=Invokable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Invokable.js","sourceRoot":"","sources":["../src/Invokable.ts"],"names":[],"mappings":"AAOA,MAAM,aAAa,GAAG,IAAI,CAAC;AAE3B,IAAI,KAAK,GAAG,CAAC,CAAC;AAEd,MAAM,OAAO,SAAS;IAAtB;QAWY,eAAU,GAAoC,IAAI,GAAG,EAAE,CAAC;IAgDpE,CAAC;IAzDa,MAAM,CAAC,MAAM,CAAU,MAAiB,EAAE,OAAqB,EAAE,MAAc,EAAE,GAAI,IAAW;QACtG,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QACnB,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACtC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAC,CAAC,CAAC;YAC9C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,WAAW,CAAC;YACjD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACP,CAAC;IAIS,OAAO,CAAC,OAAqB;QACnC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,EACnB,EAAE,EACF,MAAM,EACN,IAAI,GAAG,EAAE,EACT,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,aAAa,EACvB,EAAE,EAAE;YAED,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,WAAW,CAAC;YAEjD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACV,IAAI,OAAO,cAAc,KAAK,WAAW,EAAE,CAAC;oBACxC,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAClC,IAAI,CAAC,EAAE,CAAC;wBACJ,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;wBAC3B,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;oBAC9B,CAAC;oBACD,OAAO;gBACX,CAAC;gBACD,IAAI,aAAa,EAAE,CAAC;oBAChB,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAClC,IAAI,CAAC,EAAE,CAAC;wBACJ,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;wBAC3B,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;oBAC5B,CAAC;gBACL,CAAC;gBACD,OAAO;YACX,CAAC;YACD,IAAI,CAAC;gBACD,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAI,IAAI,CAAC,IAAI,aAAa,CAAC;gBAClD,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;oBACT,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,aAAa,EAAE,EAAE,CAC9B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EACpC,CAAC,KAAK,EAAE,EAAE,CACR,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CACpC,CAAC;gBACN,CAAC;qBAAM,CAAC;oBACJ,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;gBAC1C,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YACtC,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;CAEJ"}
@@ -0,0 +1,6 @@
1
+ import Content from "./Content.js";
2
+ import Page from "./Page.js";
3
+ export default class NotFoundPage extends Page {
4
+ all(params: any): Content | Promise<Content>;
5
+ }
6
+ //# sourceMappingURL=NotFoundPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NotFoundPage.d.ts","sourceRoot":"","sources":["../src/NotFoundPage.tsx"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,IAAI;IAE1C,GAAG,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;CAI/C"}
@@ -0,0 +1,7 @@
1
+ import Page from "./Page.js";
2
+ export default class NotFoundPage extends Page {
3
+ all(params) {
4
+ return this.notFound();
5
+ }
6
+ }
7
+ //# sourceMappingURL=NotFoundPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NotFoundPage.js","sourceRoot":"","sources":["../src/NotFoundPage.tsx"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,IAAI;IAE1C,GAAG,CAAC,MAAW;QACX,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;IAC3B,CAAC;CAEJ"}
package/dist/Page.d.ts ADDED
@@ -0,0 +1,91 @@
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ import Content, { IPageResult, Redirect } from "./Content.js";
3
+ import { LocalFile } from "./core/LocalFile.js";
4
+ import SessionUser from "./core/SessionUser.js";
5
+ export declare const isPage: unique symbol;
6
+ export interface IRouteCheck {
7
+ method: string;
8
+ current: string;
9
+ path: string[];
10
+ sessionUser: SessionUser;
11
+ params: any;
12
+ }
13
+ export interface IPageContext {
14
+ /**
15
+ * path till the current folder where this page is located, including the name of current folder itself.
16
+ */
17
+ currentPath: string[];
18
+ /**
19
+ * Path to the next children to be precessed.
20
+ */
21
+ childPath: string[];
22
+ /**
23
+ * Query string if associated, empty object is always present.
24
+ */
25
+ query: any;
26
+ body: any;
27
+ url: string;
28
+ signal: AbortSignal;
29
+ /**
30
+ * Request
31
+ */
32
+ /**
33
+ * Response
34
+ */
35
+ /**
36
+ * Request method
37
+ */
38
+ method: string;
39
+ /**
40
+ * Currently logged in user
41
+ */
42
+ sessionUser: SessionUser;
43
+ /**
44
+ * Actual file path of the page
45
+ */
46
+ filePath: string;
47
+ disposables: Disposable[];
48
+ }
49
+ export interface IFormData {
50
+ fields: {
51
+ [key: string]: string;
52
+ };
53
+ files: LocalFile[];
54
+ }
55
+ /**
56
+ * Page should not contain any reference to underlying request/response objects.
57
+ */
58
+ export default class Page implements IPageContext {
59
+ static [isPage]: boolean;
60
+ /**
61
+ * This static method determines if the path can be handled by this page or not.
62
+ * @param pageContext page related items
63
+ * @returns true if it can handle the path, default is true
64
+ */
65
+ static canHandle(pageContext: IRouteCheck): boolean;
66
+ signal: AbortSignal;
67
+ currentPath: string[];
68
+ childPath: string[];
69
+ /**
70
+ * List of all paths that were tried before executing this page.
71
+ */
72
+ notFoundPath: string[];
73
+ query: any;
74
+ body: any;
75
+ url: string;
76
+ method: string;
77
+ sessionUser: SessionUser;
78
+ filePath: string;
79
+ cacheControl: string;
80
+ disposables: Disposable[];
81
+ private formDataPromise;
82
+ constructor();
83
+ all(params: any): IPageResult | Promise<IPageResult>;
84
+ readFormData(): Promise<IFormData>;
85
+ protected content(body: string, status?: number, contentType?: string): Content;
86
+ protected json(o: any, indent?: number): Content;
87
+ protected redirect(location: string): Redirect;
88
+ protected notFound(): Content | Promise<Content>;
89
+ protected serverError(error: any, status?: number): Content | Promise<Content>;
90
+ }
91
+ //# sourceMappingURL=Page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Page.d.ts","sourceRoot":"","sources":["../src/Page.tsx"],"names":[],"mappings":";AAGA,OAAO,OAAO,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAG9D,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,OAAO,WAAW,MAAM,uBAAuB,CAAC;AAEhD,eAAO,MAAM,MAAM,eAAmB,CAAC;AAGvC,MAAM,WAAW,WAAW;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,EAAE,GAAG,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IACzB;;OAEG;IACH,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB;;OAEG;IACH,SAAS,EAAE,MAAM,EAAE,CAAC;IAOpB;;OAEG;IACH,KAAK,EAAE,GAAG,CAAC;IAEX,IAAI,EAAE,GAAG,CAAC;IAEV,GAAG,EAAE,MAAM,CAAC;IAEZ,MAAM,EAAC,WAAW,CAAC;IACnB;;OAEG;IAEH;;OAEG;IAGH;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,WAAW,EAAE,WAAW,CAAC;IAEzB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB,WAAW,EAAE,UAAU,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,SAAS;IACtB,MAAM,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAC,CAAC;IACjC,KAAK,EAAE,SAAS,EAAE,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,IAAK,YAAW,YAAY;IAE7C,MAAM,CAAC,CAAC,MAAM,CAAC,UAAQ;IAGvB;;;;OAIG;IACH,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,WAAW;IAIzC,MAAM,EAAE,WAAW,CAAC;IAEpB,WAAW,EAAE,MAAM,EAAE,CAAC;IAEtB,SAAS,EAAE,MAAM,EAAE,CAAC;IAEpB;;OAEG;IACH,YAAY,EAAE,MAAM,EAAE,CAAC;IAEvB,KAAK,EAAE,GAAG,CAAC;IAEX,IAAI,EAAE,GAAG,CAAC;IAEV,GAAG,EAAE,MAAM,CAAC;IAMZ,MAAM,EAAE,MAAM,CAAC;IAEf,WAAW,EAAE,WAAW,CAAC;IAEzB,QAAQ,EAAE,MAAM,CAAC;IAEjB,YAAY,EAAE,MAAM,CAAC;IAErB,WAAW,EAAE,UAAU,EAAE,CAAM;IAE/B,OAAO,CAAC,eAAe,CAAC;;IAMxB,GAAG,CAAC,MAAM,EAAE,GAAG,GAAG,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IAIpD,YAAY,IAAI,OAAO,CAAC,SAAS,CAAC;IAqClC,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,SAAM,EAAE,WAAW,SAAc;IAIvE,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,SAAI;IAOjC,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM;IAInC,SAAS,CAAC,QAAQ,IAAI,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAchD,SAAS,CAAC,WAAW,CAAC,KAAK,KAAA,EAAE,MAAM,SAAM,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;CAczE"}
package/dist/Page.js ADDED
@@ -0,0 +1,97 @@
1
+ var _a;
2
+ import busboy from "busboy";
3
+ import HtmlDocument from "./html/HtmlDocument.js";
4
+ import XNode from "./html/XNode.js";
5
+ import Content, { Redirect } from "./Content.js";
6
+ import TempFolder from "./core/TempFolder.js";
7
+ export const isPage = Symbol("isPage");
8
+ /**
9
+ * Page should not contain any reference to underlying request/response objects.
10
+ */
11
+ class Page {
12
+ /**
13
+ * This static method determines if the path can be handled by this page or not.
14
+ * @param pageContext page related items
15
+ * @returns true if it can handle the path, default is true
16
+ */
17
+ static canHandle(pageContext) {
18
+ return true;
19
+ }
20
+ constructor() {
21
+ this.disposables = [];
22
+ this.cacheControl = "no-cache, no-store, max-age=0";
23
+ }
24
+ all(params) {
25
+ return this.notFound();
26
+ }
27
+ readFormData() {
28
+ this.formDataPromise ??= (async () => {
29
+ let tempFolder;
30
+ const result = {
31
+ fields: {},
32
+ files: []
33
+ };
34
+ const req = this.req;
35
+ const bb = busboy({ headers: req.headers, defParamCharset: "utf8" });
36
+ const tasks = [];
37
+ await new Promise((resolve, reject) => {
38
+ bb.on("field", (name, value) => {
39
+ result.fields[name] = value;
40
+ });
41
+ bb.on("file", (name, file, info) => {
42
+ if (!tempFolder) {
43
+ tempFolder = new TempFolder();
44
+ this.disposables.push(tempFolder);
45
+ }
46
+ const tf = tempFolder.get(info.filename, info.mimeType);
47
+ tasks.push(tf.writeAll(file).then(() => {
48
+ result.files.push(tf);
49
+ }));
50
+ });
51
+ bb.on("error", reject);
52
+ bb.on("close", resolve);
53
+ req.pipe(bb);
54
+ });
55
+ await Promise.all(tasks);
56
+ return result;
57
+ })();
58
+ return this.formDataPromise;
59
+ }
60
+ content(body, status = 200, contentType = "text/html") {
61
+ return Content.create({ body, status, contentType });
62
+ }
63
+ json(o, indent = 0) {
64
+ const content = indent
65
+ ? JSON.stringify(o, undefined, indent)
66
+ : JSON.stringify(o);
67
+ return this.content(content, 200, "application/json");
68
+ }
69
+ redirect(location) {
70
+ return new Redirect(location);
71
+ }
72
+ notFound() {
73
+ return Content.html(XNode.create(HtmlDocument, null,
74
+ XNode.create("head", null,
75
+ XNode.create("title", null, "Not found")),
76
+ XNode.create("body", null,
77
+ "The page you are looking for is not found.",
78
+ XNode.create("pre", null,
79
+ this.url,
80
+ " not found"))), 404);
81
+ }
82
+ serverError(error, status = 500) {
83
+ return Content.create({
84
+ body: XNode.create(HtmlDocument, null,
85
+ XNode.create("head", null,
86
+ XNode.create("title", null, "Server Error")),
87
+ XNode.create("body", null,
88
+ "There was an error processing you request.",
89
+ XNode.create("pre", null, error.stack ?? error))),
90
+ status
91
+ });
92
+ }
93
+ }
94
+ _a = isPage;
95
+ Page[_a] = true;
96
+ export default Page;
97
+ //# sourceMappingURL=Page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Page.js","sourceRoot":"","sources":["../src/Page.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { ServiceProvider } from "@entity-access/entity-access/dist/di/di.js";
2
+ import { Request, Response } from "express";
3
+ export default class ServerPages {
4
+ static create(globalServiceProvider?: ServiceProvider): ServerPages;
5
+ private root;
6
+ /**
7
+ * We will register all sub folders starting with given path.
8
+ * @param folder string
9
+ * @param start string
10
+ */
11
+ registerRoutes(folder: string, start?: string): void;
12
+ /**
13
+ * All services should be registered before calling build
14
+ * @param app Express App
15
+ */
16
+ build(app?: import("express-serve-static-core").Express): import("express-serve-static-core").Express;
17
+ protected process(req: Request, resp: Response): Promise<void>;
18
+ }
19
+ //# sourceMappingURL=ServerPages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServerPages.d.ts","sourceRoot":"","sources":["../src/ServerPages.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,eAAe,EAAE,MAAM,4CAA4C,CAAC;AAChG,OAAgB,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAUrD,MAAM,CAAC,OAAO,OAAO,WAAW;WAEd,MAAM,CAAC,qBAAqB,GAAE,eAAuC;IAKnF,OAAO,CAAC,IAAI,CAA8B;IAE1C;;;;OAIG;IACI,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,MAAY;IASzD;;;OAGG;IACI,KAAK,CAAC,GAAG,8CAAY;cAmBZ,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ;CAsEvD"}