@hotmeshio/hotmesh 0.3.32 → 0.4.1

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 (207) hide show
  1. package/README.md +128 -823
  2. package/build/index.d.ts +9 -9
  3. package/build/index.js +10 -10
  4. package/build/modules/enums.d.ts +23 -23
  5. package/build/modules/enums.js +26 -26
  6. package/build/modules/errors.d.ts +16 -16
  7. package/build/modules/errors.js +28 -28
  8. package/build/modules/key.js +190 -1
  9. package/build/modules/utils.js +374 -1
  10. package/build/package.json +22 -21
  11. package/build/services/activities/activity.js +549 -1
  12. package/build/services/activities/await.js +114 -1
  13. package/build/services/activities/cycle.js +112 -1
  14. package/build/services/activities/hook.js +168 -1
  15. package/build/services/activities/index.js +20 -1
  16. package/build/services/activities/interrupt.js +158 -1
  17. package/build/services/activities/signal.js +134 -1
  18. package/build/services/activities/trigger.js +246 -1
  19. package/build/services/activities/worker.js +106 -1
  20. package/build/services/collator/index.js +293 -1
  21. package/build/services/compiler/deployer.js +488 -1
  22. package/build/services/compiler/index.js +112 -1
  23. package/build/services/compiler/validator.js +147 -1
  24. package/build/services/engine/index.js +761 -1
  25. package/build/services/exporter/index.js +126 -1
  26. package/build/services/hotmesh/index.d.ts +160 -17
  27. package/build/services/hotmesh/index.js +160 -17
  28. package/build/services/mapper/index.js +81 -1
  29. package/build/services/{meshflow → memflow}/client.d.ts +3 -3
  30. package/build/services/{meshflow → memflow}/client.js +17 -16
  31. package/build/services/{meshflow → memflow}/connection.d.ts +2 -2
  32. package/build/services/{meshflow → memflow}/connection.js +1 -1
  33. package/build/services/memflow/context.d.ts +143 -0
  34. package/build/services/memflow/context.js +299 -0
  35. package/build/services/{meshflow → memflow}/exporter.d.ts +6 -6
  36. package/build/services/memflow/exporter.js +215 -0
  37. package/build/services/{meshflow → memflow}/handle.d.ts +4 -4
  38. package/build/services/{meshflow → memflow}/handle.js +2 -2
  39. package/build/services/{meshflow → memflow}/index.d.ts +18 -13
  40. package/build/services/{meshflow → memflow}/index.js +26 -21
  41. package/build/services/{meshflow → memflow}/schemas/factory.d.ts +4 -4
  42. package/build/services/{meshflow → memflow}/schemas/factory.js +5 -5
  43. package/build/services/{meshflow → memflow}/search.d.ts +1 -1
  44. package/build/services/{meshflow → memflow}/search.js +4 -4
  45. package/build/services/{meshflow → memflow}/worker.d.ts +5 -5
  46. package/build/services/{meshflow → memflow}/worker.js +24 -24
  47. package/build/services/memflow/workflow/common.d.ts +20 -0
  48. package/build/services/memflow/workflow/common.js +47 -0
  49. package/build/services/memflow/workflow/contextMethods.d.ts +14 -0
  50. package/build/services/memflow/workflow/contextMethods.js +33 -0
  51. package/build/services/{meshflow → memflow}/workflow/execChild.js +12 -12
  52. package/build/services/memflow/workflow/execHook.d.ts +65 -0
  53. package/build/services/memflow/workflow/execHook.js +73 -0
  54. package/build/services/{meshflow → memflow}/workflow/hook.js +19 -3
  55. package/build/services/{meshflow → memflow}/workflow/index.d.ts +7 -3
  56. package/build/services/{meshflow → memflow}/workflow/index.js +7 -3
  57. package/build/services/{meshflow → memflow}/workflow/proxyActivities.d.ts +2 -2
  58. package/build/services/{meshflow → memflow}/workflow/proxyActivities.js +8 -8
  59. package/build/services/{meshflow → memflow}/workflow/sleepFor.js +2 -2
  60. package/build/services/{meshflow → memflow}/workflow/waitFor.js +2 -2
  61. package/build/services/meshdata/index.d.ts +24 -24
  62. package/build/services/meshdata/index.js +40 -40
  63. package/build/services/pipe/functions/array.js +74 -1
  64. package/build/services/pipe/functions/bitwise.js +24 -1
  65. package/build/services/pipe/functions/conditional.js +36 -1
  66. package/build/services/pipe/functions/cron.js +40 -1
  67. package/build/services/pipe/functions/date.js +171 -1
  68. package/build/services/pipe/functions/index.js +30 -1
  69. package/build/services/pipe/functions/json.js +12 -1
  70. package/build/services/pipe/functions/logical.js +12 -1
  71. package/build/services/pipe/functions/math.js +184 -1
  72. package/build/services/pipe/functions/number.js +60 -1
  73. package/build/services/pipe/functions/object.js +81 -1
  74. package/build/services/pipe/functions/string.js +69 -1
  75. package/build/services/pipe/functions/symbol.js +33 -1
  76. package/build/services/pipe/functions/unary.js +18 -1
  77. package/build/services/pipe/index.js +242 -1
  78. package/build/services/quorum/index.js +263 -1
  79. package/build/services/reporter/index.js +348 -1
  80. package/build/services/router/config/index.d.ts +11 -0
  81. package/build/services/router/config/index.js +36 -0
  82. package/build/services/router/consumption/index.d.ts +34 -0
  83. package/build/services/router/consumption/index.js +395 -0
  84. package/build/services/router/error-handling/index.d.ts +8 -0
  85. package/build/services/router/error-handling/index.js +98 -0
  86. package/build/services/router/index.d.ts +13 -16
  87. package/build/services/router/index.js +121 -1
  88. package/build/services/router/lifecycle/index.d.ts +27 -0
  89. package/build/services/router/lifecycle/index.js +80 -0
  90. package/build/services/router/telemetry/index.d.ts +11 -0
  91. package/build/services/router/telemetry/index.js +32 -0
  92. package/build/services/router/throttling/index.d.ts +23 -0
  93. package/build/services/router/throttling/index.js +76 -0
  94. package/build/services/search/index.d.ts +2 -1
  95. package/build/services/search/providers/postgres/postgres.d.ts +2 -1
  96. package/build/services/search/providers/postgres/postgres.js +149 -1
  97. package/build/services/search/providers/redis/ioredis.d.ts +1 -0
  98. package/build/services/search/providers/redis/ioredis.js +121 -1
  99. package/build/services/search/providers/redis/redis.d.ts +1 -0
  100. package/build/services/search/providers/redis/redis.js +134 -1
  101. package/build/services/serializer/index.js +282 -1
  102. package/build/services/store/providers/postgres/kvsql.d.ts +1 -1
  103. package/build/services/store/providers/postgres/kvsql.js +198 -1
  104. package/build/services/store/providers/postgres/kvtables.js +441 -1
  105. package/build/services/store/providers/postgres/kvtransaction.js +248 -1
  106. package/build/services/store/providers/postgres/kvtypes/hash.d.ts +1 -1
  107. package/build/services/store/providers/postgres/kvtypes/hash.js +1287 -1
  108. package/build/services/store/providers/postgres/kvtypes/list.js +194 -1
  109. package/build/services/store/providers/postgres/kvtypes/string.js +115 -1
  110. package/build/services/store/providers/postgres/kvtypes/zset.js +214 -1
  111. package/build/services/store/providers/postgres/postgres.js +1036 -1
  112. package/build/services/store/providers/redis/_base.js +980 -1
  113. package/build/services/store/providers/redis/ioredis.js +180 -1
  114. package/build/services/store/providers/redis/redis.js +199 -1
  115. package/build/services/store/providers/store-initializable.js +2 -1
  116. package/build/services/stream/index.d.ts +5 -0
  117. package/build/services/stream/providers/nats/nats.d.ts +1 -0
  118. package/build/services/stream/providers/nats/nats.js +225 -1
  119. package/build/services/stream/providers/postgres/kvtables.d.ts +1 -0
  120. package/build/services/stream/providers/postgres/kvtables.js +146 -1
  121. package/build/services/stream/providers/postgres/postgres.d.ts +19 -0
  122. package/build/services/stream/providers/postgres/postgres.js +519 -1
  123. package/build/services/stream/providers/redis/ioredis.d.ts +1 -0
  124. package/build/services/stream/providers/redis/ioredis.js +272 -1
  125. package/build/services/stream/providers/redis/redis.d.ts +1 -0
  126. package/build/services/stream/providers/redis/redis.js +305 -1
  127. package/build/services/stream/providers/stream-initializable.js +2 -1
  128. package/build/services/sub/providers/nats/nats.js +105 -1
  129. package/build/services/sub/providers/postgres/postgres.js +92 -1
  130. package/build/services/sub/providers/redis/ioredis.js +81 -1
  131. package/build/services/sub/providers/redis/redis.js +72 -1
  132. package/build/services/task/index.js +206 -1
  133. package/build/services/telemetry/index.js +306 -1
  134. package/build/services/worker/index.js +197 -1
  135. package/build/types/error.d.ts +5 -5
  136. package/build/types/exporter.d.ts +1 -1
  137. package/build/types/index.d.ts +3 -3
  138. package/build/types/manifest.d.ts +2 -2
  139. package/build/types/{meshflow.d.ts → memflow.d.ts} +15 -15
  140. package/build/types/meshdata.d.ts +3 -3
  141. package/build/types/postgres.d.ts +7 -0
  142. package/build/types/stream.d.ts +3 -0
  143. package/index.ts +11 -11
  144. package/package.json +22 -21
  145. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -38
  146. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
  147. package/build/services/meshflow/exporter.js +0 -1
  148. package/build/services/meshflow/workflow/common.d.ts +0 -18
  149. package/build/services/meshflow/workflow/common.js +0 -45
  150. package/typedoc.json +0 -46
  151. package/types/activity.ts +0 -268
  152. package/types/app.ts +0 -20
  153. package/types/async.ts +0 -6
  154. package/types/cache.ts +0 -1
  155. package/types/collator.ts +0 -9
  156. package/types/error.ts +0 -56
  157. package/types/exporter.ts +0 -102
  158. package/types/hook.ts +0 -44
  159. package/types/hotmesh.ts +0 -314
  160. package/types/index.ts +0 -306
  161. package/types/job.ts +0 -233
  162. package/types/logger.ts +0 -8
  163. package/types/manifest.ts +0 -70
  164. package/types/map.ts +0 -5
  165. package/types/meshcall.ts +0 -235
  166. package/types/meshdata.ts +0 -278
  167. package/types/meshflow.ts +0 -645
  168. package/types/ms.d.ts +0 -7
  169. package/types/nats.ts +0 -270
  170. package/types/pipe.ts +0 -90
  171. package/types/postgres.ts +0 -105
  172. package/types/provider.ts +0 -161
  173. package/types/quorum.ts +0 -167
  174. package/types/redis.ts +0 -404
  175. package/types/serializer.ts +0 -40
  176. package/types/stats.ts +0 -117
  177. package/types/stream.ts +0 -227
  178. package/types/task.ts +0 -7
  179. package/types/telemetry.ts +0 -16
  180. package/types/transition.ts +0 -20
  181. /package/build/services/{meshflow → memflow}/workflow/all.d.ts +0 -0
  182. /package/build/services/{meshflow → memflow}/workflow/all.js +0 -0
  183. /package/build/services/{meshflow → memflow}/workflow/context.d.ts +0 -0
  184. /package/build/services/{meshflow → memflow}/workflow/context.js +0 -0
  185. /package/build/services/{meshflow → memflow}/workflow/didRun.d.ts +0 -0
  186. /package/build/services/{meshflow → memflow}/workflow/didRun.js +0 -0
  187. /package/build/services/{meshflow → memflow}/workflow/emit.d.ts +0 -0
  188. /package/build/services/{meshflow → memflow}/workflow/emit.js +0 -0
  189. /package/build/services/{meshflow → memflow}/workflow/enrich.d.ts +0 -0
  190. /package/build/services/{meshflow → memflow}/workflow/enrich.js +0 -0
  191. /package/build/services/{meshflow → memflow}/workflow/execChild.d.ts +0 -0
  192. /package/build/services/{meshflow → memflow}/workflow/hook.d.ts +0 -0
  193. /package/build/services/{meshflow → memflow}/workflow/interrupt.d.ts +0 -0
  194. /package/build/services/{meshflow → memflow}/workflow/interrupt.js +0 -0
  195. /package/build/services/{meshflow → memflow}/workflow/isSideEffectAllowed.d.ts +0 -0
  196. /package/build/services/{meshflow → memflow}/workflow/isSideEffectAllowed.js +0 -0
  197. /package/build/services/{meshflow → memflow}/workflow/random.d.ts +0 -0
  198. /package/build/services/{meshflow → memflow}/workflow/random.js +0 -0
  199. /package/build/services/{meshflow → memflow}/workflow/searchMethods.d.ts +0 -0
  200. /package/build/services/{meshflow → memflow}/workflow/searchMethods.js +0 -0
  201. /package/build/services/{meshflow → memflow}/workflow/signal.d.ts +0 -0
  202. /package/build/services/{meshflow → memflow}/workflow/signal.js +0 -0
  203. /package/build/services/{meshflow → memflow}/workflow/sleepFor.d.ts +0 -0
  204. /package/build/services/{meshflow → memflow}/workflow/trace.d.ts +0 -0
  205. /package/build/services/{meshflow → memflow}/workflow/trace.js +0 -0
  206. /package/build/services/{meshflow → memflow}/workflow/waitFor.d.ts +0 -0
  207. /package/build/types/{meshflow.js → memflow.js} +0 -0
