@motiadev/adapter-redis-streams 0.8.2-beta.140-460356 → 0.8.2-beta.140-428722
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 +10 -3
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/redis-stream-adapter-manager.d.ts +12 -0
- package/dist/redis-stream-adapter-manager.d.ts.map +1 -0
- package/dist/redis-stream-adapter-manager.js +60 -0
- package/dist/redis-stream-adapter.d.ts +4 -7
- package/dist/redis-stream-adapter.d.ts.map +1 -1
- package/dist/redis-stream-adapter.js +27 -106
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -14,11 +14,11 @@ Configure the Redis streams adapter in your `motia.config.ts`:
|
|
|
14
14
|
|
|
15
15
|
```typescript
|
|
16
16
|
import { config } from '@motiadev/core'
|
|
17
|
-
import {
|
|
17
|
+
import { RedisStreamAdapterManager } from '@motiadev/adapter-redis-streams'
|
|
18
18
|
|
|
19
19
|
export default config({
|
|
20
20
|
adapters: {
|
|
21
|
-
streams:
|
|
21
|
+
streams: new RedisStreamAdapterManager({
|
|
22
22
|
host: process.env.REDIS_HOST || 'localhost',
|
|
23
23
|
port: parseInt(process.env.REDIS_PORT || '6379'),
|
|
24
24
|
password: process.env.REDIS_PASSWORD,
|
|
@@ -28,6 +28,8 @@ export default config({
|
|
|
28
28
|
})
|
|
29
29
|
```
|
|
30
30
|
|
|
31
|
+
The `RedisStreamAdapterManager` creates a **single shared Redis connection** that is reused across all streams, providing better resource efficiency than creating separate connections per stream.
|
|
32
|
+
|
|
31
33
|
## Configuration Options
|
|
32
34
|
|
|
33
35
|
### RedisStreamAdapterConfig
|
|
@@ -49,6 +51,7 @@ export default config({
|
|
|
49
51
|
- **Real-time Updates**: Pub/sub for instant data synchronization
|
|
50
52
|
- **Efficient Querying**: Support for filtering, sorting, and pagination
|
|
51
53
|
- **Automatic Reconnection**: Handles connection failures gracefully
|
|
54
|
+
- **Shared Connections**: Manager pattern provides single Redis connection reused across all streams
|
|
52
55
|
- **Connection Pooling**: Separate clients for pub/sub operations
|
|
53
56
|
- **Type Safety**: Full TypeScript support with generics
|
|
54
57
|
|
|
@@ -68,7 +71,9 @@ motia:stream:events:users:active
|
|
|
68
71
|
motia:stream:events:users:active:user-123
|
|
69
72
|
```
|
|
70
73
|
|
|
71
|
-
## Example
|
|
74
|
+
## Advanced Example
|
|
75
|
+
|
|
76
|
+
For direct adapter usage (not recommended for configuration), you can still instantiate adapters directly:
|
|
72
77
|
|
|
73
78
|
```typescript
|
|
74
79
|
import { RedisStreamAdapter } from '@motiadev/adapter-redis-streams'
|
|
@@ -90,6 +95,8 @@ const adapter = new RedisStreamAdapter('users', {
|
|
|
90
95
|
})
|
|
91
96
|
```
|
|
92
97
|
|
|
98
|
+
**Note:** For configuration in `motia.config.ts`, use `RedisStreamAdapterManager` instead (see Usage section above) to benefit from connection sharing across all streams.
|
|
99
|
+
|
|
93
100
|
## Real-time Updates
|
|
94
101
|
|
|
95
102
|
The adapter uses Redis pub/sub to notify all instances about stream changes:
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAC3D,YAAY,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAA;AAC1E,YAAY,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.RedisStreamAdapter = void 0;
|
|
3
|
+
exports.RedisStreamAdapterManager = exports.RedisStreamAdapter = void 0;
|
|
4
4
|
var redis_stream_adapter_1 = require("./redis-stream-adapter");
|
|
5
5
|
Object.defineProperty(exports, "RedisStreamAdapter", { enumerable: true, get: function () { return redis_stream_adapter_1.RedisStreamAdapter; } });
|
|
6
|
+
var redis_stream_adapter_manager_1 = require("./redis-stream-adapter-manager");
|
|
7
|
+
Object.defineProperty(exports, "RedisStreamAdapterManager", { enumerable: true, get: function () { return redis_stream_adapter_manager_1.RedisStreamAdapterManager; } });
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { StreamAdapter, StreamAdapterManager } from '@motiadev/core';
|
|
2
|
+
import type { RedisStreamAdapterConfig } from './types';
|
|
3
|
+
export declare class RedisStreamAdapterManager implements StreamAdapterManager {
|
|
4
|
+
private config;
|
|
5
|
+
private client;
|
|
6
|
+
private connected;
|
|
7
|
+
constructor(config: RedisStreamAdapterConfig);
|
|
8
|
+
private connect;
|
|
9
|
+
createStream<TData>(streamName: string): StreamAdapter<TData>;
|
|
10
|
+
shutdown(): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=redis-stream-adapter-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-stream-adapter-manager.d.ts","sourceRoot":"","sources":["../src/redis-stream-adapter-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AAGzE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAA;AAEvD,qBAAa,yBAA0B,YAAW,oBAAoB;IAIxD,OAAO,CAAC,MAAM;IAH1B,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,SAAS,CAAQ;gBAEL,MAAM,EAAE,wBAAwB;YAsCtC,OAAO;IAWrB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC;IAIvD,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAKhC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RedisStreamAdapterManager = void 0;
|
|
4
|
+
const redis_1 = require("redis");
|
|
5
|
+
const redis_stream_adapter_1 = require("./redis-stream-adapter");
|
|
6
|
+
class RedisStreamAdapterManager {
|
|
7
|
+
constructor(config) {
|
|
8
|
+
this.config = config;
|
|
9
|
+
this.connected = false;
|
|
10
|
+
const clientConfig = {
|
|
11
|
+
socket: {
|
|
12
|
+
host: config.host || 'localhost',
|
|
13
|
+
port: config.port || 6379,
|
|
14
|
+
reconnectStrategy: config.socket?.reconnectStrategy ||
|
|
15
|
+
((retries) => {
|
|
16
|
+
if (retries > 10) {
|
|
17
|
+
return new Error('Redis connection retry limit exceeded');
|
|
18
|
+
}
|
|
19
|
+
return Math.min(retries * 100, 3000);
|
|
20
|
+
}),
|
|
21
|
+
connectTimeout: config.socket?.connectTimeout || 10000,
|
|
22
|
+
},
|
|
23
|
+
password: config.password,
|
|
24
|
+
username: config.username,
|
|
25
|
+
database: config.database || 0,
|
|
26
|
+
};
|
|
27
|
+
this.client = (0, redis_1.createClient)(clientConfig);
|
|
28
|
+
this.client.on('error', (err) => {
|
|
29
|
+
console.error('[Redis Stream Manager] Client error:', err);
|
|
30
|
+
});
|
|
31
|
+
this.client.on('connect', () => {
|
|
32
|
+
this.connected = true;
|
|
33
|
+
});
|
|
34
|
+
this.client.on('disconnect', () => {
|
|
35
|
+
console.warn('[Redis Stream Manager] Disconnected');
|
|
36
|
+
this.connected = false;
|
|
37
|
+
});
|
|
38
|
+
this.connect();
|
|
39
|
+
}
|
|
40
|
+
async connect() {
|
|
41
|
+
if (!this.connected) {
|
|
42
|
+
try {
|
|
43
|
+
await this.client.connect();
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
console.error('[Redis Stream Manager] Failed to connect:', error);
|
|
47
|
+
throw error;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
createStream(streamName) {
|
|
52
|
+
return new redis_stream_adapter_1.RedisStreamAdapter(streamName, this.config, this.client);
|
|
53
|
+
}
|
|
54
|
+
async shutdown() {
|
|
55
|
+
if (this.client.isOpen) {
|
|
56
|
+
await this.client.quit();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
exports.RedisStreamAdapterManager = RedisStreamAdapterManager;
|
|
@@ -1,17 +1,15 @@
|
|
|
1
1
|
import type { BaseStreamItem, StateStreamEvent, StateStreamEventChannel } from '@motiadev/core';
|
|
2
2
|
import { StreamAdapter, type StreamQueryFilter } from '@motiadev/core';
|
|
3
|
+
import { type RedisClientType } from 'redis';
|
|
3
4
|
import type { RedisStreamAdapterConfig } from './types';
|
|
4
5
|
export declare class RedisStreamAdapter<TData> extends StreamAdapter<TData> {
|
|
5
6
|
private client;
|
|
6
|
-
private pubClient;
|
|
7
7
|
private subClient?;
|
|
8
8
|
private keyPrefix;
|
|
9
|
-
private
|
|
9
|
+
private groupPrefix;
|
|
10
10
|
private subscriptions;
|
|
11
|
-
constructor(streamName: string, config: RedisStreamAdapterConfig);
|
|
12
|
-
private
|
|
13
|
-
private ensureConnected;
|
|
14
|
-
private makeKey;
|
|
11
|
+
constructor(streamName: string, config: RedisStreamAdapterConfig, sharedClient: RedisClientType);
|
|
12
|
+
private makeGroupKey;
|
|
15
13
|
private makeChannelKey;
|
|
16
14
|
get(groupId: string, id: string): Promise<BaseStreamItem<TData> | null>;
|
|
17
15
|
set(groupId: string, id: string, data: TData): Promise<BaseStreamItem<TData>>;
|
|
@@ -22,7 +20,6 @@ export declare class RedisStreamAdapter<TData> extends StreamAdapter<TData> {
|
|
|
22
20
|
unsubscribe(channel: StateStreamEventChannel): Promise<void>;
|
|
23
21
|
clear(groupId: string): Promise<void>;
|
|
24
22
|
query(groupId: string, filter: StreamQueryFilter<TData>): Promise<BaseStreamItem<TData>[]>;
|
|
25
|
-
private scanKeys;
|
|
26
23
|
cleanup(): Promise<void>;
|
|
27
24
|
}
|
|
28
25
|
//# sourceMappingURL=redis-stream-adapter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redis-stream-adapter.d.ts","sourceRoot":"","sources":["../src/redis-stream-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAC/F,OAAO,EAAE,aAAa,EAAE,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"redis-stream-adapter.d.ts","sourceRoot":"","sources":["../src/redis-stream-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAC/F,OAAO,EAAE,aAAa,EAAE,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AACtE,OAAO,EAAgB,KAAK,eAAe,EAAE,MAAM,OAAO,CAAA;AAC1D,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAA;AAEvD,qBAAa,kBAAkB,CAAC,KAAK,CAAE,SAAQ,aAAa,CAAC,KAAK,CAAC;IACjE,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,SAAS,CAAC,CAAiB;IACnC,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,aAAa,CAAiF;gBAE1F,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,wBAAwB,EAAE,YAAY,EAAE,eAAe;IAQ/F,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,cAAc;IAMhB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IAMvE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,GAAG,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAgB7E,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IAa1E,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;IAO3D,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,uBAAuB,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAKpF,SAAS,CAAC,CAAC,EACf,OAAO,EAAE,uBAAuB,EAChC,OAAO,EAAE,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAC5D,OAAO,CAAC,IAAI,CAAC;IAmCV,WAAW,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC;IAa5D,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKrC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;IA+B1F,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B"}
|
|
@@ -4,65 +4,15 @@ exports.RedisStreamAdapter = void 0;
|
|
|
4
4
|
const core_1 = require("@motiadev/core");
|
|
5
5
|
const redis_1 = require("redis");
|
|
6
6
|
class RedisStreamAdapter extends core_1.StreamAdapter {
|
|
7
|
-
constructor(streamName, config) {
|
|
7
|
+
constructor(streamName, config, sharedClient) {
|
|
8
8
|
super(streamName);
|
|
9
|
-
this.connected = false;
|
|
10
9
|
this.subscriptions = new Map();
|
|
11
10
|
this.keyPrefix = config.keyPrefix || 'motia:stream:';
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
host: config.host || 'localhost',
|
|
15
|
-
port: config.port || 6379,
|
|
16
|
-
reconnectStrategy: config.socket?.reconnectStrategy ||
|
|
17
|
-
((retries) => {
|
|
18
|
-
if (retries > 10) {
|
|
19
|
-
return new Error('Redis connection retry limit exceeded');
|
|
20
|
-
}
|
|
21
|
-
return Math.min(retries * 100, 3000);
|
|
22
|
-
}),
|
|
23
|
-
connectTimeout: config.socket?.connectTimeout || 10000,
|
|
24
|
-
},
|
|
25
|
-
password: config.password,
|
|
26
|
-
username: config.username,
|
|
27
|
-
database: config.database || 0,
|
|
28
|
-
};
|
|
29
|
-
this.client = (0, redis_1.createClient)(clientConfig);
|
|
30
|
-
this.pubClient = (0, redis_1.createClient)(clientConfig);
|
|
31
|
-
this.client.on('error', (err) => {
|
|
32
|
-
console.error('[Redis Stream] Client error:', err);
|
|
33
|
-
});
|
|
34
|
-
this.client.on('connect', () => {
|
|
35
|
-
this.connected = true;
|
|
36
|
-
});
|
|
37
|
-
this.client.on('disconnect', () => {
|
|
38
|
-
console.warn('[Redis Stream] Disconnected');
|
|
39
|
-
this.connected = false;
|
|
40
|
-
});
|
|
41
|
-
this.pubClient.on('error', (err) => {
|
|
42
|
-
console.error('[Redis Stream] Pub client error:', err);
|
|
43
|
-
});
|
|
44
|
-
this.connect();
|
|
11
|
+
this.groupPrefix = `${this.keyPrefix}${streamName}:group:`;
|
|
12
|
+
this.client = sharedClient;
|
|
45
13
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
try {
|
|
49
|
-
await Promise.all([this.client.connect(), this.pubClient.connect()]);
|
|
50
|
-
}
|
|
51
|
-
catch (error) {
|
|
52
|
-
console.error('[Redis Stream] Failed to connect:', error);
|
|
53
|
-
throw error;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
async ensureConnected() {
|
|
58
|
-
if (!this.client.isOpen || !this.pubClient.isOpen) {
|
|
59
|
-
await this.connect();
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
makeKey(groupId, id) {
|
|
63
|
-
return id
|
|
64
|
-
? `${this.keyPrefix}${this.streamName}:${groupId}:${id}`
|
|
65
|
-
: `${this.keyPrefix}${this.streamName}:${groupId}`;
|
|
14
|
+
makeGroupKey(groupId) {
|
|
15
|
+
return `${this.groupPrefix}${groupId}`;
|
|
66
16
|
}
|
|
67
17
|
makeChannelKey(channel) {
|
|
68
18
|
return channel.id
|
|
@@ -70,42 +20,39 @@ class RedisStreamAdapter extends core_1.StreamAdapter {
|
|
|
70
20
|
: `motia:stream:events:${this.streamName}:${channel.groupId}`;
|
|
71
21
|
}
|
|
72
22
|
async get(groupId, id) {
|
|
73
|
-
|
|
74
|
-
const
|
|
75
|
-
const value = await this.client.get(key);
|
|
23
|
+
const hashKey = this.makeGroupKey(groupId);
|
|
24
|
+
const value = await this.client.hGet(hashKey, id);
|
|
76
25
|
return value ? JSON.parse(value) : null;
|
|
77
26
|
}
|
|
78
27
|
async set(groupId, id, data) {
|
|
79
|
-
|
|
80
|
-
const key = this.makeKey(groupId, id);
|
|
28
|
+
const hashKey = this.makeGroupKey(groupId);
|
|
81
29
|
const item = { ...data, id };
|
|
82
|
-
|
|
83
|
-
await this.
|
|
30
|
+
const itemJson = JSON.stringify(item);
|
|
31
|
+
const existed = await this.client.hExists(hashKey, id);
|
|
32
|
+
const eventType = existed ? 'update' : 'create';
|
|
33
|
+
await Promise.all([
|
|
34
|
+
this.client.hSet(hashKey, id, itemJson),
|
|
35
|
+
this.send({ groupId, id }, { type: eventType, data: item }),
|
|
36
|
+
]);
|
|
84
37
|
return item;
|
|
85
38
|
}
|
|
86
39
|
async delete(groupId, id) {
|
|
87
|
-
|
|
88
|
-
const
|
|
89
|
-
if (
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
}
|
|
40
|
+
const hashKey = this.makeGroupKey(groupId);
|
|
41
|
+
const value = await this.client.hGet(hashKey, id);
|
|
42
|
+
if (!value)
|
|
43
|
+
return null;
|
|
44
|
+
const item = JSON.parse(value);
|
|
45
|
+
await Promise.all([this.client.hDel(hashKey, id), this.send({ groupId, id }, { type: 'delete', data: item })]);
|
|
94
46
|
return item;
|
|
95
47
|
}
|
|
96
48
|
async getGroup(groupId) {
|
|
97
|
-
|
|
98
|
-
const
|
|
99
|
-
|
|
100
|
-
if (keys.length === 0)
|
|
101
|
-
return [];
|
|
102
|
-
const values = await this.client.mGet(keys);
|
|
103
|
-
return values.filter((v) => v !== null).map((v) => JSON.parse(v));
|
|
49
|
+
const hashKey = this.makeGroupKey(groupId);
|
|
50
|
+
const values = await this.client.hGetAll(hashKey);
|
|
51
|
+
return Object.values(values).map((v) => JSON.parse(v));
|
|
104
52
|
}
|
|
105
53
|
async send(channel, event) {
|
|
106
|
-
await this.ensureConnected();
|
|
107
54
|
const channelKey = this.makeChannelKey(channel);
|
|
108
|
-
await this.
|
|
55
|
+
await this.client.publish(channelKey, JSON.stringify(event));
|
|
109
56
|
}
|
|
110
57
|
async subscribe(channel, handler) {
|
|
111
58
|
const channelKey = this.makeChannelKey(channel);
|
|
@@ -150,12 +97,8 @@ class RedisStreamAdapter extends core_1.StreamAdapter {
|
|
|
150
97
|
}
|
|
151
98
|
}
|
|
152
99
|
async clear(groupId) {
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
const keys = await this.scanKeys(pattern);
|
|
156
|
-
if (keys.length > 0) {
|
|
157
|
-
await this.client.del(keys);
|
|
158
|
-
}
|
|
100
|
+
const hashKey = this.makeGroupKey(groupId);
|
|
101
|
+
await this.client.del(hashKey);
|
|
159
102
|
}
|
|
160
103
|
async query(groupId, filter) {
|
|
161
104
|
let items = await this.getGroup(groupId);
|
|
@@ -182,29 +125,7 @@ class RedisStreamAdapter extends core_1.StreamAdapter {
|
|
|
182
125
|
}
|
|
183
126
|
return items;
|
|
184
127
|
}
|
|
185
|
-
async scanKeys(pattern) {
|
|
186
|
-
const keys = [];
|
|
187
|
-
let cursor = 0;
|
|
188
|
-
do {
|
|
189
|
-
const result = await this.client.scan(cursor, {
|
|
190
|
-
MATCH: pattern,
|
|
191
|
-
COUNT: 100,
|
|
192
|
-
});
|
|
193
|
-
cursor = result.cursor;
|
|
194
|
-
keys.push(...result.keys);
|
|
195
|
-
} while (cursor !== 0);
|
|
196
|
-
return keys;
|
|
197
|
-
}
|
|
198
128
|
async cleanup() {
|
|
199
|
-
if (this.subClient?.isOpen) {
|
|
200
|
-
await this.subClient.quit();
|
|
201
|
-
}
|
|
202
|
-
if (this.pubClient.isOpen) {
|
|
203
|
-
await this.pubClient.quit();
|
|
204
|
-
}
|
|
205
|
-
if (this.client.isOpen) {
|
|
206
|
-
await this.client.quit();
|
|
207
|
-
}
|
|
208
129
|
this.subscriptions.clear();
|
|
209
130
|
}
|
|
210
131
|
}
|
package/package.json
CHANGED
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
"description": "Redis streams adapter for Motia framework, enabling distributed stream management with real-time updates.",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
|
-
"version": "0.8.2-beta.140-
|
|
6
|
+
"version": "0.8.2-beta.140-428722",
|
|
7
7
|
"dependencies": {
|
|
8
8
|
"redis": "^4.7.0",
|
|
9
|
-
"@motiadev/core": "0.8.2-beta.140-
|
|
9
|
+
"@motiadev/core": "0.8.2-beta.140-428722"
|
|
10
10
|
},
|
|
11
11
|
"devDependencies": {
|
|
12
12
|
"@types/node": "^22.10.2",
|