@devbro/pashmak 0.1.47 → 0.1.49

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 (42) hide show
  1. package/dist/DatabaseServiceProvider.d.mts +4 -1
  2. package/dist/DatabaseServiceProvider.mjs +5 -2
  3. package/dist/DatabaseServiceProvider.mjs.map +1 -1
  4. package/dist/app/console/StartCommand.d.mts +1 -0
  5. package/dist/app/console/StartCommand.mjs +5 -2
  6. package/dist/app/console/StartCommand.mjs.map +1 -1
  7. package/dist/app/console/generate/GenerateApiDocsCommand.d.mts +34 -2
  8. package/dist/app/console/generate/GenerateApiDocsCommand.mjs +183 -100
  9. package/dist/app/console/generate/GenerateApiDocsCommand.mjs.map +1 -1
  10. package/dist/app/console/project/base_project/src/config/storages.ts.tpl +2 -2
  11. package/dist/bin/DatabaseServiceProvider.cjs +8 -2
  12. package/dist/bin/app/console/DefaultCommand.cjs +64 -32
  13. package/dist/bin/app/console/KeyGenerateCommand.cjs +64 -32
  14. package/dist/bin/app/console/StartCommand.cjs +69 -34
  15. package/dist/bin/app/console/generate/GenerateApiDocsCommand.cjs +248 -133
  16. package/dist/bin/app/console/generate/GenerateControllerCommand.cjs +64 -32
  17. package/dist/bin/app/console/generate/index.cjs +248 -133
  18. package/dist/bin/app/console/index.cjs +253 -135
  19. package/dist/bin/app/console/migrate/GenerateMigrateCommand.cjs +64 -32
  20. package/dist/bin/app/console/migrate/MigrateCommand.cjs +64 -32
  21. package/dist/bin/app/console/migrate/MigrateRollbackCommand.cjs +64 -32
  22. package/dist/bin/app/console/migrate/index.cjs +64 -32
  23. package/dist/bin/app/console/queue/GenerateQueueMigrateCommand.cjs +64 -32
  24. package/dist/bin/cache.cjs +64 -32
  25. package/dist/bin/facades.cjs +64 -32
  26. package/dist/bin/factories.cjs +64 -32
  27. package/dist/bin/http.cjs +739 -0
  28. package/dist/bin/index.cjs +264 -141
  29. package/dist/bin/middlewares.cjs +66 -34
  30. package/dist/bin/queue.cjs +64 -32
  31. package/dist/bin/router.cjs +4 -8
  32. package/dist/config.d.mts +0 -1
  33. package/dist/facades.mjs +2 -13
  34. package/dist/facades.mjs.map +1 -1
  35. package/dist/factories.mjs +45 -2
  36. package/dist/factories.mjs.map +1 -1
  37. package/dist/http.d.mts +4 -0
  38. package/dist/http.mjs +20 -0
  39. package/dist/http.mjs.map +1 -1
  40. package/dist/queue.d.mts +1 -1
  41. package/dist/queue.mjs.map +1 -1
  42. package/package.json +1 -1
package/dist/bin/http.cjs CHANGED
@@ -1,8 +1,15 @@
1
1
  "use strict";
2
+ var __create = Object.create;
2
3
  var __defProp = Object.defineProperty;
3
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
5
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
9
+ var __export = (target, all) => {
10
+ for (var name in all)
11
+ __defProp(target, name, { get: all[name], enumerable: true });
12
+ };
6
13
  var __copyProps = (to, from, except, desc) => {
7
14
  if (from && typeof from === "object" || typeof from === "function") {
8
15
  for (let key of __getOwnPropNames(from))
@@ -12,13 +19,745 @@ var __copyProps = (to, from, except, desc) => {
12
19
  return to;
13
20
  };
14
21
  var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
22
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
23
+ // If the importer is in node compatibility mode or this is not an ESM
24
+ // file that has been converted to a CommonJS file using a Babel-
25
+ // compatible transform (i.e. "__esModule" has not been set), then set
26
+ // "default" to the CommonJS "module.exports" for node compatibility.
27
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
28
+ mod
29
+ ));
15
30
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
16
31
 
17
32
  // src/http.mts
18
33
  var http_exports = {};