@@ -1,2 +1,3 @@
1
1
  import { ILogger } from '../../../logger';
2
2
  export declare function deploySchema(streamClient: any, appId: string, logger: ILogger): Promise<void>;
3
+ export declare function getNotificationChannelName(streamName: string, groupName: string): string;
@@ -1 +1,146 @@
1
- 'use strict';const q=b;(function(c,d){const m=b,e=c();while(!![]){try{const f=-parseInt(m(0x188))/0x1+parseInt(m(0x194))/0x2+parseInt(m(0x191))/0x3*(parseInt(m(0x183))/0x4)+parseInt(m(0x17c))/0x5*(-parseInt(m(0x18f))/0x6)+parseInt(m(0x18e))/0x7+-parseInt(m(0x18d))/0x8+-parseInt(m(0x195))/0x9*(-parseInt(m(0x17d))/0xa);if(f===d)break;else e['push'](e['shift']());}catch(g){e['push'](e['shift']());}}}(a,0xeddea));function b(c,d){const e=a();return b=function(f,g){f=f-0x17c;let h=e[f];return h;},b(c,d);}async function deploySchema(c,d,f){const n=b,g=n(0x181)in c&&n(0x17e)in c?await c[n(0x181)]():c,h=n(0x17e)in c;try{const i=getAdvisoryLockId(d);if(!(await g[n(0x192)](n(0x19d),[i]))[n(0x198)][0x0][n(0x189)])throw new Error('Table\x20deployment\x20in\x20progress\x20by\x20another\x20process.');{await g[n(0x192)](n(0x190));const j=d[n(0x17f)](/[^a-zA-Z0-9_]/g,'_'),k=j+'.streams';await createTables(g,j,k),await g[n(0x192)]('COMMIT'),await g['query'](n(0x180),[i]);}}catch(l){throw f[n(0x199)](n(0x186),{'error':l}),l;}finally{h&&await g[n(0x17e)]();}}function a(){const r=['rows','error','\x0a\x20\x20\x20\x20\x20\x20FOR\x20VALUES\x20WITH\x20(modulus\x208,\x20remainder\x20','__esModule','CREATE\x20SCHEMA\x20IF\x20NOT\x20EXISTS\x20','SELECT\x20pg_try_advisory_lock($1)\x20AS\x20locked','abs','\x20(\x0a\x20\x20\x20\x20\x20\x20id\x20BIGSERIAL,\x0a\x20\x20\x20\x20\x20\x20stream_name\x20TEXT\x20NOT\x20NULL,\x0a\x20\x20\x20\x20\x20\x20group_name\x20TEXT\x20NOT\x20NULL\x20DEFAULT\x20\x27ENGINE\x27,\x0a\x20\x20\x20\x20\x20\x20message\x20TEXT\x20NOT\x20NULL,\x0a\x20\x20\x20\x20\x20\x20created_at\x20TIMESTAMPTZ\x20DEFAULT\x20NOW(),\x0a\x20\x20\x20\x20\x20\x20reserved_at\x20TIMESTAMPTZ,\x0a\x20\x20\x20\x20\x20\x20reserved_by\x20TEXT,\x0a\x20\x20\x20\x20\x20\x20expired_at\x20TIMESTAMPTZ,\x0a\x20\x20\x20\x20\x20\x20PRIMARY\x20KEY\x20(stream_name,\x20id)\x0a\x20\x20\x20\x20)\x20PARTITION\x20BY\x20HASH\x20(stream_name);\x0a\x20\x20','445fJhQsm','10FGSthe','release','replace','SELECT\x20pg_advisory_unlock($1)','connect','\x0a\x20\x20\x20\x20CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20idx_streams_expired_at\x20\x0a\x20\x20\x20\x20ON\x20','22720zAeqOr','deploySchema','\x0a\x20\x20\x20\x20CREATE\x20TABLE\x20IF\x20NOT\x20EXISTS\x20','Error\x20deploying\x20schema','length','615963umCfKL','locked','\x20(group_name,\x20stream_name,\x20reserved_at,\x20id)\x0a\x20\x20\x20\x20WHERE\x20reserved_at\x20IS\x20NULL\x20AND\x20expired_at\x20IS\x20NULL;\x0a\x20\x20','charCodeAt',');\x0a\x20\x20\x20\x20','5679472Hhquqq','3812613sejpXO','90084YBtADi','BEGIN','582JXhHOY','query','\x0a\x20\x20\x20\x20\x20\x20CREATE\x20TABLE\x20IF\x20NOT\x20EXISTS\x20','2143808RWLfnk','8261766NVUIKN','defineProperty','.streams_part_'];a=function(){return r;};return a();}function getAdvisoryLockId(c){return hashStringToInt(c);}function hashStringToInt(c){const o=b;let d=0x0;for(let f=0x0;f<c[o(0x187)];f++)d=(d<<0x5)-d+c[o(0x18b)](f),d|=0x0;return Math[o(0x19e)](d);}async function createTables(c,d,f){const p=b;await c[p(0x192)](p(0x19c)+d+';'),await c[p(0x192)](p(0x185)+f+p(0x19f));for(let g=0x0;g<0x8;g++){const h=d+p(0x197)+g;await c['query'](p(0x193)+h+'\x0a\x20\x20\x20\x20\x20\x20PARTITION\x20OF\x20'+f+p(0x19a)+g+p(0x18c));}await c['query']('\x0a\x20\x20\x20\x20CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20idx_streams_active_messages\x20\x0a\x20\x20\x20\x20ON\x20'+f+p(0x18a)),await c['query'](p(0x182)+f+'\x20(expired_at);\x0a\x20\x20'),await c[p(0x192)]('\x0a\x20\x20\x20\x20CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20idx_stream_name_expired_at\x0a\x20\x20\x20\x20ON\x20'+f+'\x20(stream_name)\x0a\x20\x20\x20\x20WHERE\x20expired_at\x20IS\x20NULL;\x0a\x20\x20');}Object[q(0x196)](exports,q(0x19b),{'value':!0x0}),exports['deploySchema']=void 0x0,exports[q(0x184)]=deploySchema;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getNotificationChannelName = exports.deploySchema = void 0;
4
+ async function deploySchema(streamClient, appId, logger) {
5
+ const client = 'connect' in streamClient && 'release' in streamClient
6
+ ? await streamClient.connect()
7
+ : streamClient;
8
+ const releaseClient = 'release' in streamClient;
9
+ try {
10
+ const lockId = getAdvisoryLockId(appId);
11
+ const lockResult = await client.query('SELECT pg_try_advisory_lock($1) AS locked', [lockId]);
12
+ if (lockResult.rows[0].locked) {
13
+ await client.query('BEGIN');
14
+ const schemaName = appId.replace(/[^a-zA-Z0-9_]/g, '_');
15
+ const tableName = `${schemaName}.streams`;
16
+ await createTables(client, schemaName, tableName);
17
+ await createNotificationTriggers(client, schemaName, tableName);
18
+ await client.query('COMMIT');
19
+ await client.query('SELECT pg_advisory_unlock($1)', [lockId]);
20
+ }
21
+ else {
22
+ throw new Error('Table deployment in progress by another process.');
23
+ }
24
+ }
25
+ catch (error) {
26
+ logger.error('Error deploying schema', { error });
27
+ throw error;
28
+ }
29
+ finally {
30
+ if (releaseClient) {
31
+ await client.release();
32
+ }
33
+ }
34
+ }
35
+ exports.deploySchema = deploySchema;
36
+ function getAdvisoryLockId(appId) {
37
+ return hashStringToInt(appId);
38
+ }
39
+ function hashStringToInt(str) {
40
+ let hash = 0;
41
+ for (let i = 0; i < str.length; i++) {
42
+ hash = (hash << 5) - hash + str.charCodeAt(i);
43
+ hash |= 0; // Convert to 32-bit integer
44
+ }
45
+ return Math.abs(hash);
46
+ }
47
+ async function createTables(client, schemaName, tableName) {
48
+ await client.query(`CREATE SCHEMA IF NOT EXISTS ${schemaName};`);
49
+ // Main table creation with partitions
50
+ await client.query(`
51
+ CREATE TABLE IF NOT EXISTS ${tableName} (
52
+ id BIGSERIAL,
53
+ stream_name TEXT NOT NULL,
54
+ group_name TEXT NOT NULL DEFAULT 'ENGINE',
55
+ message TEXT NOT NULL,
56
+ created_at TIMESTAMPTZ DEFAULT NOW(),
57
+ reserved_at TIMESTAMPTZ,
58
+ reserved_by TEXT,
59
+ expired_at TIMESTAMPTZ,
60
+ PRIMARY KEY (stream_name, id)
61
+ ) PARTITION BY HASH (stream_name);
62
+ `);
63
+ for (let i = 0; i < 8; i++) {
64
+ const partitionTableName = `${schemaName}.streams_part_${i}`;
65
+ await client.query(`
66
+ CREATE TABLE IF NOT EXISTS ${partitionTableName}
67
+ PARTITION OF ${tableName}
68
+ FOR VALUES WITH (modulus 8, remainder ${i});
69
+ `);
70
+ }
71
+ // Index for active messages
72
+ await client.query(`
73
+ CREATE INDEX IF NOT EXISTS idx_streams_active_messages
74
+ ON ${tableName} (group_name, stream_name, reserved_at, id)
75
+ WHERE reserved_at IS NULL AND expired_at IS NULL;
76
+ `);
77
+ // Optimized index for the simplified fetchMessages query
78
+ await client.query(`
79
+ CREATE INDEX IF NOT EXISTS idx_streams_message_fetch
80
+ ON ${tableName} (stream_name, group_name, id)
81
+ WHERE expired_at IS NULL;
82
+ `);
83
+ // Index for expired messages
84
+ await client.query(`
85
+ CREATE INDEX IF NOT EXISTS idx_streams_expired_at
86
+ ON ${tableName} (expired_at);
87
+ `);
88
+ // New index for stream stats optimization
89
+ await client.query(`
90
+ CREATE INDEX IF NOT EXISTS idx_stream_name_expired_at
91
+ ON ${tableName} (stream_name)
92
+ WHERE expired_at IS NULL;
93
+ `);
94
+ // TODO: revisit this index when solving automated cleanup
95
+ // Optional index for querying by creation time, if needed
96
+ // await client.query(`
97
+ // CREATE INDEX IF NOT EXISTS idx_streams_created_at
98
+ // ON ${tableName} (created_at);
99
+ // `);
100
+ }
101
+ async function createNotificationTriggers(client, schemaName, tableName) {
102
+ // Create the notification function
103
+ await client.query(`
104
+ CREATE OR REPLACE FUNCTION ${schemaName}.notify_new_stream_message()
105
+ RETURNS TRIGGER AS $$
106
+ DECLARE
107
+ channel_name TEXT;
108
+ payload JSON;
109
+ BEGIN
110
+ -- Create channel name: stream_{stream_name}_{group_name}
111
+ -- Truncate if too long (PostgreSQL channel names limited to 63 chars)
112
+ channel_name := 'stream_' || NEW.stream_name || '_' || NEW.group_name;
113
+ IF length(channel_name) > 63 THEN
114
+ channel_name := left(channel_name, 63);
115
+ END IF;
116
+
117
+ -- Create payload with message details
118
+ payload := json_build_object(
119
+ 'id', NEW.id,
120
+ 'stream_name', NEW.stream_name,
121
+ 'group_name', NEW.group_name,
122
+ 'created_at', extract(epoch from NEW.created_at)
123
+ );
124
+
125
+ -- Send notification
126
+ PERFORM pg_notify(channel_name, payload::text);
127
+
128
+ RETURN NEW;
129
+ END;
130
+ $$ LANGUAGE plpgsql;
131
+ `);
132
+ // Create trigger only on the main table - it will automatically apply to all partitions
133
+ await client.query(`
134
+ DROP TRIGGER IF EXISTS notify_stream_insert ON ${tableName};
135
+ CREATE TRIGGER notify_stream_insert
136
+ AFTER INSERT ON ${tableName}
137
+ FOR EACH ROW
138
+ EXECUTE FUNCTION ${schemaName}.notify_new_stream_message();
139
+ `);
140
+ }
141
+ function getNotificationChannelName(streamName, groupName) {
142
+ const channelName = `stream_${streamName}_${groupName}`;
143
+ // PostgreSQL channel names are limited to 63 characters
144
+ return channelName.length > 63 ? channelName.substring(0, 63) : channelName;
145
+ }
146
+ exports.getNotificationChannelName = getNotificationChannelName;
@@ -9,8 +9,19 @@ declare class PostgresStreamService extends StreamService<PostgresClientType & P
9
9
  namespace: string;
