qcobjects-cli 2.4.66 → 2.5.103-beta

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 (204) hide show
  1. package/.github/workflows/npmpublish-beta.yml +4 -4
  2. package/.github/workflows/npmpublish-lts.yml +4 -4
  3. package/.github/workflows/npmpublish-main.yml +4 -4
  4. package/VERSION +1 -1
  5. package/build-esbuild.js +69 -0
  6. package/eslint.config.mjs +88 -0
  7. package/package.json +74 -46
  8. package/public/browser/backend/com.qcobjects.backend.microservice.static.js +318 -0
  9. package/public/browser/backend/com.qcobjects.backend.microservice.static.js.map +7 -0
  10. package/public/browser/backend/org.qcobjects.backend.php.js +290 -0
  11. package/public/browser/backend/org.qcobjects.backend.php.js.map +7 -0
  12. package/public/browser/com.qcobjects.cli.commands.jira.client_services.js +72 -0
  13. package/public/browser/com.qcobjects.cli.commands.jira.client_services.js.map +7 -0
  14. package/public/browser/com.qcobjects.cli.commands.jira.js +117 -0
  15. package/public/browser/com.qcobjects.cli.commands.jira.js.map +7 -0
  16. package/public/browser/com.qcobjects.cli.commands.js +30 -0
  17. package/public/browser/com.qcobjects.cli.commands.js.map +7 -0
  18. package/public/browser/com.qcobjects.cli.commands.version.js +241 -0
  19. package/public/browser/com.qcobjects.cli.commands.version.js.map +7 -0
  20. package/public/browser/index.js +97 -0
  21. package/public/browser/index.js.map +7 -0
  22. package/public/browser/org.qcobjects.common.pipelog.js +43 -0
  23. package/public/browser/org.qcobjects.common.pipelog.js.map +7 -0
  24. package/public/browser/org.qcobjects.enterprise.commands.js +169 -0
  25. package/public/browser/org.qcobjects.enterprise.commands.js.map +7 -0
  26. package/public/browser/org.quickcorp.qcobjects.api.client_services.js +72 -0
  27. package/public/browser/org.quickcorp.qcobjects.api.client_services.js.map +7 -0
  28. package/public/browser/org.quickcorp.qcobjects.cli.js +3185 -0
  29. package/public/browser/org.quickcorp.qcobjects.cli.js.map +7 -0
  30. package/public/browser/org.quickcorp.qcobjects.collab.server.js +422 -0
  31. package/public/browser/org.quickcorp.qcobjects.collab.server.js.map +7 -0
  32. package/public/browser/org.quickcorp.qcobjects.defaultsettings.js +383 -0
  33. package/public/browser/org.quickcorp.qcobjects.defaultsettings.js.map +7 -0
  34. package/public/browser/org.quickcorp.qcobjects.main.file.js +248 -0
  35. package/public/browser/org.quickcorp.qcobjects.main.file.js.map +7 -0
  36. package/public/browser/org.quickcorp.qcobjects.main.http.gae.server.js +538 -0
  37. package/public/browser/org.quickcorp.qcobjects.main.http.gae.server.js.map +7 -0
  38. package/public/browser/org.quickcorp.qcobjects.main.http.server.js +600 -0
  39. package/public/browser/org.quickcorp.qcobjects.main.http.server.js.map +7 -0
  40. package/public/browser/org.quickcorp.qcobjects.main.http2.server.js +465 -0
  41. package/public/browser/org.quickcorp.qcobjects.main.http2.server.js.map +7 -0
  42. package/public/browser/qcobjects-cli.js +89 -0
  43. package/public/browser/qcobjects-cli.js.map +7 -0
  44. package/public/browser/qcobjects-collab.js +41 -0
  45. package/public/browser/qcobjects-collab.js.map +7 -0
  46. package/public/browser/qcobjects-createcert.js +67 -0
  47. package/public/browser/qcobjects-createcert.js.map +7 -0
  48. package/public/browser/qcobjects-gae-http-server.js +41 -0
  49. package/public/browser/qcobjects-gae-http-server.js.map +7 -0
  50. package/public/browser/qcobjects-http-server.js +41 -0
  51. package/public/browser/qcobjects-http-server.js.map +7 -0
  52. package/public/browser/qcobjects-http2-server.js +44 -0
  53. package/public/browser/qcobjects-http2-server.js.map +7 -0
  54. package/public/browser/qcobjects-shell.js +50 -0
  55. package/public/browser/qcobjects-shell.js.map +7 -0
  56. package/public/browser/types/global/index.d.js +15 -0
  57. package/public/browser/types/global/index.d.js.map +7 -0
  58. package/public/cjs/backend/com.qcobjects.backend.microservice.static.cjs +305 -0
  59. package/public/cjs/backend/com.qcobjects.backend.microservice.static.cjs.map +7 -0
  60. package/public/cjs/backend/org.qcobjects.backend.php.cjs +273 -0
  61. package/public/cjs/backend/org.qcobjects.backend.php.cjs.map +7 -0
  62. package/public/cjs/com.qcobjects.cli.commands.cjs +13 -0
  63. package/public/cjs/com.qcobjects.cli.commands.cjs.map +7 -0
  64. package/public/cjs/com.qcobjects.cli.commands.jira.cjs +100 -0
  65. package/public/cjs/com.qcobjects.cli.commands.jira.cjs.map +7 -0
  66. package/public/cjs/com.qcobjects.cli.commands.jira.client_services.cjs +55 -0
  67. package/public/cjs/com.qcobjects.cli.commands.jira.client_services.cjs.map +7 -0
  68. package/public/cjs/com.qcobjects.cli.commands.version.cjs +224 -0
  69. package/public/cjs/com.qcobjects.cli.commands.version.cjs.map +7 -0
  70. package/public/cjs/index.cjs +89 -0
  71. package/public/cjs/index.cjs.map +7 -0
  72. package/public/cjs/org.qcobjects.common.pipelog.cjs +26 -0
  73. package/public/cjs/org.qcobjects.common.pipelog.cjs.map +7 -0
  74. package/public/cjs/org.qcobjects.enterprise.commands.cjs +152 -0
  75. package/public/cjs/org.qcobjects.enterprise.commands.cjs.map +7 -0
  76. package/public/cjs/org.quickcorp.qcobjects.api.client_services.cjs +55 -0
  77. package/public/cjs/org.quickcorp.qcobjects.api.client_services.cjs.map +7 -0
  78. package/public/cjs/org.quickcorp.qcobjects.cli.cjs +3172 -0
  79. package/public/cjs/org.quickcorp.qcobjects.cli.cjs.map +7 -0
  80. package/public/cjs/org.quickcorp.qcobjects.collab.server.cjs +405 -0
  81. package/public/cjs/org.quickcorp.qcobjects.collab.server.cjs.map +7 -0
  82. package/public/cjs/org.quickcorp.qcobjects.defaultsettings.cjs +366 -0
  83. package/public/cjs/org.quickcorp.qcobjects.defaultsettings.cjs.map +7 -0
  84. package/public/cjs/org.quickcorp.qcobjects.main.file.cjs +235 -0
  85. package/public/cjs/org.quickcorp.qcobjects.main.file.cjs.map +7 -0
  86. package/public/cjs/org.quickcorp.qcobjects.main.http.gae.server.cjs +525 -0
  87. package/public/cjs/org.quickcorp.qcobjects.main.http.gae.server.cjs.map +7 -0
  88. package/public/cjs/org.quickcorp.qcobjects.main.http.server.cjs +587 -0
  89. package/public/cjs/org.quickcorp.qcobjects.main.http.server.cjs.map +7 -0
  90. package/public/cjs/org.quickcorp.qcobjects.main.http2.server.cjs +452 -0
  91. package/public/cjs/org.quickcorp.qcobjects.main.http2.server.cjs.map +7 -0
  92. package/public/cjs/qcobjects-cli.cjs +81 -0
  93. package/public/cjs/qcobjects-cli.cjs.map +7 -0
  94. package/public/cjs/qcobjects-collab.cjs +24 -0
  95. package/public/cjs/qcobjects-collab.cjs.map +7 -0
  96. package/public/cjs/qcobjects-createcert.cjs +50 -0
  97. package/public/cjs/qcobjects-createcert.cjs.map +7 -0
  98. package/public/cjs/qcobjects-gae-http-server.cjs +24 -0
  99. package/public/cjs/qcobjects-gae-http-server.cjs.map +7 -0
  100. package/public/cjs/qcobjects-http-server.cjs +24 -0
  101. package/public/cjs/qcobjects-http-server.cjs.map +7 -0
  102. package/public/cjs/qcobjects-http2-server.cjs +27 -0
  103. package/public/cjs/qcobjects-http2-server.cjs.map +7 -0
  104. package/public/cjs/qcobjects-shell.cjs +34 -0
  105. package/public/cjs/qcobjects-shell.cjs.map +7 -0
  106. package/public/cjs/types/global/index.d.cjs +2 -0
  107. package/public/cjs/types/global/index.d.cjs.map +7 -0
  108. package/public/esm/backend/com.qcobjects.backend.microservice.static.mjs +315 -0
  109. package/public/esm/backend/com.qcobjects.backend.microservice.static.mjs.map +7 -0
  110. package/public/esm/backend/org.qcobjects.backend.php.mjs +287 -0
  111. package/public/esm/backend/org.qcobjects.backend.php.mjs.map +7 -0
  112. package/public/esm/com.qcobjects.cli.commands.jira.client_services.mjs +69 -0
  113. package/public/esm/com.qcobjects.cli.commands.jira.client_services.mjs.map +7 -0
  114. package/public/esm/com.qcobjects.cli.commands.jira.mjs +114 -0
  115. package/public/esm/com.qcobjects.cli.commands.jira.mjs.map +7 -0
  116. package/public/esm/com.qcobjects.cli.commands.mjs +27 -0
  117. package/public/esm/com.qcobjects.cli.commands.mjs.map +7 -0
  118. package/public/esm/com.qcobjects.cli.commands.version.mjs +238 -0
  119. package/public/esm/com.qcobjects.cli.commands.version.mjs.map +7 -0
  120. package/public/esm/index.mjs +78 -0
  121. package/public/esm/index.mjs.map +7 -0
  122. package/public/esm/org.qcobjects.common.pipelog.mjs +40 -0
  123. package/public/esm/org.qcobjects.common.pipelog.mjs.map +7 -0
  124. package/public/esm/org.qcobjects.enterprise.commands.mjs +166 -0
  125. package/public/esm/org.qcobjects.enterprise.commands.mjs.map +7 -0
  126. package/public/esm/org.quickcorp.qcobjects.api.client_services.mjs +69 -0
  127. package/public/esm/org.quickcorp.qcobjects.api.client_services.mjs.map +7 -0
  128. package/public/esm/org.quickcorp.qcobjects.cli.mjs +3182 -0
  129. package/public/esm/org.quickcorp.qcobjects.cli.mjs.map +7 -0
  130. package/public/esm/org.quickcorp.qcobjects.collab.server.mjs +419 -0
  131. package/public/esm/org.quickcorp.qcobjects.collab.server.mjs.map +7 -0
  132. package/public/esm/org.quickcorp.qcobjects.defaultsettings.mjs +380 -0
  133. package/public/esm/org.quickcorp.qcobjects.defaultsettings.mjs.map +7 -0
  134. package/public/esm/org.quickcorp.qcobjects.main.file.mjs +245 -0
  135. package/public/esm/org.quickcorp.qcobjects.main.file.mjs.map +7 -0
  136. package/public/esm/org.quickcorp.qcobjects.main.http.gae.server.mjs +535 -0
  137. package/public/esm/org.quickcorp.qcobjects.main.http.gae.server.mjs.map +7 -0
  138. package/public/esm/org.quickcorp.qcobjects.main.http.server.mjs +597 -0
  139. package/public/esm/org.quickcorp.qcobjects.main.http.server.mjs.map +7 -0
  140. package/public/esm/org.quickcorp.qcobjects.main.http2.server.mjs +462 -0
  141. package/public/esm/org.quickcorp.qcobjects.main.http2.server.mjs.map +7 -0
  142. package/public/esm/qcobjects-cli.mjs +68 -0
  143. package/public/esm/qcobjects-cli.mjs.map +7 -0
  144. package/public/esm/qcobjects-collab.mjs +38 -0
  145. package/public/esm/qcobjects-collab.mjs.map +7 -0
  146. package/public/esm/qcobjects-createcert.mjs +64 -0
  147. package/public/esm/qcobjects-createcert.mjs.map +7 -0
  148. package/public/esm/qcobjects-gae-http-server.mjs +38 -0
  149. package/public/esm/qcobjects-gae-http-server.mjs.map +7 -0
  150. package/public/esm/qcobjects-http-server.mjs +38 -0
  151. package/public/esm/qcobjects-http-server.mjs.map +7 -0
  152. package/public/esm/qcobjects-http2-server.mjs +41 -0
  153. package/public/esm/qcobjects-http2-server.mjs.map +7 -0
  154. package/public/esm/qcobjects-shell.mjs +26 -0
  155. package/public/esm/qcobjects-shell.mjs.map +7 -0
  156. package/public/esm/types/global/index.d.mjs +12 -0
  157. package/public/esm/types/global/index.d.mjs.map +7 -0
  158. package/public/index.d.ts +35 -0
  159. package/spec/support/jasmine.json +7 -4
  160. package/src/backend/{com.qcobjects.backend.microservice.static.js → com.qcobjects.backend.microservice.static.ts} +42 -28
  161. package/src/backend/org.qcobjects.backend.php.ts +348 -0
  162. package/src/{com.qcobjects.cli.commands.jira.client_services.js → com.qcobjects.cli.commands.jira.client_services.ts} +49 -33
  163. package/src/com.qcobjects.cli.commands.jira.ts +147 -0
  164. package/src/com.qcobjects.cli.commands.version.ts +293 -0
  165. package/src/{index.mjs → index.cts} +1 -1
  166. package/src/index.mts +2 -0
  167. package/src/index.ts +1 -1
  168. package/src/{org.qcobjects.common.pipelog.js → org.qcobjects.common.pipelog.ts} +4 -4
  169. package/src/org.qcobjects.enterprise.commands.ts +195 -0
  170. package/src/{org.quickcorp.qcobjects.api.client_services.js → org.quickcorp.qcobjects.api.client_services.ts} +49 -32
  171. package/src/org.quickcorp.qcobjects.cli.ts +533 -0
  172. package/src/org.quickcorp.qcobjects.collab.server.ts +420 -0
  173. package/src/{org.quickcorp.qcobjects.defaultsettings.js → org.quickcorp.qcobjects.defaultsettings.ts} +118 -95
  174. package/src/org.quickcorp.qcobjects.main.file.ts +180 -0
  175. package/src/org.quickcorp.qcobjects.main.http.gae.server.ts +507 -0
  176. package/src/org.quickcorp.qcobjects.main.http.server.ts +551 -0
  177. package/src/org.quickcorp.qcobjects.main.http2.server.ts +419 -0
  178. package/src/{qcobjects-cli.js → qcobjects-cli.ts} +7 -8
  179. package/src/{qcobjects-collab.js → qcobjects-collab.ts} +4 -4
  180. package/src/{qcobjects-createcert.js → qcobjects-createcert.ts} +5 -3
  181. package/src/{qcobjects-gae-http-server.js → qcobjects-gae-http-server.ts} +4 -4
  182. package/src/{qcobjects-http-server.js → qcobjects-http-server.ts} +4 -4
  183. package/src/{qcobjects-http2-server.js → qcobjects-http2-server.ts} +6 -8
  184. package/src/{qcobjects-shell.js → qcobjects-shell.ts} +11 -14
  185. package/src/types/global/index.d.ts +2 -0
  186. package/tsconfig.d.json +45 -3
  187. package/tsconfig.jasmine.json +39 -0
  188. package/tsconfig.json +50 -7
  189. package/.eslintignore +0 -5
  190. package/.eslintrc.cjs +0 -6
  191. package/src/backend/org.qcobjects.backend.php.js +0 -334
  192. package/src/com.qcobjects.cli.commands.jira.js +0 -144
  193. package/src/com.qcobjects.cli.commands.version.js +0 -285
  194. package/src/index.cjs +0 -2
  195. package/src/index.d.ts +0 -2
  196. package/src/org.qcobjects.enterprise.commands.js +0 -194
  197. package/src/org.quickcorp.qcobjects.cli.js +0 -523
  198. package/src/org.quickcorp.qcobjects.collab.server.js +0 -415
  199. package/src/org.quickcorp.qcobjects.main.file.js +0 -159
  200. package/src/org.quickcorp.qcobjects.main.http.gae.server.js +0 -495
  201. package/src/org.quickcorp.qcobjects.main.http.server.js +0 -529
  202. package/src/org.quickcorp.qcobjects.main.http2.server.js +0 -392
  203. /package/spec/{testsSpec.js → testsSpec.ts} +0 -0
  204. /package/src/{com.qcobjects.cli.commands.js → com.qcobjects.cli.commands.ts} +0 -0
