@devbro/pashmak 0.1.12 → 0.1.15

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 (38) hide show
  1. package/dist/app/console/StartCommand.d.mts +1 -0
  2. package/dist/app/console/StartCommand.mjs +9 -2
  3. package/dist/app/console/StartCommand.mjs.map +1 -1
  4. package/dist/app/console/index.d.mts +1 -0
  5. package/dist/app/console/index.mjs +1 -0
  6. package/dist/app/console/index.mjs.map +1 -1
  7. package/dist/app/console/migrate/MigrateCommand.mjs +1 -0
  8. package/dist/app/console/migrate/MigrateCommand.mjs.map +1 -1
  9. package/dist/app/console/queue/{GenerateMigrateCommand.d.mts → GenerateQueueMigrateCommand.d.mts} +2 -2
  10. package/dist/app/console/queue/{GenerateMigrateCommand.mjs → GenerateQueueMigrateCommand.mjs} +7 -7
  11. package/dist/app/console/queue/GenerateQueueMigrateCommand.mjs.map +1 -0
  12. package/dist/app/console/queue/queue_migration.tpl +1 -0
  13. package/dist/bin/app/console/DefaultCommand.cjs +16 -5
  14. package/dist/bin/app/console/KeyGenerateCommand.cjs +16 -5
  15. package/dist/bin/app/console/StartCommand.cjs +24 -6
  16. package/dist/bin/app/console/generate/GenerateControllerCommand.cjs +16 -5
  17. package/dist/bin/app/console/generate/index.cjs +16 -5
  18. package/dist/bin/app/console/index.cjs +88 -20
  19. package/dist/bin/app/console/migrate/GenerateMigrateCommand.cjs +16 -5
  20. package/dist/bin/app/console/migrate/MigrateCommand.cjs +17 -5
  21. package/dist/bin/app/console/migrate/MigrateRollbackCommand.cjs +16 -5
  22. package/dist/bin/app/console/migrate/index.cjs +17 -5
  23. package/dist/bin/app/console/queue/{GenerateMigrateCommand.cjs → GenerateQueueMigrateCommand.cjs} +27 -16
  24. package/dist/bin/facades.cjs +16 -5
  25. package/dist/bin/factories.cjs +16 -5
  26. package/dist/bin/index.cjs +101 -26
  27. package/dist/bin/middlewares.cjs +16 -5
  28. package/dist/bin/queue.cjs +13 -2
  29. package/dist/facades.d.mts +2 -2
  30. package/dist/facades.mjs +3 -3
  31. package/dist/facades.mjs.map +1 -1
  32. package/dist/factories.mjs +2 -2
  33. package/dist/factories.mjs.map +1 -1
  34. package/dist/queue.d.mts +2 -0
  35. package/dist/queue.mjs +13 -2
  36. package/dist/queue.mjs.map +1 -1
  37. package/package.json +1 -1
  38. package/dist/app/console/queue/GenerateMigrateCommand.mjs.map +0 -1
package/dist/queue.d.mts CHANGED
@@ -5,11 +5,13 @@ declare class DatabaseTransport implements QueueTransportInterface {
5
5
  private db_config;
6
6
  listenInterval: number;
7
7
  messageLimit: number;
8
+ private activeIntervals;
8
9
  constructor(db_config: any);
9
10
  setListenInterval(interval: number): void;
10
11
  setMessageLimit(limit: number): void;
11
12
  dispatch(channel: string, message: string): Promise<void>;
12
13
  listen(channel: string, callback: (message: string) => Promise<void>): Promise<void>;
14
+ stopListening(): Promise<void>;
13
15
  }
14
16
 
15
17
  export { DatabaseTransport };