10
10
  appId: string;
11
11
  logger: ILogger;
12
+ private notificationConsumers;
13
+ private notificationHandlerBound;
14
+ private fallbackIntervalId;
12
15
  constructor(streamClient: PostgresClientType & ProviderClient, storeClient: ProviderClient, config?: StreamConfig);
13
16
  init(namespace: string, appId: string, logger: ILogger): Promise<void>;
17
+ private isNotificationsEnabled;
18
+ private getFallbackInterval;
19
+ private getNotificationTimeout;
20
+ private startFallbackPoller;
21
+ private checkForMissedMessages;
22
+ private handleNotification;
23
+ private fetchAndDeliverMessages;
24
+ private getConsumerKey;
14
25
  mintKey(type: KeyType, params: KeyStoreParams): string;
15
26
  transact(): ProviderTransaction;
16
27
  getTableName(): string;
@@ -50,7 +61,13 @@ declare class PostgresStreamService extends StreamService<PostgresClientType & P
50
61
  initialBackoff?: number;
51
62
  maxBackoff?: number;
52
63
  maxRetries?: number;
64
+ enableNotifications?: boolean;
65
+ notificationCallback?: (messages: StreamMessage[]) => void;
53
66
  }): Promise<StreamMessage[]>;
67
+ private shouldUseNotifications;
68
+ private setupNotificationConsumer;
69
+ stopNotificationConsumer(streamName: string, groupName: string): Promise<void>;
70
+ private fetchMessages;
54
71
  ackAndDelete(streamName: string, groupName: string, messageIds: string[]): Promise<number>;
55
72
  acknowledgeMessages(streamName: string, groupName: string, messageIds: string[], options?: StringAnyType): Promise<number>;
56
73
  deleteMessages(streamName: string, groupName: string, messageIds: string[], options?: StringAnyType): Promise<number>;
@@ -81,8 +98,10 @@ declare class PostgresStreamService extends StreamService<PostgresClientType & P
81
98
  supportsOrdering: boolean;
82
99
  supportsTrimming: boolean;
83
100
  supportsRetry: boolean;
101
+ supportsNotifications: boolean;
84
102
  maxMessageSize: number;
85
103
  maxBatchSize: number;
86
104
  };
105
+ cleanup(): Promise<void>;
87
106
  }
88
107
  export { PostgresStreamService };