@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.
- package/README.md +128 -823
- package/build/index.d.ts +9 -9
- package/build/index.js +10 -10
- package/build/modules/enums.d.ts +23 -23
- package/build/modules/enums.js +26 -26
- package/build/modules/errors.d.ts +16 -16
- package/build/modules/errors.js +28 -28
- package/build/modules/key.js +190 -1
- package/build/modules/utils.js +374 -1
- package/build/package.json +22 -21
- package/build/services/activities/activity.js +549 -1
- package/build/services/activities/await.js +114 -1
- package/build/services/activities/cycle.js +112 -1
- package/build/services/activities/hook.js +168 -1
- package/build/services/activities/index.js +20 -1
- package/build/services/activities/interrupt.js +158 -1
- package/build/services/activities/signal.js +134 -1
- package/build/services/activities/trigger.js +246 -1
- package/build/services/activities/worker.js +106 -1
- package/build/services/collator/index.js +293 -1
- package/build/services/compiler/deployer.js +488 -1
- package/build/services/compiler/index.js +112 -1
- package/build/services/compiler/validator.js +147 -1
- package/build/services/engine/index.js +761 -1
- package/build/services/exporter/index.js +126 -1
- package/build/services/hotmesh/index.d.ts +160 -17
- package/build/services/hotmesh/index.js +160 -17
- package/build/services/mapper/index.js +81 -1
- package/build/services/{meshflow → memflow}/client.d.ts +3 -3
- package/build/services/{meshflow → memflow}/client.js +17 -16
- package/build/services/{meshflow → memflow}/connection.d.ts +2 -2
- package/build/services/{meshflow → memflow}/connection.js +1 -1
- package/build/services/memflow/context.d.ts +143 -0
- package/build/services/memflow/context.js +299 -0
- package/build/services/{meshflow → memflow}/exporter.d.ts +6 -6
- package/build/services/memflow/exporter.js +215 -0
- package/build/services/{meshflow → memflow}/handle.d.ts +4 -4
- package/build/services/{meshflow → memflow}/handle.js +2 -2
- package/build/services/{meshflow → memflow}/index.d.ts +18 -13
- package/build/services/{meshflow → memflow}/index.js +26 -21
- package/build/services/{meshflow → memflow}/schemas/factory.d.ts +4 -4
- package/build/services/{meshflow → memflow}/schemas/factory.js +5 -5
- package/build/services/{meshflow → memflow}/search.d.ts +1 -1
- package/build/services/{meshflow → memflow}/search.js +4 -4
- package/build/services/{meshflow → memflow}/worker.d.ts +5 -5
- package/build/services/{meshflow → memflow}/worker.js +24 -24
- package/build/services/memflow/workflow/common.d.ts +20 -0
- package/build/services/memflow/workflow/common.js +47 -0
- package/build/services/memflow/workflow/contextMethods.d.ts +14 -0
- package/build/services/memflow/workflow/contextMethods.js +33 -0
- package/build/services/{meshflow → memflow}/workflow/execChild.js +12 -12
- package/build/services/memflow/workflow/execHook.d.ts +65 -0
- package/build/services/memflow/workflow/execHook.js +73 -0
- package/build/services/{meshflow → memflow}/workflow/hook.js +19 -3
- package/build/services/{meshflow → memflow}/workflow/index.d.ts +7 -3
- package/build/services/{meshflow → memflow}/workflow/index.js +7 -3
- package/build/services/{meshflow → memflow}/workflow/proxyActivities.d.ts +2 -2
- package/build/services/{meshflow → memflow}/workflow/proxyActivities.js +8 -8
- package/build/services/{meshflow → memflow}/workflow/sleepFor.js +2 -2
- package/build/services/{meshflow → memflow}/workflow/waitFor.js +2 -2
- package/build/services/meshdata/index.d.ts +24 -24
- package/build/services/meshdata/index.js +40 -40
- package/build/services/pipe/functions/array.js +74 -1
- package/build/services/pipe/functions/bitwise.js +24 -1
- package/build/services/pipe/functions/conditional.js +36 -1
- package/build/services/pipe/functions/cron.js +40 -1
- package/build/services/pipe/functions/date.js +171 -1
- package/build/services/pipe/functions/index.js +30 -1
- package/build/services/pipe/functions/json.js +12 -1
- package/build/services/pipe/functions/logical.js +12 -1
- package/build/services/pipe/functions/math.js +184 -1
- package/build/services/pipe/functions/number.js +60 -1
- package/build/services/pipe/functions/object.js +81 -1
- package/build/services/pipe/functions/string.js +69 -1
- package/build/services/pipe/functions/symbol.js +33 -1
- package/build/services/pipe/functions/unary.js +18 -1
- package/build/services/pipe/index.js +242 -1
- package/build/services/quorum/index.js +263 -1
- package/build/services/reporter/index.js +348 -1
- package/build/services/router/config/index.d.ts +11 -0
- package/build/services/router/config/index.js +36 -0
- package/build/services/router/consumption/index.d.ts +34 -0
- package/build/services/router/consumption/index.js +395 -0
- package/build/services/router/error-handling/index.d.ts +8 -0
- package/build/services/router/error-handling/index.js +98 -0
- package/build/services/router/index.d.ts +13 -16
- package/build/services/router/index.js +121 -1
- package/build/services/router/lifecycle/index.d.ts +27 -0
- package/build/services/router/lifecycle/index.js +80 -0
- package/build/services/router/telemetry/index.d.ts +11 -0
- package/build/services/router/telemetry/index.js +32 -0
- package/build/services/router/throttling/index.d.ts +23 -0
- package/build/services/router/throttling/index.js +76 -0
- package/build/services/search/index.d.ts +2 -1
- package/build/services/search/providers/postgres/postgres.d.ts +2 -1
- package/build/services/search/providers/postgres/postgres.js +149 -1
- package/build/services/search/providers/redis/ioredis.d.ts +1 -0
- package/build/services/search/providers/redis/ioredis.js +121 -1
- package/build/services/search/providers/redis/redis.d.ts +1 -0
- package/build/services/search/providers/redis/redis.js +134 -1
- package/build/services/serializer/index.js +282 -1
- package/build/services/store/providers/postgres/kvsql.d.ts +1 -1
- package/build/services/store/providers/postgres/kvsql.js +198 -1
- package/build/services/store/providers/postgres/kvtables.js +441 -1
- package/build/services/store/providers/postgres/kvtransaction.js +248 -1
- package/build/services/store/providers/postgres/kvtypes/hash.d.ts +1 -1
- package/build/services/store/providers/postgres/kvtypes/hash.js +1287 -1
- package/build/services/store/providers/postgres/kvtypes/list.js +194 -1
- package/build/services/store/providers/postgres/kvtypes/string.js +115 -1
- package/build/services/store/providers/postgres/kvtypes/zset.js +214 -1
- package/build/services/store/providers/postgres/postgres.js +1036 -1
- package/build/services/store/providers/redis/_base.js +980 -1
- package/build/services/store/providers/redis/ioredis.js +180 -1
- package/build/services/store/providers/redis/redis.js +199 -1
- package/build/services/store/providers/store-initializable.js +2 -1
- package/build/services/stream/index.d.ts +5 -0
- package/build/services/stream/providers/nats/nats.d.ts +1 -0
- package/build/services/stream/providers/nats/nats.js +225 -1
- package/build/services/stream/providers/postgres/kvtables.d.ts +1 -0
- package/build/services/stream/providers/postgres/kvtables.js +146 -1
- package/build/services/stream/providers/postgres/postgres.d.ts +19 -0
- package/build/services/stream/providers/postgres/postgres.js +519 -1
- package/build/services/stream/providers/redis/ioredis.d.ts +1 -0
- package/build/services/stream/providers/redis/ioredis.js +272 -1
- package/build/services/stream/providers/redis/redis.d.ts +1 -0
- package/build/services/stream/providers/redis/redis.js +305 -1
- package/build/services/stream/providers/stream-initializable.js +2 -1
- package/build/services/sub/providers/nats/nats.js +105 -1
- package/build/services/sub/providers/postgres/postgres.js +92 -1
- package/build/services/sub/providers/redis/ioredis.js +81 -1
- package/build/services/sub/providers/redis/redis.js +72 -1
- package/build/services/task/index.js +206 -1
- package/build/services/telemetry/index.js +306 -1
- package/build/services/worker/index.js +197 -1
- package/build/types/error.d.ts +5 -5
- package/build/types/exporter.d.ts +1 -1
- package/build/types/index.d.ts +3 -3
- package/build/types/manifest.d.ts +2 -2
- package/build/types/{meshflow.d.ts → memflow.d.ts} +15 -15
- package/build/types/meshdata.d.ts +3 -3
- package/build/types/postgres.d.ts +7 -0
- package/build/types/stream.d.ts +3 -0
- package/index.ts +11 -11
- package/package.json +22 -21
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -38
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
- package/build/services/meshflow/exporter.js +0 -1
- package/build/services/meshflow/workflow/common.d.ts +0 -18
- package/build/services/meshflow/workflow/common.js +0 -45
- package/typedoc.json +0 -46
- package/types/activity.ts +0 -268
- package/types/app.ts +0 -20
- package/types/async.ts +0 -6
- package/types/cache.ts +0 -1
- package/types/collator.ts +0 -9
- package/types/error.ts +0 -56
- package/types/exporter.ts +0 -102
- package/types/hook.ts +0 -44
- package/types/hotmesh.ts +0 -314
- package/types/index.ts +0 -306
- package/types/job.ts +0 -233
- package/types/logger.ts +0 -8
- package/types/manifest.ts +0 -70
- package/types/map.ts +0 -5
- package/types/meshcall.ts +0 -235
- package/types/meshdata.ts +0 -278
- package/types/meshflow.ts +0 -645
- package/types/ms.d.ts +0 -7
- package/types/nats.ts +0 -270
- package/types/pipe.ts +0 -90
- package/types/postgres.ts +0 -105
- package/types/provider.ts +0 -161
- package/types/quorum.ts +0 -167
- package/types/redis.ts +0 -404
- package/types/serializer.ts +0 -40
- package/types/stats.ts +0 -117
- package/types/stream.ts +0 -227
- package/types/task.ts +0 -7
- package/types/telemetry.ts +0 -16
- package/types/transition.ts +0 -20
- /package/build/services/{meshflow → memflow}/workflow/all.d.ts +0 -0
- /package/build/services/{meshflow → memflow}/workflow/all.js +0 -0
- /package/build/services/{meshflow → memflow}/workflow/context.d.ts +0 -0
- /package/build/services/{meshflow → memflow}/workflow/context.js +0 -0
- /package/build/services/{meshflow → memflow}/workflow/didRun.d.ts +0 -0
- /package/build/services/{meshflow → memflow}/workflow/didRun.js +0 -0
- /package/build/services/{meshflow → memflow}/workflow/emit.d.ts +0 -0
- /package/build/services/{meshflow → memflow}/workflow/emit.js +0 -0
- /package/build/services/{meshflow → memflow}/workflow/enrich.d.ts +0 -0
- /package/build/services/{meshflow → memflow}/workflow/enrich.js +0 -0
- /package/build/services/{meshflow → memflow}/workflow/execChild.d.ts +0 -0
- /package/build/services/{meshflow → memflow}/workflow/hook.d.ts +0 -0
- /package/build/services/{meshflow → memflow}/workflow/interrupt.d.ts +0 -0
- /package/build/services/{meshflow → memflow}/workflow/interrupt.js +0 -0
- /package/build/services/{meshflow → memflow}/workflow/isSideEffectAllowed.d.ts +0 -0
- /package/build/services/{meshflow → memflow}/workflow/isSideEffectAllowed.js +0 -0
- /package/build/services/{meshflow → memflow}/workflow/random.d.ts +0 -0
- /package/build/services/{meshflow → memflow}/workflow/random.js +0 -0
- /package/build/services/{meshflow → memflow}/workflow/searchMethods.d.ts +0 -0
- /package/build/services/{meshflow → memflow}/workflow/searchMethods.js +0 -0
- /package/build/services/{meshflow → memflow}/workflow/signal.d.ts +0 -0
- /package/build/services/{meshflow → memflow}/workflow/signal.js +0 -0
- /package/build/services/{meshflow → memflow}/workflow/sleepFor.d.ts +0 -0
- /package/build/services/{meshflow → memflow}/workflow/trace.d.ts +0 -0
- /package/build/services/{meshflow → memflow}/workflow/trace.js +0 -0
- /package/build/services/{meshflow → memflow}/workflow/waitFor.d.ts +0 -0
- /package/build/types/{meshflow.js → memflow.js} +0 -0
|
@@ -1 +1,146 @@
|
|
|
1
|
-
|
|
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 };
|