@@ -0,0 +1,507 @@
1
+ /**
2
+ * QCObjects CLI 2.4.x
3
+ * ________________
4
+ *
5
+ * Author: Jean Machuca <correojean@gmail.com>
6
+ *
7
+ * Cross Browser Javascript Framework for MVC Patterns
8
+ * QuickCorp/QCObjects is licensed under the
9
+ * GNU Lesser General Public License v3.0
10
+ * [LICENSE] (https://github.com/QuickCorp/QCObjects/blob/master/LICENSE.txt)
11
+ *
12
+ * Permissions of this copyleft license are conditioned on making available
13
+ * complete source code of licensed works and modifications under the same
14
+ * license or the GNU GPLv3. Copyright and license notices must be preserved.
15
+ * Contributors provide an express grant of patent rights. However, a larger
16
+ * work using the licensed work through interfaces provided by the licensed
17
+ * work may be distributed under different terms and without source code for
18
+ * the larger work.
19
+ *
20
+ * Copyright (C) 2015 Jean Machuca,<correojean@gmail.com>
21
+ *
22
+ * Everyone is permitted to copy and distribute verbatim copies of this
23
+ * license document, but changing it is not allowed.
24
+ */
25
+ /*eslint no-unused-vars: "off"*/
26
+ /*eslint no-redeclare: "off"*/
27
+ /*eslint no-empty: "off"*/
28
+ /*eslint strict: "off"*/
29
+ /*eslint no-mixed-operators: "off"*/
30
+ /*eslint no-undef: "off"*/
31
+ "use strict";
32
+ const {findPackageNodePath, Import, Package, InheritClass, CONFIG, logger, New, global, ClassFactory, Export} = require ("qcobjects");
33
+
34
+ const path = require("path");
35
+ const absolutePath = path.resolve(__dirname, "./");
36
+
37
+ const fs = require("fs");
38
+ const mime = require("mime");
39
+ const {FileDispatcher} = require(absolutePath + "/org.quickcorp.qcobjects.main.file.js");
40
+ const {PipeLog} = require(absolutePath + "/org.qcobjects.common.pipelog.js");
41
+
42
+ const ImportMicroservice = function (microservicePackage: string) {
43
+ var _ret_;
44
+ var standardPath = findPackageNodePath(microservicePackage) || findPackageNodePath(microservicePackage + ".js");
45
+ if (standardPath !== null) {
46
+ _ret_ = Import(microservicePackage);
47
+ } else {
48
+ var nonStandardPath = findPackageNodePath(absolutePath + "/backend/" + microservicePackage) || findPackageNodePath(absolutePath + "/backend/" + microservicePackage + ".js");
49
+ if (nonStandardPath !== null){
50
+ _ret_ = Import(absolutePath + "/backend/" + microservicePackage);
51
+ } else {
52
+ _ret_ = Promise.resolve(require (microservicePackage));
53
+ }
54
+ }
55
+ return _ret_;
56
+ };
57
+
58
+ class BackendMicroservice extends InheritClass {
59
+
60
+ constructor(o: any) {
61
+ super(o);
62
+ this.domain = CONFIG.get("domain");
63
+ this.basePath = CONFIG.get("basePath");
64
+ logger.debug("Executing GAE HTTP BackendMicroservice ");
65
+ const microservice = this;
66
+ const server = microservice.server;
67
+ const request = microservice.request;
68
+ this.cors();
69
+ microservice.req.on("data", (data: any) => {
70
+ // data from POST, GET
71
+ var requestMethod = request.method.toLowerCase();
72
+ var supportedMethods:any = {
73
+ "post": microservice.post.bind(this),
74
+ };
75
+ if (supportedMethods.hasOwnProperty.call(supportedMethods, requestMethod)) {
76
+ supportedMethods[requestMethod].call(microservice, data);
77
+ }
78
+ });
79
+
80
+ // data from POST, GET
81
+ var requestMethod = request.method.toLowerCase();
82
+ var supportedMethods:any = {
83
+ "get": microservice.get.bind(this),
84
+ "head": microservice.head.bind(this),
85
+ "put": microservice.put.bind(this),
86
+ "delete": microservice.delete.bind(this),
87
+ "connect": microservice.connect.bind(this),
88
+ "options": microservice.options.bind(this),
89
+ "trace": microservice.trace.bind(this),
90
+ "patch": microservice.patch.bind(this)
91
+ };
92
+ if (supportedMethods.hasOwnProperty.call(supportedMethods, requestMethod)) {
93
+ supportedMethods[requestMethod].call(microservice);
94
+ }
95
+
96
+
97
+ }
98
+
99
+ cors() {
100
+ if (this.route.cors) {
101
+ const {
102
+ allow_origins,
103
+ allow_credentials,
104
+ allow_methods,
105
+ allow_headers
106
+ } = this.route.cors;
107
+ var microservice = this;
108
+ if (typeof microservice.headers !== "object") {
109
+ microservice.headers = {};
110
+ }
111
+ if (typeof allow_origins !== "undefined") {
112
+ // an example of allow_origins is ['https://example.com','http://www.example.com']
113
+ if (allow_origins == "*" || (typeof microservice.request.headers.origin == "undefined") || [...allow_origins].indexOf(microservice.request.headers.origin) !== -1) {
114
+ // for compatibility with all browsers allways return a wildcard when the origin is allowed
115
+ microservice.headers["Access-Control-Allow-Origin"] = "*";
116
+ } else {
117
+ logger.debug("Origin is not allowed: " + microservice.request.headers.origin);
118
+ logger.debug("Forcing to finish the response...");
119
+ this.body = {};
120
+ try {
121
+ this.done();
122
+ } catch (e:any) {}
123
+ }
124
+ } else {
125
+ microservice.headers["Access-Control-Allow-Origin"] = "*";
126
+ }
127
+ if (typeof allow_credentials !== "undefined") {
128
+ microservice.headers["Access-Control-Allow-Credentials"] = allow_credentials.toString();
129
+ } else {
130
+ microservice.headers["Access-Control-Allow-Credentials"] = "true";
131
+ }
132
+ if (typeof allow_methods !== "undefined") {
133
+ microservice.headers["Access-Control-Allow-Methods"] = [...allow_methods].join(",");
134
+ } else {
135
+ microservice.headers["Access-Control-Allow-Methods"] = "GET, OPTIONS, POST";
136
+ }
137
+ if (typeof allow_headers !== "undefined") {
138
+ microservice.headers["Access-Control-Allow-Headers"] = [...allow_headers].join(",");
139
+ } else {
140
+ microservice.headers["Access-Control-Allow-Headers"] = "*";
141
+ }
142
+ }
143
+ }
144
+
145
+ head(formData: any) {
146
+ this.done();
147
+ }
148
+ post(formData: any) {
149
+ this.done();
150
+ }
151
+ put(formData: any) {
152
+ this.done();
153
+ }
154
+ delete(formData: any) {
155
+ this.done();
156
+ }
157
+ connect(formData: any) {
158
+ this.done();
159
+ }
160
+ options(formData: any) {
161
+ this.done();
162
+ }
163
+ trace(formData: any) {
164
+ this.done();
165
+ }
166
+ patch(formData: any) {
167
+ this.done();
168
+ }
169
+ finishWithBody(stream: { write: (arg0: string) => void; end: () => void; }) {
170
+ try {
171
+ stream.write(JSON.stringify(this.body));
172
+ stream.end();
173
+ } catch (e:any) {
174
+ logger.debug("Something wrong writing the response for microservice" + e.toString());
175
+ }
176
+ }
177
+
178
+ done() {
179
+ var microservice = this;
180
+ var stream = microservice.stream;
181
+ try {
182
+ stream.writeHead(200, microservice.headers);
183
+ } catch (e:any) {
184
+ logger.debug("Something went wront while sending headers in http...");
185
+ logger.debug(e.toString());
186
+ }
187
+ if (microservice.body != null) {
188
+ microservice.finishWithBody.call(microservice, stream);
189
+ }
190
+ }
191
+
192
+ }
193
+
194
+ Export (BackendMicroservice);
195
+
196
+ class HTTPServerResponse extends InheritClass {
197
+ constructor(o: { stream: any; }) {
198
+ super(o);
199
+ var self = this;
200
+ self.body = "";
201
+ self.stream = o.stream;
202
+ self._generateResponse();
203
+ this.headers = {
204
+ ":status": 200,
205
+ "content-type": "text/html"
206
+ };
207
+ }
208
+
209
+ sendFile(stream: { setHeader: (arg0: string, arg1: any) => void; end: (arg0?: any) => void; write: (arg0: string) => void; on: (arg0: string, arg1: () => void) => void; }, fileName: string) {
210
+ // read and send file content in the stream
211
+
212
+ try {
213
+ console.log("trying to read " + fileName);
214
+ const fd = fs.openSync(fileName, "r");
215
+ const stat = fs.fstatSync(fd);
216
+ const headers = {
217
+ "content-length": stat.size,
218
+ "last-modified": stat.mtime.toUTCString(),
219
+ "content-type": mime.getType(fileName),
220
+ "cache-control": CONFIG.get("cacheControl", "max-age=31536000")
221
+ };
222
+ logger.debug("closing file " + fileName);
223
+ fs.closeSync(fd);
224
+ stream.setHeader("content-length", headers["content-length"]);
225
+ stream.setHeader("last-modified", headers["last-modified"]);
226
+ stream.setHeader("content-type", headers["content-type"]);
227
+ stream.setHeader("cache-control", headers["cache-control"]);
228
+
229
+ // This line opens the file as a readable stream
230
+ var readStream = fs.createReadStream(fileName);
231
+
232
+ // This will wait until we know the readable stream is actually valid before piping
233
+ readStream.on("open", function () {
234
+ // This just pipes the read stream to the response object (which goes to the client)
235
+ readStream.pipe(stream);
236
+ });
237
+
238
+ readStream.on("end", function () {
239
+ stream.end();
240
+ });
241
+
242
+ // This catches any errors that happen while creating the readable stream (usually invalid names)
243
+ readStream.on("error", function (err: any) {
244
+ stream.end(err);
245
+ });
246
+
247
+ } catch (e:any) {
248
+ if (e.errno == -2) {
249
+ const headers = {
250
+ ":status": 404,
251
+ "content-type": "text/html"
252
+ };
253
+ stream.write("<h1>404 - FILE NOT FOUND</h1>");
254
+ stream.on("close", () => {
255
+ console.log("closing file", fileName);
256
+ });
257
+ stream.end();
258
+ }
259
+ }
260
+ }
261
+
262
+ _generateResponse() {
263
+ var response = this;
264
+ response.fileDispatcher = New(FileDispatcher, {
265
+ scriptname: response.request.scriptname,
266
+ pathname: response.request.pathname,
267
+ done(headers: { [x: string]: number; }, body: any, templateURI: any, isTemplate: any) {
268
+ response.headers = headers;
269
+ var stream = response.stream;
270
+ if (isTemplate) {
271
+ logger.debug("TEMPLATE");
272
+ response.body = body;
273
+ // stream.respond(response.headers);
274
+ stream.write(response.body);
275
+ stream.end();
276
+ } else if (headers[":status"] == 200) {
277
+ response.sendFile(stream, templateURI);
278
+ } else {
279
+ logger.debug("NONE ");
280
+ // stream.respond(response.headers);
281
+ stream.end();
282
+ }
283
+ }
284
+ });
285
+
286
+ }
287
+
288
+ }
289
+
290
+ class HTTPServerRequest extends InheritClass {
291
+
292
+ constructor({
293
+ scriptname = "",
294
+ path = "",
295
+ method = "",
296
+ url = "",
297
+ headers = null,
298
+ flags = null,
299
+ protocol = null,
300
+ slashes = null,
301
+ auth = null,
302
+ host = null,
303
+ port = null,
304
+ hostname = null,
305
+ hash = null,
306
+ search = "",
307
+ query = "",
308
+ pathname = "",
309
+ href = ""
310
+ }) {
311
+ super(...arguments);
312
+
313
+ }
314
+ }
315
+
316
+ class HTTPServer extends InheritClass {
317
+ constructor({
318
+ request = null,
319
+ response = "",
320
+ server = null,
321
+ scriptname = "",
322
+ interceptorInstances = []
323
+ }:{
324
+ request:any, response:any, server?:any, scriptname:string, interceptorInstances:any[]
325
+ }) {
326
+ super({
327
+ request,
328
+ response,
329
+ server,
330
+ scriptname,
331
+ interceptorInstances
332
+ });
333
+
334
+ const oHTTPServer = this;
335
+ const welcometo = "Welcome to \n";
336
+ const instructions = "QCObjects Legacy HTTPServer \n";
337
+ const logo = " .d88888b. .d8888b. .d88888b. 888 d8b 888 \r\nd88P\" \"Y88bd88P Y88bd88P\" \"Y88b888 Y8P 888 \r\n888 888888 888888 888888 888 \r\n888 888888 888 88888888b. 8888 .d88b. .d8888b888888.d8888b \r\n888 888888 888 888888 \"88b \"888d8P Y8bd88P\" 888 88K \r\n888 Y8b 888888 888888 888888 888 88888888888888 888 \"Y8888b. \r\nY88b.Y8b88PY88b d88PY88b. .d88P888 d88P 888Y8b. Y88b. Y88b. X88 \r\n \"Y888888\" \"Y8888P\" \"Y88888P\" 88888P\" 888 \"Y8888 \"Y8888P \"Y888 88888P' \r\n Y8b 888 \r\n d88P \r\n 888P\" ";
338
+ console.log(welcometo);
339
+ console.log(logo);
340
+ console.log(instructions);
341
+ logger.debug(this.showIPAddress());
342
+ logger.info("Listening on HTTP PORT: " + CONFIG.get("serverPortHTTP").toString());
343
+ logger.info("Go to: \n" + this.showPossibleURL());
344
+ this.interceptorInstances = interceptorInstances;
345
+
346
+ const http = require("http");
347
+
348
+ oHTTPServer.server = http.createServer((req: any, res: any) => {
349
+
350
+ });
351
+
352
+ server = oHTTPServer.server;
353
+
354
+ server?.on("error", (err: any) => console.error(err));
355
+
356
+ if (global.get("backendAvailable")) {
357
+ logger.info("Loading backend interceptors...");
358
+ const interceptors = CONFIG.get("backend", {}).interceptors;
359
+ if (typeof interceptors !== "undefined") {
360
+ logger.info("Backend Interceptors Available");
361
+ interceptors.map((interceptor: { microservice: string; }) => {
362
+ ImportMicroservice(interceptor.microservice);
363
+ var interceptorClassFactory = ClassFactory(interceptor.microservice + ".Interceptor");
364
+ var interceptorInstance = New(interceptorClassFactory, {
365
+ domain: CONFIG.get("domain"),
366
+ basePath: CONFIG.get("basePath"),
367
+ projectPath: CONFIG.get("projectPath"),
368
+ interceptor: interceptor,
369
+ server: server
370
+ });
371
+ oHTTPServer.interceptorInstances.push(interceptorInstance);
372
+ });
373
+ }
374
+ }
375
+
376
+ server.on("request", (req: { url: any; headers: any; method: any; }, res: { destroyed: any; writeHeader: (arg0: number, arg1: { "content-type": string; }) => void; on: (arg0: string, arg1: () => void) => void; write: (arg0: string) => void; end: () => void; }) => {
377
+
378
+ const request = Object.assign(New(HTTPServerRequest), require("url").parse(req.url));
379
+ request.headers = req.headers;
380
+ this.request = request;
381
+ this.request.method = req.method;
382
+ this.request.path = req.url;
383
+ server.setMaxListeners(9999999999);
384
+ CONFIG.set("backendTimeout", CONFIG.get("backendTimeout") || 20000);
385
+ var timeoutHandler = () => {
386
+ // end the stream on timeout
387
+ try {
388
+ if (!res.destroyed) {
389
+ logger.info("A timeout occurred..." + CONFIG.get("backendTimeout").toString());
390
+ logger.info("Killing session...");
391
+
392
+ res.writeHeader(500, {
393
+ "content-type": "text/html"
394
+ });
395
+ res.on("error", () => {});
396
+ res.write("<h1>500 - INTERNAL SERVER ERROR (TIMEOUT)</h1>");
397
+ res.end();
398
+ } else {
399
+ logger.debug("Session was normally finishing...");
400
+ }
401
+ } catch (e:any) {
402
+ logger.debug("An unhandled error occurred during timeout catching...");
403
+ logger.debug(e.message);
404
+ }
405
+ server.removeListener("timeout", timeoutHandler);
406
+
407
+ };
408
+ if (!res.destroyed) {
409
+ server.setTimeout(CONFIG.get("backendTimeout"), timeoutHandler);
410
+ }
411
+
412
+ if (this.request.pathname.indexOf(".") < 0) {
413
+ this.request.scriptname = CONFIG.get("documentRootFileIndex");
414
+ } else {
415
+ this.request.scriptname = this.request.pathname.split("/").reverse()[0];
416
+ }
417
+ this.request.pathname = this.request.pathname.substr(0, this.request.pathname.lastIndexOf("/"));
418
+
419
+ logger.debug((new PipeLog()).pipe(this.request));
420
+
421
+ if (global.get("backendAvailable")) {
422
+ logger.info("Backend GAE Microservices Available");
423
+ const routes = CONFIG.get("backend").routes;
424
+ const selectedRoute = routes.filter((route: { path: string; }) => {
425
+ const standardRoutePath = route.path.replace(/{(.*?)}/g, "(?<$1>.*)");
426
+ return (new RegExp(standardRoutePath, "g")).test(request.path);
427
+ });
428
+ if (selectedRoute.length > 0) {
429
+ selectedRoute.map((route: { path: string; microservice: string; }) => {
430
+ const standardRoutePath = route.path.replace(/{(.*?)}/g, "(?<$1>.*)"); //allowing {param}
431
+ const selectedRouteParams = {
432
+ ...[...request.path.matchAll((new RegExp(standardRoutePath, "g")))][0]["groups"]
433
+ };
434
+ ImportMicroservice(route.microservice);
435
+ var microServiceClassFactory = ClassFactory(route.microservice + ".Microservice");
436
+ this.response = New(microServiceClassFactory, {
437
+ domain: CONFIG.get("domain"),
438
+ basePath: CONFIG.get("basePath"),
439
+ projectPath: CONFIG.get("projectPath"),
440
+ route: route,
441
+ routeParams: selectedRouteParams,
442
+ server: server,
443
+ stream: res,
444
+ req: req,
445
+ request: request
446
+ });
447
+ });
448
+ } else {
449
+ this.response = New(HTTPServerResponse, {
450
+ server: server,
451
+ stream: res,
452
+ request: this.request
453
+ });
454
+ }
455
+
456
+ } else {
457
+ // ...
458
+
459
+ this.response = New(HTTPServerResponse, {
460
+ server: server,
461
+ stream: res,
462
+ request: this.request
463
+ });
464
+
465
+ }
466
+
467
+ });
468
+
469
+ }
470
+
471
+ showIPAddress() {
472
+ var _ret_ = "";
473
+ var os = require("os");
474
+ var ifaces = os.networkInterfaces();
475
+ Object.keys(ifaces).forEach(function (iface) {
476
+ ifaces[iface].map(function (ipGroup: any) {
477
+ _ret_ += iface + ": " + (new PipeLog()).pipe(ipGroup) + "\n";
478
+ });
479
+ });
480
+ return _ret_;
481
+ }
482
+
483
+ showPossibleURL() {
484
+ var _ret_ = "";
485
+ var os = require("os");
486
+ var ifaces = os.networkInterfaces();
487
+ Object.keys(ifaces).forEach(function (iface) {
488
+ ifaces[iface].map(function (ipGroup: { [x: string]: string; }) {
489
+ if (ipGroup["family"].toLowerCase() == "ipv4") {
490
+ _ret_ += "http://" + ipGroup["address"] + ":" + CONFIG.get("serverPortHTTP").toString() + "/\n";
491
+ }
492
+ });
493
+ });
494
+ return _ret_;
495
+ }
496
+
497
+ start() {
498
+ var server = this.server;
499
+ server.listen(process.env.PORT || CONFIG.get("serverPortHTTP"));
500
+ }
501
+ }
502
+
503
+
504
+ Package("org.quickcorp.qcobjects.main.http.gae.server", [
505
+ BackendMicroservice, HTTPServer,HTTPServerRequest, HTTPServerResponse
506
+
507
+ ]);