34
+ __export(http_exports, {
35
+ handleHttpErrors: () => handleHttpErrors
36
+ });
19
37
  module.exports = __toCommonJS(http_exports);
38
+ var import_neko_http = require("@devbro/neko-http");
39
+
40
+ // src/router.mts
41
+ var import_neko_context = require("@devbro/neko-context");
42
+ var import_errors = require("@devbro/neko-http/errors");
43
+
44
+ // ../neko-router/dist/CompiledRoute.mjs
45
+ var import_stream = require("stream");
46
+
47
+ // ../neko-router/dist/Middleware.mjs
48
+ var Middleware = class {
49
+ static {
50
+ __name(this, "Middleware");
51
+ }
52
+ constructor(params = {}) {
53
+ }
54
+ static getInstance(params) {
55
+ throw new Error("Method not implemented. Please implement a static getInstance method.");
56
+ }
57
+ };
58
+
59
+ // ../neko-router/dist/MiddlewareFactory.mjs
60
+ var MiddlewareFactory = class {
61
+ static {
62
+ __name(this, "MiddlewareFactory");
63
+ }
64
+ static create(func) {
65
+ const cls = class extends Middleware {
66
+ static {
67
+ __name(this, "cls");
68
+ }
69
+ call(req, res, next) {
70
+ return func(req, res, next);
71
+ }
72
+ constructor(params = {}) {
73
+ super(params);
74
+ }
75
+ };
76
+ return new cls();
77
+ }
78
+ };
79
+
80
+ // ../neko-router/dist/CompiledRoute.mjs
81
+ var import_neko_helper = require("@devbro/neko-helper");
82
+ var CompiledRoute = class {
83
+ static {
84
+ __name(this, "CompiledRoute");
85
+ }
86
+ constructor(route, request, response, globalMiddlewares = []) {
87
+ this.route = route;
88
+ this.request = request;
89
+ this.response = response;
90
+ this.globalMiddlewares = globalMiddlewares;
91
+ this.prepareMiddlewares();
92
+ }
93
+ middlewares = [];
94
+ getMiddlewares() {
95
+ return this.middlewares;
96
+ }
97
+ prepareMiddlewares() {
98
+ this.middlewares = [];
99
+ for (const middleware of [...this.globalMiddlewares, ...this.route.getMiddlewares()]) {
100
+ if (middleware instanceof Middleware) {
101
+ this.middlewares.push(middleware);
102
+ } else if ((0, import_neko_helper.isClass)(middleware)) {
103
+ this.middlewares.push(middleware.getInstance({}));
104
+ } else if (typeof middleware === "function") {
105
+ this.middlewares.push(MiddlewareFactory.create(middleware));
106
+ } else {
107
+ throw new Error("Invalid middleware type");
108
+ }
109
+ }
110
+ }
111
+ async run() {
112
+ return await this.runMiddlewares(this.middlewares, this.request, this.response);
113
+ }
114
+ prepareOutputJsonFormat(obj) {
115
+ function traverse(value) {
116
+ if (value === void 0 || value === null) {
117
+ return null;
118
+ }
119
+ if (!value || typeof value !== "object") {
120
+ return value;
121
+ }
122
+ if (typeof value.toJson === "function") {
123
+ return traverse(value.toJson());
124
+ }
125
+ if (typeof value.toJSON === "function") {
126
+ return traverse(value.toJSON());
127
+ }
128
+ if (Array.isArray(value)) {
129
+ return value.map(traverse);
130
+ }
131
+ const result = {};
132
+ for (const key in value) {
133
+ if (Object.prototype.hasOwnProperty.call(value, key)) {
134
+ result[key] = traverse(value[key]);
135
+ }
136
+ }
137
+ return result;
138
+ }
139
+ __name(traverse, "traverse");
140
+ return traverse(obj);
141
+ }
142
+ convertToString(obj) {
143
+ if (typeof obj === "string") {
144
+ return obj;
145
+ } else if (obj instanceof Buffer) {
146
+ return obj.toString();
147
+ } else if (typeof obj === "object") {
148
+ return JSON.stringify(this.prepareOutputJsonFormat(obj));
149
+ }
150
+ return String(obj);
151
+ }
152
+ async processResponseBody(res, controller_rc) {
153
+ if (controller_rc && res.writableEnded) {
154
+ throw new Error("cannot write to response, response has already ended");
155
+ }
156
+ if (res.writableEnded) {
157
+ return;
158
+ }
159
+ if (controller_rc) {
160
+ const header_content_type = res.getHeader("Content-Type");
161
+ if (controller_rc instanceof import_stream.Stream || Buffer.isBuffer(controller_rc)) {
162
+ await this.writeAsync(res, controller_rc);
163
+ } else if (!header_content_type && typeof controller_rc === "object") {
164
+ res.setHeader("Content-Type", "application/json");
165
+ res.write(this.convertToString(controller_rc));
166
+ } else if (!header_content_type) {
167
+ res.setHeader("Content-Type", "text/plain");
168
+ res.write(this.convertToString(controller_rc));
169
+ } else {
170
+ res.write(this.convertToString(controller_rc));
171
+ }
172
+ return;
173
+ } else {
174
+ res.statusCode = [200].includes(res.statusCode) ? 204 : res.statusCode;
175
+ }
176
+ }
177
+ async writeAsync(res, chunk) {
178
+ return new Promise((resolve, reject) => {
179
+ const ok = res.write(chunk, (err) => {
180
+ if (err) reject(err);
181
+ });
182
+ if (ok) {
183
+ resolve(0);
184
+ } else {
185
+ res.once("drain", resolve);
186
+ }
187
+ });
188
+ }
189
+ async runMiddlewares(middlewares, req, res) {
190
+ let index = 0;
191
+ const me = this;
192
+ async function next() {
193
+ if (index >= middlewares.length) {
194
+ const controller_rc = await me.route.callHanlder(req, res);
195
+ await me.processResponseBody(res, controller_rc);
196
+ return;
197
+ }
198
+ const middleware = middlewares[index++];
199
+ if (middleware instanceof Middleware) {
200
+ await middleware.call(req, res, next);
201
+ } else if (typeof middleware === "function") {
202
+ await middleware(req, res, next);
203
+ } else {
204
+ throw new Error("does not know how to run middleware");
205
+ }
206
+ }
207
+ __name(next, "next");
208
+ await next();
209
+ }
210
+ };
211
+
212
+ // ../neko-router/dist/Route.mjs
213
+ var Route = class {
214
+ static {
215
+ __name(this, "Route");
216
+ }
217
+ constructor(methods, path2, handler) {
218
+ this.methods = methods;
219
+ this.path = path2;
220
+ this.handler = handler;
221
+ this.urlRegex = this.pathToRegex(path2);
222
+ }
223
+ middlewares = [];
224
+ urlRegex;
225
+ pathToRegex(path2) {
226
+ const lex = this.lexUrlPath(path2);
227
+ return this.tokensToRegex(lex);
228
+ }
229
+ lexUrlPath(path2) {
230
+ const tokens = [];
231
+ let i = 0;
232
+ while (i < path2.length) {
233
+ const char = path2[i];
234
+ if (char === "/") {
235
+ tokens.push({ type: "SLASH", value: "/" });
236
+ i++;
237
+ } else if (char === ":") {
238
+ let start = i + 1;
239
+ while (start < path2.length && /[a-zA-Z0-9_]/.test(path2[start])) {
240
+ start++;
241
+ }
242
+ tokens.push({ type: "PARAM", value: path2.slice(i + 1, start) });
243
+ i = start;
244
+ } else if (char === "*") {
245
+ let start = i + 1;
246
+ while (start < path2.length && /[a-zA-Z0-9_]/.test(path2[start])) {
247
+ start++;
248
+ }
249
+ tokens.push({ type: "WILDCARD", value: path2.slice(i + 1, start) });
250
+ i = start;
251
+ } else {
252
+ let start = i;
253
+ while (start < path2.length && !["/", ":", "*"].includes(path2[start])) {
254
+ start++;
255
+ }
256
+ tokens.push({ type: "TEXT", value: path2.slice(i, start) });
257
+ i = start;
258
+ }
259
+ }
260
+ return tokens;
261
+ }
262
+ tokensToRegex(tokens) {
263
+ const regexParts = [];
264
+ for (const token of tokens) {
265
+ if (token.type === "SLASH") {
266
+ regexParts.push("\\/");
267
+ } else if (token.type === "PARAM") {
268
+ regexParts.push(`(?<${token.value}>[^\\/]+)`);
269
+ } else if (token.type === "WILDCARD") {
270
+ regexParts.push("(.+)");
271
+ } else if (token.type === "TEXT") {
272
+ regexParts.push(token.value.replace(/[-\/\\^$.*+?()[\]{}|]/g, "\\$&"));
273
+ }
274
+ }
275
+ if (regexParts.length > 0 && regexParts[regexParts.length - 1] === "\\/") {
276
+ regexParts[regexParts.length - 1] = "\\/?";
277
+ } else {
278
+ regexParts.push("\\/?");
279
+ }
280
+ return new RegExp(`^${regexParts.join("")}$`);
281
+ }
282
+ /**
283
+ * to evaludate if request is a match for this route
284
+ * @param request http request
285
+ * @returns return true if route is a match for this request
286
+ */
287
+ test(request) {
288
+ if (this.methods.indexOf(request.method) === -1) {
289
+ return false;
290
+ }
291
+ const url = new URL(request.url || "/", "http://localhost");
292
+ return this.testPath(url.pathname);
293
+ }
294
+ testPath(pathname) {
295
+ return this.urlRegex.test(pathname);
296
+ }
297
+ /**
298
+ * returns details of the match, otherwise it returns false
299
+ * @param request the request to match
300
+ * @returns object cotaining details of match including matched params
301
+ */
302
+ match(request) {
303
+ if (this.methods.indexOf(request.method) === -1) {
304
+ return false;
305
+ }
306
+ const url = new URL(request.url || "/", "http://localhost");
307
+ const r = this.urlRegex.exec(url.pathname);
308
+ if (!r) {
309
+ return false;
310
+ }
311
+ return {
312
+ url,
313
+ params: r.groups || {}
314
+ };
315
+ }
316
+ prependMiddleware(middlewares) {
317
+ this.middlewares = [].concat(middlewares, this.middlewares);
318
+ return this;
319
+ }
320
+ addMiddleware(middlewares) {
321
+ this.middlewares = this.middlewares.concat(middlewares);
322
+ return this;
323
+ }
324
+ getMiddlewares() {
325
+ return this.middlewares;
326
+ }
327
+ callHanlder(request, response) {
328
+ return this.handler(request, response);
329
+ }
330
+ };
331
+
332
+ // ../neko-router/dist/Router.mjs
333
+ var import_path = __toESM(require("path"), 1);
334
+
335
+ // ../node_modules/url-join/lib/url-join.js
336
+ function normalize(strArray) {
337
+ var resultArray = [];
338
+ if (strArray.length === 0) {
339
+ return "";
340
+ }
341
+ if (typeof strArray[0] !== "string") {
342
+ throw new TypeError("Url must be a string. Received " + strArray[0]);
343
+ }
344
+ if (strArray[0].match(/^[^/:]+:\/*$/) && strArray.length > 1) {
345
+ var first = strArray.shift();
346
+ strArray[0] = first + strArray[0];
347
+ }
348
+ if (strArray[0].match(/^file:\/\/\//)) {
349
+ strArray[0] = strArray[0].replace(/^([^/:]+):\/*/, "$1:///");
350
+ } else {
351
+ strArray[0] = strArray[0].replace(/^([^/:]+):\/*/, "$1://");
352
+ }
353
+ for (var i = 0; i < strArray.length; i++) {
354
+ var component = strArray[i];
355
+ if (typeof component !== "string") {
356
+ throw new TypeError("Url must be a string. Received " + component);
357
+ }
358
+ if (component === "") {
359
+ continue;
360
+ }
361
+ if (i > 0) {
362
+ component = component.replace(/^[\/]+/, "");
363
+ }
364
+ if (i < strArray.length - 1) {
365
+ component = component.replace(/[\/]+$/, "");
366
+ } else {
367
+ component = component.replace(/[\/]+$/, "/");
368
+ }
369
+ resultArray.push(component);
370
+ }
371
+ var str = resultArray.join("/");
372
+ str = str.replace(/\/(\?|&|#[^!])/g, "$1");
373
+ var parts = str.split("?");
374
+ str = parts.shift() + (parts.length > 0 ? "?" : "") + parts.join("&");
375
+ return str;
376
+ }
377
+ __name(normalize, "normalize");
378
+ function urlJoin() {
379
+ var input;
380
+ if (typeof arguments[0] === "object") {
381
+ input = arguments[0];
382
+ } else {
383
+ input = [].slice.call(arguments);
384
+ }
385
+ return normalize(input);
386
+ }
387
+ __name(urlJoin, "urlJoin");
388
+
389
+ // ../neko-router/dist/Router.mjs
390
+ var Router = class {
391
+ static {
392
+ __name(this, "Router");
393
+ }
394
+ middlewares = [];
395
+ routes = [];
396
+ addRoute(methods, path2, handler) {
397
+ const route = new Route(methods, path2, handler);
398
+ this.routes.push(route);
399
+ return route;
400
+ }
401
+ getMiddlewares() {
402
+ return [...this.middlewares];
403
+ }
404
+ addController(controller) {
405
+ const basePath = controller.basePath || "";
406
+ for (const route of controller.routes) {
407
+ const urlPath = import_path.default.join(basePath, route.path);
408
+ this.addRoute(route.methods, urlPath, async (req, res) => {
409
+ const controllerInstance = controller.getInstance();
410
+ return await controllerInstance[route.handler]();
411
+ }).addMiddleware([...controller.baseMiddlewares, ...route.middlewares]);
412
+ }
413
+ }
414
+ addRouter(path2, router2) {
415
+ for (const route of router2.routes) {
416
+ let path22 = urlJoin("/", path2, route.path);
417
+ this.addRoute(route.methods, path22, route.handler).addMiddleware(router2.getMiddlewares()).addMiddleware(route.getMiddlewares());
418
+ }
419
+ }
420
+ addGlobalMiddleware(middlewares) {
421
+ this.middlewares = this.middlewares.concat(middlewares);
422
+ }
423
+ resolve(request) {
424
+ for (const route of this.routes) {
425
+ if (route.test(request)) {
426
+ return route;
427
+ }
428
+ }
429
+ return void 0;
430
+ }
431
+ resolveMultiple(request) {
432
+ const rc = [];
433
+ const url = new URL(request.url || "/", "http://localhost");
434
+ for (const route of this.routes) {
435
+ if (route.testPath(url.pathname)) {
436
+ rc.push(route);
437
+ }
438
+ }
439
+ return rc;
440
+ }
441
+ getCompiledRoute(request, response) {
442
+ const route = this.resolve(request);
443
+ if (!route) {
444
+ return void 0;
445
+ }
446
+ const match = route.match(request);
447
+ if (!match) {
448
+ return void 0;
449
+ }
450
+ request.params = match.params;
451
+ return new CompiledRoute(route, request, response, this.middlewares);
452
+ }
453
+ };
454
+
455
+ // src/facades.mts
456
+ var import_neko_scheduler = require("@devbro/neko-scheduler");
457
+ var import_neko_helper3 = require("@devbro/neko-helper");
458
+ var import_neko_context3 = require("@devbro/neko-context");
459
+ var import_neko_storage2 = require("@devbro/neko-storage");
460
+ var import_neko_mailer2 = require("@devbro/neko-mailer");
461
+ var import_neko_config = require("@devbro/neko-config");
462
+ var import_clipanion = require("clipanion");
463
+ var import_neko_logger = require("@devbro/neko-logger");
464
+
465
+ // src/factories.mts
466
+ var import_neko_mailer = require("@devbro/neko-mailer");
467
+ var import_neko_queue = require("@devbro/neko-queue");
468
+
469
+ // src/queue.mts
470
+ var queue_exports = {};
471
+ __export(queue_exports, {
472
+ DatabaseTransport: () => DatabaseTransport
473
+ });
474
+ __reExport(queue_exports, require("@devbro/neko-queue"));
475
+ var import_neko_helper2 = require("@devbro/neko-helper");
476
+ var import_neko_context2 = require("@devbro/neko-context");
477
+ var DatabaseTransport = class {
478
+ static {
479
+ __name(this, "DatabaseTransport");
480
+ }
481
+ config = {
482
+ queue_table: "queue_messages",
483
+ db_connection: "default",
484
+ listen_interval: 60,
485
+ // seconds
486
+ message_limit: 10,
487
+ // messages per each fetch
488
+ max_retry_count: 5
489
+ // maximum retry count for failed messages
490
+ };
491
+ channels = /* @__PURE__ */ new Map();
492
+ messageQueues = [];
493
+ repeater;
494
+ processMessage = /* @__PURE__ */ __name(async () => {
495
+ await import_neko_context2.context_provider.run(async () => {
496
+ const conn = db(this.config.db_connection);
497
+ try {
498
+ let q = conn.getQuery();
499
+ let messages = await conn.getQuery().table(this.config.queue_table).whereOp("channel", "in", Array.from(this.channels.keys())).whereOp("status", "in", ["pending", "failed"]).whereOp("retried_count", "<", this.config.max_retry_count).limit(this.config.message_limit).orderBy("last_tried_at", "asc").get();
500
+ for (let msg of messages) {
501
+ try {
502
+ await conn.getQuery().table(this.config.queue_table).whereOp("id", "=", msg.id).update({
503
+ status: "processing",
504
+ updated_at: /* @__PURE__ */ new Date(),
505
+ last_tried_at: /* @__PURE__ */ new Date(),
506
+ retried_count: (msg.retried_count || 0) + 1
507
+ });
508
+ let callback = this.channels.get(msg.channel);
509
+ await callback(msg.message);
510
+ await conn.getQuery().table(this.config.queue_table).whereOp("id", "=", msg.id).update({
511
+ status: "processed",
512
+ updated_at: /* @__PURE__ */ new Date()
513
+ });
514
+ } catch (error) {
515
+ logger().error("Error processing message:", {
516
+ error,
517
+ message_id: msg.id,
518
+ channel: msg.channel
519
+ });
520
+ await q.table(this.config.queue_table).whereOp("id", "=", msg.id).update({
521
+ status: "failed",
522
+ updated_at: /* @__PURE__ */ new Date(),
523
+ process_message: error.message || "Error processing message"
524
+ });
525
+ }
526
+ }
527
+ } catch (error) {
528
+ logger().error("Error in DatabaseTransport listen interval:", {
529
+ error
530
+ });
531
+ }
532
+ });
533
+ }, "processMessage");
534
+ constructor(config2 = {}) {
535
+ this.config = { ...this.config, ...config2 };
536
+ this.repeater = (0, import_neko_helper2.createRepeater)(
537
+ this.processMessage,
538
+ this.config.listen_interval * 1e3
539
+ );
540
+ }
541
+ async dispatch(channel, message) {
542
+ const conn = db(this.config.db_connection);
543
+ let schema = conn.getSchema();
544
+ if (await schema.tableExists(this.config.queue_table) === false) {
545
+ return;
546
+ }
547
+ let q = conn.getQuery();
548
+ await q.table(this.config.queue_table).insert({
549
+ channel,
550
+ message,
551
+ created_at: /* @__PURE__ */ new Date(),
552
+ updated_at: /* @__PURE__ */ new Date(),
553
+ last_tried_at: null,
554
+ process_message: "",
555
+ retried_count: 0,
556
+ status: "pending"
557
+ });
558
+ }
559
+ async registerListener(channel, callback) {
560
+ this.channels.set(channel, callback);
561
+ }
562
+ async startListening() {
563
+ this.repeater.start();
564
+ }
565
+ async stopListening() {
566
+ this.repeater.stop();
567
+ }
568
+ };
569
+
570
+ // src/factories.mts
571
+ var import_neko_cache = require("@devbro/neko-cache");
572
+ var import_neko_storage = require("@devbro/neko-storage");
573
+ var FlexibleFactory = class {
574
+ static {
575
+ __name(this, "FlexibleFactory");
576
+ }
577
+ registry = /* @__PURE__ */ new Map();
578
+ register(key, ctor) {
579
+ this.registry.set(key, ctor);
580
+ }
581
+ create(key, ...args) {
582
+ const ctor = this.registry.get(key);
583
+ if (!ctor) {
584
+ throw new Error(`No factory registered for key: ${key}`);
585
+ }
586
+ return ctor(...args);
587
+ }
588
+ };
589
+ import_neko_mailer.MailerProviderFactory.register("ses", (opt) => {
590
+ return new import_neko_mailer.SESProvider(opt);
591
+ });
592
+ import_neko_mailer.MailerProviderFactory.register("smtp", (opt) => {
593
+ return new import_neko_mailer.SMTPProvider(opt);
594
+ });
595
+ import_neko_mailer.MailerProviderFactory.register("memory", (opt) => {
596
+ return new import_neko_mailer.MemoryProvider();
597
+ });
598
+ import_neko_queue.QueueTransportFactory.register("database", (opt) => {
599
+ return new DatabaseTransport(opt);
600
+ });
601
+ import_neko_queue.QueueTransportFactory.register("memory", (opt) => {
602
+ return new import_neko_queue.MemoryTransport(opt);
603
+ });
604
+ import_neko_queue.QueueTransportFactory.register("sqs", (opt) => {
605
+ return new import_neko_queue.AwsSqsTransport(opt);
606
+ });
607
+ import_neko_queue.QueueTransportFactory.register("amqp", (opt) => {
608
+ return new import_neko_queue.AmqpTransport(opt);
609
+ });
610
+ import_neko_queue.QueueTransportFactory.register("redis", (opt) => {
611
+ return new import_neko_queue.RedisTransport(opt);
612
+ });
613
+ import_neko_queue.QueueTransportFactory.register("async", (opt) => {
614
+ return new import_neko_queue.AsyncTransport();
615
+ });
616
+ import_neko_queue.QueueTransportFactory.register("azure_service_bus", (opt) => {
617
+ return new import_neko_queue.AzureServiceBusTransport(opt);
618
+ });
619
+ import_neko_queue.QueueTransportFactory.register("google_pubsub", (opt) => {
620
+ return new import_neko_queue.GooglePubSubTransport(opt);
621
+ });
622
+ var CacheProviderFactory = class _CacheProviderFactory {
623
+ static {
624
+ __name(this, "CacheProviderFactory");
625
+ }
626
+ static instance = new FlexibleFactory();
627
+ static register(key, factory) {
628
+ _CacheProviderFactory.instance.register(key, factory);
629
+ }
630
+ static create(key, ...args) {
631
+ return _CacheProviderFactory.instance.create(key, ...args);
632
+ }
633
+ };
634
+ CacheProviderFactory.register("memory", (opt) => {
635
+ return new import_neko_cache.MemoryCacheProvider(opt);
636
+ });
637
+ CacheProviderFactory.register("redis", (opt) => {
638
+ return new import_neko_cache.RedisCacheProvider(opt);
639
+ });
640
+ CacheProviderFactory.register("file", (opt) => {
641
+ return new import_neko_cache.FileCacheProvider(opt);
642
+ });
643
+ CacheProviderFactory.register("disabled", (opt) => {
644
+ return new import_neko_cache.DisabledCacheProvider();
645
+ });
646
+ import_neko_storage.StorageProviderFactory.register("local", (opt) => {
647
+ return new import_neko_storage.LocalStorageProvider(opt);
648
+ });
649
+ import_neko_storage.StorageProviderFactory.register("s3", (opt) => {
650
+ return new import_neko_storage.AWSS3StorageProvider(opt);
651
+ });
652
+ import_neko_storage.StorageProviderFactory.register("gcp", (opt) => {
653
+ return new import_neko_storage.GCPStorageProvider(opt);
654
+ });
655
+ import_neko_storage.StorageProviderFactory.register("azure", (opt) => {
656
+ return new import_neko_storage.AzureBlobStorageProvider(opt);
657
+ });
658
+ import_neko_storage.StorageProviderFactory.register("ftp", (opt) => {
659
+ return new import_neko_storage.FTPStorageProvider(opt);
660
+ });
661
+ import_neko_storage.StorageProviderFactory.register("sftp", (opt) => {
662
+ return new import_neko_storage.SFTPStorageProvider(opt);
663
+ });
664
+
665
+ // src/facades.mts
666
+ var import_neko_cache2 = require("@devbro/neko-cache");
667
+ var import_neko_queue2 = require("@devbro/neko-queue");
668
+ var router = (0, import_neko_helper3.createSingleton)(() => new Router());
669
+ var scheduler = (0, import_neko_helper3.createSingleton)(() => {
670
+ const rc = new import_neko_scheduler.Scheduler();
671
+ rc.setErrorHandler((err, job) => {
672
+ logger().error({
673
+ msg: "Scheduled job error",
674
+ err,
675
+ job_name: job.getName()
676
+ });
677
+ });
678
+ return rc;
679
+ });
680
+ var db = /* @__PURE__ */ __name((label = "default") => (0, import_neko_context3.ctx)().getOrThrow(["database", label]), "db");
681
+ var storage = (0, import_neko_helper3.createSingleton)((label = "default") => {
682
+ let storage_config = import_neko_config.config.get(["storages", label].join("."));
683
+ const provider = import_neko_storage2.StorageProviderFactory.create(
684
+ storage_config.provider,
685
+ storage_config.config
686
+ );
687
+ return new import_neko_storage2.Storage(provider);
688
+ });
689
+ var cli = (0, import_neko_helper3.createSingleton)(() => {
690
+ const [node, app, ...args] = process.argv;
691
+ return new import_clipanion.Cli({
692
+ binaryLabel: `My Application`,
693
+ binaryName: `${node} ${app}`,
694
+ binaryVersion: `1.0.0`
695
+ });
696
+ });
697
+ var httpServer = (0, import_neko_helper3.createSingleton)(() => {
698
+ const server = new http_exports.HttpServer();
699
+ server.setErrorHandler(handleHttpErrors);
700
+ server.setRouter(router());
701
+ return server;
702
+ });
703
+ var logger = (0, import_neko_helper3.createSingleton)((label) => {
704
+ const logger_config = import_neko_config.config.get(["loggers", label].join("."));
705
+ const rc = new import_neko_logger.Logger(logger_config);
706
+ rc.setExtrasFunction((message) => {
707
+ message.requestId = (0, import_neko_context3.ctxSafe)()?.get("requestId") || "N/A";
708
+ return message;
709
+ });
710
+ return rc;
711
+ });
712
+ var mailer = (0, import_neko_helper3.createSingleton)((label) => {
713
+ const mailer_config = import_neko_config.config.get(["mailer", label].join("."));
714
+ const provider = import_neko_mailer2.MailerProviderFactory.create(
715
+ mailer_config.provider,
716
+ mailer_config.config
717
+ );
718
+ const rc = new import_neko_mailer2.Mailer(provider);
719
+ return rc;
720
+ });
721
+ var queue = (0, import_neko_helper3.createSingleton)((label) => {
722
+ const queue_config = import_neko_config.config.get(["queues", label].join("."));
723
+ if (!queue_config) {
724
+ throw new Error(`Queue configuration for '${label}' not found`);
725
+ }
726
+ const provider = import_neko_queue2.QueueTransportFactory.create(
727
+ queue_config.provider,
728
+ queue_config.config
729
+ );
730
+ return new import_neko_queue2.QueueConnection(provider);
731
+ });
732
+ var cache = (0, import_neko_helper3.createSingleton)((label) => {
733
+ const cache_config = import_neko_config.config.get(["caches", label].join("."));
734
+ if (!cache_config) {
735
+ throw new Error(`Cache configuration for '${label}' not found`);
736
+ }
737
+ const provider = CacheProviderFactory.create(
738
+ cache_config.provider,
739
+ cache_config.config
740
+ );
741
+ return new import_neko_cache2.Cache(provider);
742
+ });
743
+
744
+ // src/http.mts
20
745
  __reExport(http_exports, require("@devbro/neko-http"), module.exports);
746
+ async function handleHttpErrors(err, req, res) {
747
+ if (err instanceof import_neko_http.HttpError) {
748
+ res.writeHead(err.statusCode, { "Content-Type": "application/json" });
749
+ res.write(JSON.stringify({ message: err.message, error: err.code }));
750
+ logger().warn({ msg: "HttpError: " + err.message, err });
751
+ return;
752
+ } else {
753
+ logger().error({ msg: "Error: " + err.message, err });
754
+ }
755
+ res.writeHead(500, { "Content-Type": "application/json" });
756
+ res.write(JSON.stringify({ error: "Internal Server Error" }));
757
+ }
758
+ __name(handleHttpErrors, "handleHttpErrors");
21
759
  // Annotate the CommonJS export names for ESM import in node:
22
760
  0 && (module.exports = {
761
+ handleHttpErrors,
23
762
  ...require("@devbro/neko-http")
24
763
  });