@taskcast/redis 0.1.0
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/dist/broadcast.d.ts +14 -0
- package/dist/broadcast.d.ts.map +1 -0
- package/dist/broadcast.js +50 -0
- package/dist/broadcast.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/short-term.d.ts +19 -0
- package/dist/short-term.d.ts.map +1 -0
- package/dist/short-term.js +97 -0
- package/dist/short-term.js.map +1 -0
- package/package.json +30 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Redis } from 'ioredis';
|
|
2
|
+
import type { BroadcastProvider, TaskEvent } from '@taskcast/core';
|
|
3
|
+
export declare class RedisBroadcastProvider implements BroadcastProvider {
|
|
4
|
+
private pub;
|
|
5
|
+
private sub;
|
|
6
|
+
private handlers;
|
|
7
|
+
private channelPrefix;
|
|
8
|
+
constructor(pub: Redis, sub: Redis, { prefix }?: {
|
|
9
|
+
prefix?: string;
|
|
10
|
+
});
|
|
11
|
+
publish(channel: string, event: TaskEvent): Promise<void>;
|
|
12
|
+
subscribe(channel: string, handler: (event: TaskEvent) => void): () => void;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=broadcast.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"broadcast.d.ts","sourceRoot":"","sources":["../src/broadcast.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAElE,qBAAa,sBAAuB,YAAW,iBAAiB;IAM5D,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,GAAG;IALb,OAAO,CAAC,QAAQ,CAAqD;IACrE,OAAO,CAAC,aAAa,CAAQ;gBAGnB,GAAG,EAAE,KAAK,EACV,GAAG,EAAE,KAAK,EAClB,EAAE,MAAM,EAAE,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO;IAoBhC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/D,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,GAAG,MAAM,IAAI;CAiB5E"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export class RedisBroadcastProvider {
|
|
2
|
+
pub;
|
|
3
|
+
sub;
|
|
4
|
+
// 每个 channel 的本地 handlers,在接收到 Redis 消息后转发
|
|
5
|
+
handlers = new Map();
|
|
6
|
+
channelPrefix;
|
|
7
|
+
constructor(pub, sub, { prefix } = {}) {
|
|
8
|
+
this.pub = pub;
|
|
9
|
+
this.sub = sub;
|
|
10
|
+
const resolvedPrefix = prefix ?? process.env['TASKCAST_REDIS_PREFIX'] ?? 'taskcast';
|
|
11
|
+
this.channelPrefix = `${resolvedPrefix}:task:`;
|
|
12
|
+
this.sub.on('message', (channel, message) => {
|
|
13
|
+
const taskId = channel.startsWith(this.channelPrefix)
|
|
14
|
+
? channel.slice(this.channelPrefix.length)
|
|
15
|
+
: channel;
|
|
16
|
+
const handlers = this.handlers.get(taskId);
|
|
17
|
+
if (!handlers)
|
|
18
|
+
return;
|
|
19
|
+
try {
|
|
20
|
+
const event = JSON.parse(message);
|
|
21
|
+
for (const handler of handlers)
|
|
22
|
+
handler(event);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
// malformed message, ignore
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
async publish(channel, event) {
|
|
30
|
+
await this.pub.publish(this.channelPrefix + channel, JSON.stringify(event));
|
|
31
|
+
}
|
|
32
|
+
subscribe(channel, handler) {
|
|
33
|
+
if (!this.handlers.has(channel)) {
|
|
34
|
+
this.handlers.set(channel, new Set());
|
|
35
|
+
this.sub.subscribe(this.channelPrefix + channel);
|
|
36
|
+
}
|
|
37
|
+
this.handlers.get(channel).add(handler);
|
|
38
|
+
return () => {
|
|
39
|
+
const set = this.handlers.get(channel);
|
|
40
|
+
if (!set)
|
|
41
|
+
return;
|
|
42
|
+
set.delete(handler);
|
|
43
|
+
if (set.size === 0) {
|
|
44
|
+
this.handlers.delete(channel);
|
|
45
|
+
this.sub.unsubscribe(this.channelPrefix + channel);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=broadcast.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"broadcast.js","sourceRoot":"","sources":["../src/broadcast.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,sBAAsB;IAMvB;IACA;IANV,2CAA2C;IACnC,QAAQ,GAAG,IAAI,GAAG,EAA2C,CAAA;IAC7D,aAAa,CAAQ;IAE7B,YACU,GAAU,EACV,GAAU,EAClB,EAAE,MAAM,KAA0B,EAAE;QAF5B,QAAG,GAAH,GAAG,CAAO;QACV,QAAG,GAAH,GAAG,CAAO;QAGlB,MAAM,cAAc,GAAG,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,IAAI,UAAU,CAAA;QACnF,IAAI,CAAC,aAAa,GAAG,GAAG,cAAc,QAAQ,CAAA;QAE9C,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAe,EAAE,OAAe,EAAE,EAAE;YAC1D,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC;gBACnD,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;gBAC1C,CAAC,CAAC,OAAO,CAAA;YACX,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;YAC1C,IAAI,CAAC,QAAQ;gBAAE,OAAM;YACrB,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAc,CAAA;gBAC9C,KAAK,MAAM,OAAO,IAAI,QAAQ;oBAAE,OAAO,CAAC,KAAK,CAAC,CAAA;YAChD,CAAC;YAAC,MAAM,CAAC;gBACP,4BAA4B;YAC9B,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAe,EAAE,KAAgB;QAC7C,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,GAAG,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA;IAC7E,CAAC;IAED,SAAS,CAAC,OAAe,EAAE,OAAmC;QAC5D,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,GAAG,EAAE,CAAC,CAAA;YACrC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,CAAA;QAClD,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QAExC,OAAO,GAAG,EAAE;YACV,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;YACtC,IAAI,CAAC,GAAG;gBAAE,OAAM;YAChB,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;YACnB,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACnB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;gBAC7B,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,CAAA;YACpD,CAAC;QACH,CAAC,CAAA;IACH,CAAC;CACF"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export { RedisBroadcastProvider } from './broadcast.js';
|
|
2
|
+
export { RedisShortTermStore } from './short-term.js';
|
|
3
|
+
import type { Redis } from 'ioredis';
|
|
4
|
+
import { RedisBroadcastProvider } from './broadcast.js';
|
|
5
|
+
import { RedisShortTermStore } from './short-term.js';
|
|
6
|
+
export interface RedisAdapterOptions {
|
|
7
|
+
/**
|
|
8
|
+
* Key/channel prefix used for all Redis keys. Defaults to 'taskcast'.
|
|
9
|
+
* Can also be set via TASKCAST_REDIS_PREFIX environment variable.
|
|
10
|
+
*/
|
|
11
|
+
prefix?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Convenience factory: creates Redis adapters configured for both
|
|
15
|
+
* broadcast and short-term store.
|
|
16
|
+
*
|
|
17
|
+
* NOTE: Requires three separate Redis connections:
|
|
18
|
+
* - pubClient: for publishing events
|
|
19
|
+
* - subClient: for subscribing to events (subscribe mode connection)
|
|
20
|
+
* - storeClient: for task/event storage operations
|
|
21
|
+
*/
|
|
22
|
+
export declare function createRedisAdapters(pubClient: Redis, subClient: Redis, storeClient: Redis, options?: RedisAdapterOptions): {
|
|
23
|
+
broadcast: RedisBroadcastProvider;
|
|
24
|
+
shortTerm: RedisShortTermStore;
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAErD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAErD,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,KAAK,EAChB,SAAS,EAAE,KAAK,EAChB,WAAW,EAAE,KAAK,EAClB,OAAO,GAAE,mBAAwB;;;EAMlC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export { RedisBroadcastProvider } from './broadcast.js';
|
|
2
|
+
export { RedisShortTermStore } from './short-term.js';
|
|
3
|
+
import { RedisBroadcastProvider } from './broadcast.js';
|
|
4
|
+
import { RedisShortTermStore } from './short-term.js';
|
|
5
|
+
/**
|
|
6
|
+
* Convenience factory: creates Redis adapters configured for both
|
|
7
|
+
* broadcast and short-term store.
|
|
8
|
+
*
|
|
9
|
+
* NOTE: Requires three separate Redis connections:
|
|
10
|
+
* - pubClient: for publishing events
|
|
11
|
+
* - subClient: for subscribing to events (subscribe mode connection)
|
|
12
|
+
* - storeClient: for task/event storage operations
|
|
13
|
+
*/
|
|
14
|
+
export function createRedisAdapters(pubClient, subClient, storeClient, options = {}) {
|
|
15
|
+
return {
|
|
16
|
+
broadcast: new RedisBroadcastProvider(pubClient, subClient, options),
|
|
17
|
+
shortTerm: new RedisShortTermStore(storeClient, options),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAGrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAUrD;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CACjC,SAAgB,EAChB,SAAgB,EAChB,WAAkB,EAClB,UAA+B,EAAE;IAEjC,OAAO;QACL,SAAS,EAAE,IAAI,sBAAsB,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC;QACpE,SAAS,EAAE,IAAI,mBAAmB,CAAC,WAAW,EAAE,OAAO,CAAC;KACzD,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Redis } from 'ioredis';
|
|
2
|
+
import type { Task, TaskEvent, ShortTermStore, EventQueryOptions } from '@taskcast/core';
|
|
3
|
+
export declare class RedisShortTermStore implements ShortTermStore {
|
|
4
|
+
private redis;
|
|
5
|
+
private KEY;
|
|
6
|
+
constructor(redis: Redis, { prefix }?: {
|
|
7
|
+
prefix?: string;
|
|
8
|
+
});
|
|
9
|
+
saveTask(task: Task): Promise<void>;
|
|
10
|
+
getTask(taskId: string): Promise<Task | null>;
|
|
11
|
+
nextIndex(taskId: string): Promise<number>;
|
|
12
|
+
appendEvent(taskId: string, event: TaskEvent): Promise<void>;
|
|
13
|
+
getEvents(taskId: string, opts?: EventQueryOptions): Promise<TaskEvent[]>;
|
|
14
|
+
setTTL(taskId: string, ttlSeconds: number): Promise<void>;
|
|
15
|
+
getSeriesLatest(taskId: string, seriesId: string): Promise<TaskEvent | null>;
|
|
16
|
+
setSeriesLatest(taskId: string, seriesId: string, event: TaskEvent): Promise<void>;
|
|
17
|
+
replaceLastSeriesEvent(taskId: string, seriesId: string, event: TaskEvent): Promise<void>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=short-term.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"short-term.d.ts","sourceRoot":"","sources":["../src/short-term.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAYxF,qBAAa,mBAAoB,YAAW,cAAc;IAItD,OAAO,CAAC,KAAK;IAHf,OAAO,CAAC,GAAG,CAA6B;gBAG9B,KAAK,EAAE,KAAK,EACpB,EAAE,MAAM,EAAE,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO;IAMhC,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAInC,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAK7C,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK1C,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5D,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAkBzE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAczD,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAK5E,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlF,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;CAwBhG"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
function makeKeys(prefix) {
|
|
2
|
+
return {
|
|
3
|
+
task: (id) => `${prefix}:task:${id}`,
|
|
4
|
+
events: (id) => `${prefix}:events:${id}`,
|
|
5
|
+
idx: (id) => `${prefix}:idx:${id}`,
|
|
6
|
+
seriesLatest: (taskId, seriesId) => `${prefix}:series:${taskId}:${seriesId}`,
|
|
7
|
+
seriesIds: (taskId) => `${prefix}:seriesIds:${taskId}`,
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
export class RedisShortTermStore {
|
|
11
|
+
redis;
|
|
12
|
+
KEY;
|
|
13
|
+
constructor(redis, { prefix } = {}) {
|
|
14
|
+
this.redis = redis;
|
|
15
|
+
const resolvedPrefix = prefix ?? process.env['TASKCAST_REDIS_PREFIX'] ?? 'taskcast';
|
|
16
|
+
this.KEY = makeKeys(resolvedPrefix);
|
|
17
|
+
}
|
|
18
|
+
async saveTask(task) {
|
|
19
|
+
await this.redis.set(this.KEY.task(task.id), JSON.stringify(task));
|
|
20
|
+
}
|
|
21
|
+
async getTask(taskId) {
|
|
22
|
+
const raw = await this.redis.get(this.KEY.task(taskId));
|
|
23
|
+
return raw ? JSON.parse(raw) : null;
|
|
24
|
+
}
|
|
25
|
+
async nextIndex(taskId) {
|
|
26
|
+
// INCR is atomic — safe across multiple instances sharing the same Redis
|
|
27
|
+
return (await this.redis.incr(this.KEY.idx(taskId))) - 1;
|
|
28
|
+
}
|
|
29
|
+
async appendEvent(taskId, event) {
|
|
30
|
+
await this.redis.rpush(this.KEY.events(taskId), JSON.stringify(event));
|
|
31
|
+
}
|
|
32
|
+
async getEvents(taskId, opts) {
|
|
33
|
+
const raw = await this.redis.lrange(this.KEY.events(taskId), 0, -1);
|
|
34
|
+
let events = raw.map((r) => JSON.parse(r));
|
|
35
|
+
const since = opts?.since;
|
|
36
|
+
if (since?.id) {
|
|
37
|
+
const idx = events.findIndex((e) => e.id === since.id);
|
|
38
|
+
events = idx >= 0 ? events.slice(idx + 1) : events;
|
|
39
|
+
}
|
|
40
|
+
else if (since?.index !== undefined) {
|
|
41
|
+
events = events.filter((e) => e.index > since.index);
|
|
42
|
+
}
|
|
43
|
+
else if (since?.timestamp !== undefined) {
|
|
44
|
+
events = events.filter((e) => e.timestamp > since.timestamp);
|
|
45
|
+
}
|
|
46
|
+
if (opts?.limit)
|
|
47
|
+
events = events.slice(0, opts.limit);
|
|
48
|
+
return events;
|
|
49
|
+
}
|
|
50
|
+
async setTTL(taskId, ttlSeconds) {
|
|
51
|
+
await this.redis.expire(this.KEY.task(taskId), ttlSeconds);
|
|
52
|
+
await this.redis.expire(this.KEY.events(taskId), ttlSeconds);
|
|
53
|
+
await this.redis.expire(this.KEY.idx(taskId), ttlSeconds);
|
|
54
|
+
const seriesIds = await this.redis.smembers(this.KEY.seriesIds(taskId));
|
|
55
|
+
const pipeline = this.redis.pipeline();
|
|
56
|
+
for (const sid of seriesIds) {
|
|
57
|
+
pipeline.expire(this.KEY.seriesLatest(taskId, sid), ttlSeconds);
|
|
58
|
+
}
|
|
59
|
+
pipeline.expire(this.KEY.seriesIds(taskId), ttlSeconds);
|
|
60
|
+
await pipeline.exec();
|
|
61
|
+
}
|
|
62
|
+
async getSeriesLatest(taskId, seriesId) {
|
|
63
|
+
const raw = await this.redis.get(this.KEY.seriesLatest(taskId, seriesId));
|
|
64
|
+
return raw ? JSON.parse(raw) : null;
|
|
65
|
+
}
|
|
66
|
+
async setSeriesLatest(taskId, seriesId, event) {
|
|
67
|
+
await this.redis.set(this.KEY.seriesLatest(taskId, seriesId), JSON.stringify(event));
|
|
68
|
+
await this.redis.sadd(this.KEY.seriesIds(taskId), seriesId);
|
|
69
|
+
}
|
|
70
|
+
async replaceLastSeriesEvent(taskId, seriesId, event) {
|
|
71
|
+
const prev = await this.getSeriesLatest(taskId, seriesId);
|
|
72
|
+
if (prev) {
|
|
73
|
+
// Find and replace the previous event in the list
|
|
74
|
+
const raw = await this.redis.lrange(this.KEY.events(taskId), 0, -1);
|
|
75
|
+
let idx = -1;
|
|
76
|
+
for (let i = raw.length - 1; i >= 0; i--) {
|
|
77
|
+
try {
|
|
78
|
+
if (JSON.parse(raw[i]).id === prev.id) {
|
|
79
|
+
idx = i;
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
// ignore parse errors
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (idx >= 0) {
|
|
88
|
+
await this.redis.lset(this.KEY.events(taskId), idx, JSON.stringify(event));
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
await this.appendEvent(taskId, event);
|
|
93
|
+
}
|
|
94
|
+
await this.setSeriesLatest(taskId, seriesId, event);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=short-term.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"short-term.js","sourceRoot":"","sources":["../src/short-term.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@taskcast/redis",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"files": [
|
|
5
|
+
"dist",
|
|
6
|
+
"LICENSE"
|
|
7
|
+
],
|
|
8
|
+
"type": "module",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "tsc",
|
|
17
|
+
"test": "vitest run",
|
|
18
|
+
"test:watch": "vitest"
|
|
19
|
+
},
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"@taskcast/core": "workspace:*",
|
|
22
|
+
"ioredis": "^5.4.0"
|
|
23
|
+
},
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"typescript": "^5.7.0",
|
|
26
|
+
"vitest": "^2.1.0",
|
|
27
|
+
"@vitest/coverage-v8": "^2.1.0",
|
|
28
|
+
"testcontainers": "^10.13.0"
|
|
29
|
+
}
|
|
30
|
+
}
|