package/dist/queue.mjs CHANGED
@@ -3,7 +3,6 @@ var __name = (target, value) => __defProp(target, "name", { value, configurable:
3
3
  export * from "@devbro/neko-queue";
4
4
  import { PostgresqlConnection } from "@devbro/neko-sql";
5
5
  class DatabaseTransport {
6
- // default to 100 messages per fetch
7
6
  constructor(db_config) {
8
7
  this.db_config = db_config;
9
8
  }
@@ -13,6 +12,8 @@ class DatabaseTransport {
13
12
  listenInterval = 6e4;
14
13
  // default to 1 minute
15
14
  messageLimit = 100;
15
+ // default to 100 messages per fetch
16
+ activeIntervals = /* @__PURE__ */ new Set();
16
17
  setListenInterval(interval) {
17
18
  this.listenInterval = interval;
18
19
  }
@@ -39,7 +40,7 @@ class DatabaseTransport {
39
40
  }
40
41
  async listen(channel, callback) {
41
42
  return new Promise(async (resolve, reject) => {
42
- setInterval(async () => {
43
+ const intervalId = setInterval(async () => {
43
44
  const conn = new PostgresqlConnection(this.db_config);
44
45
  try {
45
46
  await conn.connect();
@@ -60,12 +61,22 @@ class DatabaseTransport {
60
61
  });
61
62
  }
62
63
  }
64
+ } catch (error) {
65
+ this.activeIntervals.delete(intervalId);
66
+ reject(error);
63
67
  } finally {
64
68
  await conn.disconnect();
65
69
  }
66
70
  }, this.listenInterval);
71
+ this.activeIntervals.add(intervalId);
67
72
  });
68
73
  }
74
+ async stopListening() {
75
+ for (const intervalId of this.activeIntervals) {
76
+ clearInterval(intervalId);
77
+ }
78
+ this.activeIntervals.clear();
79
+ }
69
80
  }
70
81
  export {
71
82
  DatabaseTransport
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/queue.mts"],"sourcesContent":["export * from \"@devbro/neko-queue\";\nimport { QueueTransportInterface } from \"@devbro/neko-queue\";\nimport { PostgresqlConnection } from \"@devbro/neko-sql\";\nimport { Query } from \"@devbro/neko-sql\";\n\nexport class DatabaseTransport implements QueueTransportInterface {\n listenInterval = 60000; // default to 1 minute\n messageLimit = 100; // default to 100 messages per fetch\n\n constructor(private db_config: any) {}\n\n setListenInterval(interval: number): void {\n this.listenInterval = interval;\n }\n\n setMessageLimit(limit: number): void {\n this.messageLimit = limit;\n }\n\n async dispatch(channel: string, message: string): Promise<void> {\n const conn = new PostgresqlConnection(this.db_config);\n try {\n await conn.connect();\n let q: Query = conn.getQuery();\n await q.table(\"queue_messages\").insert({\n channel: channel,\n message: message,\n processed: false,\n created_at: new Date(),\n updated_at: new Date(),\n last_tried_at: null,\n process_message: \"\",\n });\n } finally {\n await conn.disconnect();\n }\n }\n\n async listen(\n channel: string,\n callback: (message: string) => Promise<void>,\n ): Promise<void> {\n // create a promise that runs every minute\n return new Promise(async (resolve, reject) => {\n setInterval(async () => {\n const conn = new PostgresqlConnection(this.db_config);\n try {\n await conn.connect();\n let q: Query = conn.getQuery();\n let messages = await q\n .table(\"queue_messages\")\n .whereOp(\"channel\", \"=\", channel)\n .whereOp(\"processed\", \"=\", false)\n .limit(this.messageLimit)\n .orderBy(\"last_tried_at\", \"asc\")\n .get();\n for (let msg of messages) {\n try {\n await callback(msg.message);\n // mark message as processed\n await q\n .table(\"queue_messages\")\n .whereOp(\"id\", \"=\", msg.id)\n .update({\n processed: true,\n updated_at: new Date(),\n });\n } catch (error) {\n await q\n .table(\"queue_messages\")\n .whereOp(\"id\", \"=\", msg.id)\n .update({\n processed: false,\n last_tried_at: new Date(),\n process_message:\n (error as Error).message || \"Error processing message\",\n });\n }\n }\n } finally {\n await conn.disconnect();\n }\n }, this.listenInterval);\n });\n }\n}\n"],"mappings":";;AAAA,cAAc;AAEd,SAAS,4BAA4B;AAG9B,MAAM,kBAAqD;AAAA;AAAA,EAIhE,YAAoB,WAAgB;AAAhB;AAAA,EAAiB;AAAA,EATvC,OAKkE;AAAA;AAAA;AAAA,EAChE,iBAAiB;AAAA;AAAA,EACjB,eAAe;AAAA,EAIf,kBAAkB,UAAwB;AACxC,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEA,gBAAgB,OAAqB;AACnC,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA,MAAM,SAAS,SAAiB,SAAgC;AAC9D,UAAM,OAAO,IAAI,qBAAqB,KAAK,SAAS;AACpD,QAAI;AACF,YAAM,KAAK,QAAQ;AACnB,UAAI,IAAW,KAAK,SAAS;AAC7B,YAAM,EAAE,MAAM,gBAAgB,EAAE,OAAO;AAAA,QACrC;AAAA,QACA;AAAA,QACA,WAAW;AAAA,QACX,YAAY,oBAAI,KAAK;AAAA,QACrB,YAAY,oBAAI,KAAK;AAAA,QACrB,eAAe;AAAA,QACf,iBAAiB;AAAA,MACnB,CAAC;AAAA,IACH,UAAE;AACA,YAAM,KAAK,WAAW;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,MAAM,OACJ,SACA,UACe;AAEf,WAAO,IAAI,QAAQ,OAAO,SAAS,WAAW;AAC5C,kBAAY,YAAY;AACtB,cAAM,OAAO,IAAI,qBAAqB,KAAK,SAAS;AACpD,YAAI;AACF,gBAAM,KAAK,QAAQ;AACnB,cAAI,IAAW,KAAK,SAAS;AAC7B,cAAI,WAAW,MAAM,EAClB,MAAM,gBAAgB,EACtB,QAAQ,WAAW,KAAK,OAAO,EAC/B,QAAQ,aAAa,KAAK,KAAK,EAC/B,MAAM,KAAK,YAAY,EACvB,QAAQ,iBAAiB,KAAK,EAC9B,IAAI;AACP,mBAAS,OAAO,UAAU;AACxB,gBAAI;AACF,oBAAM,SAAS,IAAI,OAAO;AAE1B,oBAAM,EACH,MAAM,gBAAgB,EACtB,QAAQ,MAAM,KAAK,IAAI,EAAE,EACzB,OAAO;AAAA,gBACN,WAAW;AAAA,gBACX,YAAY,oBAAI,KAAK;AAAA,cACvB,CAAC;AAAA,YACL,SAAS,OAAO;AACd,oBAAM,EACH,MAAM,gBAAgB,EACtB,QAAQ,MAAM,KAAK,IAAI,EAAE,EACzB,OAAO;AAAA,gBACN,WAAW;AAAA,gBACX,eAAe,oBAAI,KAAK;AAAA,gBACxB,iBACG,MAAgB,WAAW;AAAA,cAChC,CAAC;AAAA,YACL;AAAA,UACF;AAAA,QACF,UAAE;AACA,gBAAM,KAAK,WAAW;AAAA,QACxB;AAAA,MACF,GAAG,KAAK,cAAc;AAAA,IACxB,CAAC;AAAA,EACH;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/queue.mts"],"sourcesContent":["export * from \"@devbro/neko-queue\";\nimport { QueueTransportInterface } from \"@devbro/neko-queue\";\nimport { PostgresqlConnection } from \"@devbro/neko-sql\";\nimport { Query } from \"@devbro/neko-sql\";\n\nexport class DatabaseTransport implements QueueTransportInterface {\n listenInterval = 60000; // default to 1 minute\n messageLimit = 100; // default to 100 messages per fetch\n private activeIntervals: Set<NodeJS.Timeout> = new Set();\n\n constructor(private db_config: any) {}\n\n setListenInterval(interval: number): void {\n this.listenInterval = interval;\n }\n\n setMessageLimit(limit: number): void {\n this.messageLimit = limit;\n }\n\n async dispatch(channel: string, message: string): Promise<void> {\n const conn = new PostgresqlConnection(this.db_config);\n try {\n await conn.connect();\n let q: Query = conn.getQuery();\n await q.table(\"queue_messages\").insert({\n channel: channel,\n message: message,\n processed: false,\n created_at: new Date(),\n updated_at: new Date(),\n last_tried_at: null,\n process_message: \"\",\n });\n } finally {\n await conn.disconnect();\n }\n }\n\n async listen(\n channel: string,\n callback: (message: string) => Promise<void>,\n ): Promise<void> {\n // create a promise that runs every minute\n return new Promise(async (resolve, reject) => {\n const intervalId = setInterval(async () => {\n const conn = new PostgresqlConnection(this.db_config);\n try {\n await conn.connect();\n let q: Query = conn.getQuery();\n let messages = await q\n .table(\"queue_messages\")\n .whereOp(\"channel\", \"=\", channel)\n .whereOp(\"processed\", \"=\", false)\n .limit(this.messageLimit)\n .orderBy(\"last_tried_at\", \"asc\")\n .get();\n for (let msg of messages) {\n try {\n await callback(msg.message);\n // mark message as processed\n await q\n .table(\"queue_messages\")\n .whereOp(\"id\", \"=\", msg.id)\n .update({\n processed: true,\n updated_at: new Date(),\n });\n } catch (error) {\n await q\n .table(\"queue_messages\")\n .whereOp(\"id\", \"=\", msg.id)\n .update({\n processed: false,\n last_tried_at: new Date(),\n process_message:\n (error as Error).message || \"Error processing message\",\n });\n }\n }\n } catch (error) {\n // If there's an error with the interval itself, remove it from tracking\n this.activeIntervals.delete(intervalId);\n reject(error);\n } finally {\n await conn.disconnect();\n }\n }, this.listenInterval);\n\n // Track this interval\n this.activeIntervals.add(intervalId);\n });\n }\n\n async stopListening(): Promise<void> {\n // Clear all active intervals\n for (const intervalId of this.activeIntervals) {\n clearInterval(intervalId);\n }\n // Clear the set\n this.activeIntervals.clear();\n }\n}\n"],"mappings":";;AAAA,cAAc;AAEd,SAAS,4BAA4B;AAG9B,MAAM,kBAAqD;AAAA,EAKhE,YAAoB,WAAgB;AAAhB;AAAA,EAAiB;AAAA,EAVvC,OAKkE;AAAA;AAAA;AAAA,EAChE,iBAAiB;AAAA;AAAA,EACjB,eAAe;AAAA;AAAA,EACP,kBAAuC,oBAAI,IAAI;AAAA,EAIvD,kBAAkB,UAAwB;AACxC,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEA,gBAAgB,OAAqB;AACnC,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA,MAAM,SAAS,SAAiB,SAAgC;AAC9D,UAAM,OAAO,IAAI,qBAAqB,KAAK,SAAS;AACpD,QAAI;AACF,YAAM,KAAK,QAAQ;AACnB,UAAI,IAAW,KAAK,SAAS;AAC7B,YAAM,EAAE,MAAM,gBAAgB,EAAE,OAAO;AAAA,QACrC;AAAA,QACA;AAAA,QACA,WAAW;AAAA,QACX,YAAY,oBAAI,KAAK;AAAA,QACrB,YAAY,oBAAI,KAAK;AAAA,QACrB,eAAe;AAAA,QACf,iBAAiB;AAAA,MACnB,CAAC;AAAA,IACH,UAAE;AACA,YAAM,KAAK,WAAW;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,MAAM,OACJ,SACA,UACe;AAEf,WAAO,IAAI,QAAQ,OAAO,SAAS,WAAW;AAC5C,YAAM,aAAa,YAAY,YAAY;AACzC,cAAM,OAAO,IAAI,qBAAqB,KAAK,SAAS;AACpD,YAAI;AACF,gBAAM,KAAK,QAAQ;AACnB,cAAI,IAAW,KAAK,SAAS;AAC7B,cAAI,WAAW,MAAM,EAClB,MAAM,gBAAgB,EACtB,QAAQ,WAAW,KAAK,OAAO,EAC/B,QAAQ,aAAa,KAAK,KAAK,EAC/B,MAAM,KAAK,YAAY,EACvB,QAAQ,iBAAiB,KAAK,EAC9B,IAAI;AACP,mBAAS,OAAO,UAAU;AACxB,gBAAI;AACF,oBAAM,SAAS,IAAI,OAAO;AAE1B,oBAAM,EACH,MAAM,gBAAgB,EACtB,QAAQ,MAAM,KAAK,IAAI,EAAE,EACzB,OAAO;AAAA,gBACN,WAAW;AAAA,gBACX,YAAY,oBAAI,KAAK;AAAA,cACvB,CAAC;AAAA,YACL,SAAS,OAAO;AACd,oBAAM,EACH,MAAM,gBAAgB,EACtB,QAAQ,MAAM,KAAK,IAAI,EAAE,EACzB,OAAO;AAAA,gBACN,WAAW;AAAA,gBACX,eAAe,oBAAI,KAAK;AAAA,gBACxB,iBACG,MAAgB,WAAW;AAAA,cAChC,CAAC;AAAA,YACL;AAAA,UACF;AAAA,QACF,SAAS,OAAO;AAEd,eAAK,gBAAgB,OAAO,UAAU;AACtC,iBAAO,KAAK;AAAA,QACd,UAAE;AACA,gBAAM,KAAK,WAAW;AAAA,QACxB;AAAA,MACF,GAAG,KAAK,cAAc;AAGtB,WAAK,gBAAgB,IAAI,UAAU;AAAA,IACrC,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,gBAA+B;AAEnC,eAAW,cAAc,KAAK,iBAAiB;AAC7C,oBAAc,UAAU;AAAA,IAC1B;AAEA,SAAK,gBAAgB,MAAM;AAAA,EAC7B;AACF;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devbro/pashmak",
3
- "version": "0.1.12",
3
+ "version": "0.1.15",
4
4
  "description": "testing application for the entire repo",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/app/console/queue/GenerateMigrateCommand.mts"],"sourcesContent":["import { cli } from \"../../../facades.mjs\";\nimport { Command, Option } from \"clipanion\";\nimport { Case } from \"change-case-all\";\nimport path from \"path\";\nimport * as fs from \"fs/promises\";\nimport { config } from \"@devbro/neko-config\";\nimport handlebars from \"handlebars\";\nimport { fileURLToPath } from \"url\";\nimport { table } from \"console\";\n\nexport class GenerateMigrateCommand extends Command {\n static paths = [[`generate`, `queue`, \"migration\"]];\n\n name = Option.String({ required: true });\n\n async execute() {\n const date = new Date();\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n const secondsOfDay = String(\n date.getHours() * 3600 + date.getMinutes() * 60 + date.getSeconds(),\n ).padStart(5, \"0\");\n\n const fixed_name = \"queue_messages\";\n const filename = `${year}_${month}_${day}_${secondsOfDay}_${fixed_name}.ts`;\n this.context.stdout.write(`creating migration file ${filename}\\n`);\n\n await fs.mkdir(config.get(\"migration.path\"), { recursive: true });\n\n let dirname = typeof __dirname === \"string\" ? __dirname : undefined;\n if (!dirname) {\n dirname = path.dirname(fileURLToPath(import.meta.url));\n }\n\n const compiledTemplate = handlebars.compile(\n (\n await fs.readFile(path.join(dirname, \"./queue_migration.tpl\"))\n ).toString(),\n );\n const template = await compiledTemplate({\n className: Case.pascal(this.name) + \"Migration\",\n tableName: Case.snake(this.name),\n });\n\n await fs.writeFile(\n path.join(config.get(\"migration.path\"), filename),\n template,\n );\n }\n}\n\ncli().register(GenerateMigrateCommand);\n"],"mappings":";;AAAA,SAAS,WAAW;AACpB,SAAS,SAAS,cAAc;AAChC,SAAS,YAAY;AACrB,OAAO,UAAU;AACjB,YAAY,QAAQ;AACpB,SAAS,cAAc;AACvB,OAAO,gBAAgB;AACvB,SAAS,qBAAqB;AAGvB,MAAM,+BAA+B,QAAQ;AAAA,EAVpD,OAUoD;AAAA;AAAA;AAAA,EAClD,OAAO,QAAQ,CAAC,CAAC,YAAY,SAAS,WAAW,CAAC;AAAA,EAElD,OAAO,OAAO,OAAO,EAAE,UAAU,KAAK,CAAC;AAAA,EAEvC,MAAM,UAAU;AACd,UAAM,OAAO,oBAAI,KAAK;AACtB,UAAM,OAAO,KAAK,YAAY;AAC9B,UAAM,QAAQ,OAAO,KAAK,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG;AACzD,UAAM,MAAM,OAAO,KAAK,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG;AAClD,UAAM,eAAe;AAAA,MACnB,KAAK,SAAS,IAAI,OAAO,KAAK,WAAW,IAAI,KAAK,KAAK,WAAW;AAAA,IACpE,EAAE,SAAS,GAAG,GAAG;AAEjB,UAAM,aAAa;AACnB,UAAM,WAAW,GAAG,IAAI,IAAI,KAAK,IAAI,GAAG,IAAI,YAAY,IAAI,UAAU;AACtE,SAAK,QAAQ,OAAO,MAAM,2BAA2B,QAAQ;AAAA,CAAI;AAEjE,UAAM,GAAG,MAAM,OAAO,IAAI,gBAAgB,GAAG,EAAE,WAAW,KAAK,CAAC;AAEhE,QAAI,UAAU,OAAO,cAAc,WAAW,YAAY;AAC1D,QAAI,CAAC,SAAS;AACZ,gBAAU,KAAK,QAAQ,cAAc,YAAY,GAAG,CAAC;AAAA,IACvD;AAEA,UAAM,mBAAmB,WAAW;AAAA,OAEhC,MAAM,GAAG,SAAS,KAAK,KAAK,SAAS,uBAAuB,CAAC,GAC7D,SAAS;AAAA,IACb;AACA,UAAM,WAAW,MAAM,iBAAiB;AAAA,MACtC,WAAW,KAAK,OAAO,KAAK,IAAI,IAAI;AAAA,MACpC,WAAW,KAAK,MAAM,KAAK,IAAI;AAAA,IACjC,CAAC;AAED,UAAM,GAAG;AAAA,MACP,KAAK,KAAK,OAAO,IAAI,gBAAgB,GAAG,QAAQ;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAI,EAAE,SAAS,sBAAsB;","names":[]}