@auto-engineer/message-store 0.8.6
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/.turbo/turbo-build.log +5 -0
- package/CHANGELOG.md +7 -0
- package/LICENSE +10 -0
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +4 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/interfaces/IMessageStore.d.ts +70 -0
- package/dist/src/interfaces/IMessageStore.d.ts.map +1 -0
- package/dist/src/interfaces/IMessageStore.js +2 -0
- package/dist/src/interfaces/IMessageStore.js.map +1 -0
- package/dist/src/interfaces/types.d.ts +53 -0
- package/dist/src/interfaces/types.d.ts.map +1 -0
- package/dist/src/interfaces/types.js +2 -0
- package/dist/src/interfaces/types.js.map +1 -0
- package/dist/src/memory/MemoryMessageStore.d.ts +35 -0
- package/dist/src/memory/MemoryMessageStore.d.ts.map +1 -0
- package/dist/src/memory/MemoryMessageStore.js +359 -0
- package/dist/src/memory/MemoryMessageStore.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +33 -0
- package/src/index.ts +3 -0
- package/src/interfaces/IMessageStore.ts +102 -0
- package/src/interfaces/types.ts +59 -0
- package/src/memory/MemoryMessageStore.ts +483 -0
- package/tsconfig.json +14 -0
package/CHANGELOG.md
ADDED
package/LICENSE
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
Elastic License 2.0
|
|
2
|
+
|
|
3
|
+
Copyright 2024 Sam Hatoum
|
|
4
|
+
|
|
5
|
+
This software and associated documentation files (the "Software") are licensed under the Elastic License 2.0 (the "License"). You may not use this file except in compliance with the License.
|
|
6
|
+
|
|
7
|
+
You may obtain a copy of the License at:
|
|
8
|
+
https://www.elastic.co/licensing/elastic-license
|
|
9
|
+
|
|
10
|
+
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { Message, PositionalMessage, MessageFilter, StreamInfo, SessionInfo, MessageStoreStats, MessageType } from './types';
|
|
2
|
+
export interface IMessageStore {
|
|
3
|
+
/**
|
|
4
|
+
* Save messages to a specific stream
|
|
5
|
+
*/
|
|
6
|
+
saveMessages(streamId: string, messages: Message[], expectedRevision?: bigint, messageType?: MessageType): Promise<void>;
|
|
7
|
+
/**
|
|
8
|
+
* Save a single message to a stream
|
|
9
|
+
*/
|
|
10
|
+
saveMessage(streamId: string, message: Message, expectedRevision?: bigint, messageType?: MessageType): Promise<void>;
|
|
11
|
+
/**
|
|
12
|
+
* Get messages from a specific stream
|
|
13
|
+
*/
|
|
14
|
+
getMessages(streamId: string, fromRevision?: bigint, count?: number): Promise<PositionalMessage[]>;
|
|
15
|
+
/**
|
|
16
|
+
* Get all messages across all streams with optional filtering
|
|
17
|
+
*/
|
|
18
|
+
getAllMessages(filter?: MessageFilter, count?: number): Promise<PositionalMessage[]>;
|
|
19
|
+
/**
|
|
20
|
+
* Get all commands across all streams
|
|
21
|
+
*/
|
|
22
|
+
getAllCommands(filter?: Omit<MessageFilter, 'messageType'>, count?: number): Promise<PositionalMessage[]>;
|
|
23
|
+
/**
|
|
24
|
+
* Get all events across all streams
|
|
25
|
+
*/
|
|
26
|
+
getAllEvents(filter?: Omit<MessageFilter, 'messageType'>, count?: number): Promise<PositionalMessage[]>;
|
|
27
|
+
/**
|
|
28
|
+
* Get information about a specific stream
|
|
29
|
+
*/
|
|
30
|
+
getStreamInfo(streamId: string): Promise<StreamInfo | null>;
|
|
31
|
+
/**
|
|
32
|
+
* Get all stream IDs
|
|
33
|
+
*/
|
|
34
|
+
getStreams(): Promise<string[]>;
|
|
35
|
+
/**
|
|
36
|
+
* Get information about all sessions
|
|
37
|
+
*/
|
|
38
|
+
getSessions(): Promise<SessionInfo[]>;
|
|
39
|
+
/**
|
|
40
|
+
* Get information about a specific session
|
|
41
|
+
*/
|
|
42
|
+
getSessionInfo(sessionId: string): Promise<SessionInfo | null>;
|
|
43
|
+
/**
|
|
44
|
+
* Get messages for a specific session
|
|
45
|
+
*/
|
|
46
|
+
getSessionMessages(sessionId: string, filter?: Omit<MessageFilter, 'sessionId'>, count?: number): Promise<PositionalMessage[]>;
|
|
47
|
+
/**
|
|
48
|
+
* Get storage statistics
|
|
49
|
+
*/
|
|
50
|
+
getStats(): Promise<MessageStoreStats>;
|
|
51
|
+
/**
|
|
52
|
+
* Cleanup resources
|
|
53
|
+
*/
|
|
54
|
+
dispose(): Promise<void>;
|
|
55
|
+
}
|
|
56
|
+
export interface ILocalMessageStore extends IMessageStore {
|
|
57
|
+
/**
|
|
58
|
+
* Reset/clear all stored messages
|
|
59
|
+
*/
|
|
60
|
+
reset(): Promise<void>;
|
|
61
|
+
/**
|
|
62
|
+
* Create a new session and return the session ID
|
|
63
|
+
*/
|
|
64
|
+
createSession(): Promise<string>;
|
|
65
|
+
/**
|
|
66
|
+
* Mark a session as ended
|
|
67
|
+
*/
|
|
68
|
+
endSession(sessionId: string): Promise<void>;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=IMessageStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IMessageStore.d.ts","sourceRoot":"","sources":["../../../src/interfaces/IMessageStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,iBAAiB,EACjB,aAAa,EACb,UAAU,EACV,WAAW,EACX,iBAAiB,EACjB,WAAW,EACZ,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,YAAY,CACV,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,OAAO,EAAE,EACnB,gBAAgB,CAAC,EAAE,MAAM,EACzB,WAAW,CAAC,EAAE,WAAW,GACxB,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAErH;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAEnG;;OAEG;IACH,cAAc,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAErF;;OAEG;IACH,cAAc,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAE1G;;OAEG;IACH,YAAY,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAExG;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAE5D;;OAEG;IACH,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAEhC;;OAEG;IACH,WAAW,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAEtC;;OAEG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAE/D;;OAEG;IACH,kBAAkB,CAChB,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,EACzC,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAEhC;;OAEG;IACH,QAAQ,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAEvC;;OAEG;IACH,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAmB,SAAQ,aAAa;IACvD;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB;;OAEG;IACH,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAEjC;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IMessageStore.js","sourceRoot":"","sources":["../../../src/interfaces/IMessageStore.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { Command, Event } from '@auto-engineer/message-bus';
|
|
2
|
+
export type Message = Command | Event;
|
|
3
|
+
export type MessageType = 'command' | 'event';
|
|
4
|
+
export interface PositionalMessage {
|
|
5
|
+
streamId: string;
|
|
6
|
+
message: Message;
|
|
7
|
+
messageType: MessageType;
|
|
8
|
+
revision: bigint;
|
|
9
|
+
position: bigint;
|
|
10
|
+
timestamp: Date;
|
|
11
|
+
sessionId: string;
|
|
12
|
+
}
|
|
13
|
+
export interface MessageFilter {
|
|
14
|
+
messageType?: MessageType;
|
|
15
|
+
messageNames?: string[];
|
|
16
|
+
streamId?: string;
|
|
17
|
+
sessionId?: string;
|
|
18
|
+
correlationId?: string;
|
|
19
|
+
requestId?: string;
|
|
20
|
+
fromPosition?: bigint;
|
|
21
|
+
toPosition?: bigint;
|
|
22
|
+
fromTimestamp?: Date;
|
|
23
|
+
toTimestamp?: Date;
|
|
24
|
+
jsonFilter?: Record<string, unknown>;
|
|
25
|
+
}
|
|
26
|
+
export interface StreamInfo {
|
|
27
|
+
streamId: string;
|
|
28
|
+
revision: bigint;
|
|
29
|
+
messageCount: number;
|
|
30
|
+
firstPosition: bigint;
|
|
31
|
+
lastPosition: bigint;
|
|
32
|
+
createdAt: Date;
|
|
33
|
+
lastUpdated: Date;
|
|
34
|
+
}
|
|
35
|
+
export interface SessionInfo {
|
|
36
|
+
sessionId: string;
|
|
37
|
+
startedAt: Date;
|
|
38
|
+
messageCount: number;
|
|
39
|
+
commandCount: number;
|
|
40
|
+
eventCount: number;
|
|
41
|
+
lastActivity: Date;
|
|
42
|
+
}
|
|
43
|
+
export interface MessageStoreStats {
|
|
44
|
+
totalMessages: number;
|
|
45
|
+
totalCommands: number;
|
|
46
|
+
totalEvents: number;
|
|
47
|
+
totalStreams: number;
|
|
48
|
+
totalSessions: number;
|
|
49
|
+
memoryUsage?: number;
|
|
50
|
+
oldestMessage?: Date;
|
|
51
|
+
newestMessage?: Date;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/interfaces/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AAEjE,MAAM,MAAM,OAAO,GAAG,OAAO,GAAG,KAAK,CAAC;AAEtC,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC;AAE9C,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,IAAI,CAAC;IACrB,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,IAAI,CAAC;IAChB,WAAW,EAAE,IAAI,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,IAAI,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,IAAI,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,IAAI,CAAC;IACrB,aAAa,CAAC,EAAE,IAAI,CAAC;CACtB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/interfaces/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { Message, PositionalMessage, MessageFilter, StreamInfo, SessionInfo, MessageStoreStats, MessageType } from '../interfaces/types';
|
|
2
|
+
import type { ILocalMessageStore } from '../interfaces/IMessageStore';
|
|
3
|
+
export declare class MemoryMessageStore implements ILocalMessageStore {
|
|
4
|
+
private streams;
|
|
5
|
+
private globalPosition;
|
|
6
|
+
private sessions;
|
|
7
|
+
private currentSessionId;
|
|
8
|
+
constructor();
|
|
9
|
+
createSession(): Promise<string>;
|
|
10
|
+
endSession(sessionId: string): Promise<void>;
|
|
11
|
+
saveMessage(streamId: string, message: Message, expectedRevision?: bigint, messageType?: MessageType): Promise<void>;
|
|
12
|
+
saveMessages(streamId: string, messages: Message[], expectedRevision?: bigint, messageType?: MessageType): Promise<void>;
|
|
13
|
+
getMessages(streamId: string, fromRevision?: bigint, count?: number): Promise<PositionalMessage[]>;
|
|
14
|
+
getAllMessages(filter?: MessageFilter, count?: number): Promise<PositionalMessage[]>;
|
|
15
|
+
getAllCommands(filter?: Omit<MessageFilter, 'messageType'>, count?: number): Promise<PositionalMessage[]>;
|
|
16
|
+
getAllEvents(filter?: Omit<MessageFilter, 'messageType'>, count?: number): Promise<PositionalMessage[]>;
|
|
17
|
+
private applyFilter;
|
|
18
|
+
private messageMatchesFilter;
|
|
19
|
+
private passesTypeFilter;
|
|
20
|
+
private passesIdentifierFilters;
|
|
21
|
+
private passesPositionFilters;
|
|
22
|
+
private passesTimestampFilters;
|
|
23
|
+
private passesJsonFilter;
|
|
24
|
+
private matchesJsonFilter;
|
|
25
|
+
getStreamInfo(streamId: string): Promise<StreamInfo | null>;
|
|
26
|
+
getStreams(): Promise<string[]>;
|
|
27
|
+
getSessions(): Promise<SessionInfo[]>;
|
|
28
|
+
getSessionInfo(sessionId: string): Promise<SessionInfo | null>;
|
|
29
|
+
getSessionMessages(sessionId: string, filter?: Omit<MessageFilter, 'sessionId'>, count?: number): Promise<PositionalMessage[]>;
|
|
30
|
+
getStats(): Promise<MessageStoreStats>;
|
|
31
|
+
private estimateMemoryUsage;
|
|
32
|
+
reset(): Promise<void>;
|
|
33
|
+
dispose(): Promise<void>;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=MemoryMessageStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MemoryMessageStore.d.ts","sourceRoot":"","sources":["../../../src/memory/MemoryMessageStore.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,OAAO,EACP,iBAAiB,EACjB,aAAa,EACb,UAAU,EACV,WAAW,EACX,iBAAiB,EACjB,WAAW,EACZ,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAYtE,qBAAa,kBAAmB,YAAW,kBAAkB;IAC3D,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,QAAQ,CAAuC;IACvD,OAAO,CAAC,gBAAgB,CAAuB;;IAMzC,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IA2BhC,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa5C,WAAW,CACf,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,EAChB,gBAAgB,CAAC,EAAE,MAAM,EACzB,WAAW,CAAC,EAAE,WAAW,GACxB,OAAO,CAAC,IAAI,CAAC;IAKV,YAAY,CAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,OAAO,EAAE,EACnB,gBAAgB,CAAC,EAAE,MAAM,EACzB,WAAW,CAAC,EAAE,WAAW,GACxB,OAAO,CAAC,IAAI,CAAC;IAiGV,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAmBlG,cAAc,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAmBpF,cAAc,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAIzG,YAAY,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAI7G,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,oBAAoB;IAU5B,OAAO,CAAC,gBAAgB;IAoBxB,OAAO,CAAC,uBAAuB;IA4C/B,OAAO,CAAC,qBAAqB;IAY7B,OAAO,CAAC,sBAAsB;IAgB9B,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,iBAAiB;IAgBnB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAqB3D,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAI/B,WAAW,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAIrC,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAI9D,kBAAkB,CACtB,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,EACzC,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAWzB,QAAQ,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAsC5C,OAAO,CAAC,mBAAmB;IAmBrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQtB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAI/B"}
|
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
import { nanoid } from 'nanoid';
|
|
2
|
+
import createDebug from 'debug';
|
|
3
|
+
const debug = createDebug('message-store:memory');
|
|
4
|
+
export class MemoryMessageStore {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.streams = new Map();
|
|
7
|
+
this.globalPosition = BigInt(0);
|
|
8
|
+
this.sessions = new Map();
|
|
9
|
+
this.currentSessionId = null;
|
|
10
|
+
debug('MemoryMessageStore initialized.');
|
|
11
|
+
}
|
|
12
|
+
async createSession() {
|
|
13
|
+
const sessionId = `session-${Date.now()}-${nanoid(8)}`;
|
|
14
|
+
const sessionInfo = {
|
|
15
|
+
sessionId,
|
|
16
|
+
startedAt: new Date(),
|
|
17
|
+
messageCount: 0,
|
|
18
|
+
commandCount: 0,
|
|
19
|
+
eventCount: 0,
|
|
20
|
+
lastActivity: new Date(),
|
|
21
|
+
};
|
|
22
|
+
this.sessions.set(sessionId, sessionInfo);
|
|
23
|
+
this.currentSessionId = sessionId;
|
|
24
|
+
// Create a dedicated stream for this session
|
|
25
|
+
const sessionStreamId = `session-${sessionId}`;
|
|
26
|
+
this.streams.set(sessionStreamId, {
|
|
27
|
+
messages: [],
|
|
28
|
+
revision: BigInt(-1),
|
|
29
|
+
createdAt: new Date(),
|
|
30
|
+
lastUpdated: new Date(),
|
|
31
|
+
});
|
|
32
|
+
debug('Created new session: %s', sessionId);
|
|
33
|
+
return sessionId;
|
|
34
|
+
}
|
|
35
|
+
async endSession(sessionId) {
|
|
36
|
+
const session = this.sessions.get(sessionId);
|
|
37
|
+
if (session) {
|
|
38
|
+
session.lastActivity = new Date();
|
|
39
|
+
}
|
|
40
|
+
if (this.currentSessionId === sessionId) {
|
|
41
|
+
this.currentSessionId = null;
|
|
42
|
+
}
|
|
43
|
+
debug('Ended session: %s', sessionId);
|
|
44
|
+
}
|
|
45
|
+
async saveMessage(streamId, message, expectedRevision, messageType) {
|
|
46
|
+
return this.saveMessages(streamId, [message], expectedRevision, messageType);
|
|
47
|
+
}
|
|
48
|
+
// eslint-disable-next-line complexity
|
|
49
|
+
async saveMessages(streamId, messages, expectedRevision, messageType) {
|
|
50
|
+
debug('Saving %d messages to stream: %s', messages.length, streamId);
|
|
51
|
+
// Get or create stream
|
|
52
|
+
let streamData = this.streams.get(streamId);
|
|
53
|
+
if (!streamData) {
|
|
54
|
+
if (expectedRevision !== undefined && expectedRevision !== BigInt(-1)) {
|
|
55
|
+
throw new Error(`Stream ${streamId} does not exist, but expected revision ${expectedRevision} was provided`);
|
|
56
|
+
}
|
|
57
|
+
streamData = {
|
|
58
|
+
messages: [],
|
|
59
|
+
revision: BigInt(-1),
|
|
60
|
+
createdAt: new Date(),
|
|
61
|
+
lastUpdated: new Date(),
|
|
62
|
+
};
|
|
63
|
+
this.streams.set(streamId, streamData);
|
|
64
|
+
}
|
|
65
|
+
// Check expected revision
|
|
66
|
+
if (expectedRevision !== undefined && streamData.revision !== expectedRevision) {
|
|
67
|
+
throw new Error(`Expected revision ${expectedRevision} but stream is at revision ${streamData.revision}`);
|
|
68
|
+
}
|
|
69
|
+
const now = new Date();
|
|
70
|
+
const sessionId = this.currentSessionId ?? 'no-session';
|
|
71
|
+
// Convert and store messages
|
|
72
|
+
for (const message of messages) {
|
|
73
|
+
this.globalPosition++;
|
|
74
|
+
streamData.revision++;
|
|
75
|
+
// Determine message type from context or stream name
|
|
76
|
+
const detectedMessageType = messageType ||
|
|
77
|
+
(streamId.includes('command')
|
|
78
|
+
? 'command'
|
|
79
|
+
: streamId.includes('event')
|
|
80
|
+
? 'event'
|
|
81
|
+
: // Try to infer from the message structure - commands typically have requestId
|
|
82
|
+
message.requestId !== undefined && message.requestId !== null && message.requestId !== ''
|
|
83
|
+
? 'command'
|
|
84
|
+
: 'event');
|
|
85
|
+
const positionalMessage = {
|
|
86
|
+
streamId,
|
|
87
|
+
message: {
|
|
88
|
+
...message,
|
|
89
|
+
timestamp: message.timestamp || now,
|
|
90
|
+
},
|
|
91
|
+
messageType: detectedMessageType,
|
|
92
|
+
revision: streamData.revision,
|
|
93
|
+
position: this.globalPosition,
|
|
94
|
+
timestamp: now,
|
|
95
|
+
sessionId,
|
|
96
|
+
};
|
|
97
|
+
streamData.messages.push(positionalMessage);
|
|
98
|
+
streamData.lastUpdated = now;
|
|
99
|
+
// Update session stats
|
|
100
|
+
const session = this.sessions.get(sessionId);
|
|
101
|
+
if (session) {
|
|
102
|
+
session.messageCount++;
|
|
103
|
+
session.lastActivity = now;
|
|
104
|
+
if (detectedMessageType === 'command') {
|
|
105
|
+
session.commandCount++;
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
session.eventCount++;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// Also store in session stream
|
|
112
|
+
if (sessionId !== 'no-session') {
|
|
113
|
+
const sessionStreamId = `session-${sessionId}`;
|
|
114
|
+
const sessionStream = this.streams.get(sessionStreamId);
|
|
115
|
+
if (sessionStream) {
|
|
116
|
+
sessionStream.revision++;
|
|
117
|
+
const sessionMessage = {
|
|
118
|
+
...positionalMessage,
|
|
119
|
+
streamId: sessionStreamId,
|
|
120
|
+
revision: sessionStream.revision,
|
|
121
|
+
};
|
|
122
|
+
sessionStream.messages.push(sessionMessage);
|
|
123
|
+
sessionStream.lastUpdated = now;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
debug('Saved %d messages to stream %s, new revision: %s', messages.length, streamId, streamData.revision.toString());
|
|
128
|
+
}
|
|
129
|
+
async getMessages(streamId, fromRevision, count) {
|
|
130
|
+
const streamData = this.streams.get(streamId);
|
|
131
|
+
if (!streamData) {
|
|
132
|
+
return [];
|
|
133
|
+
}
|
|
134
|
+
let messages = streamData.messages;
|
|
135
|
+
if (fromRevision !== undefined && fromRevision !== null) {
|
|
136
|
+
messages = messages.filter((m) => m.revision >= fromRevision);
|
|
137
|
+
}
|
|
138
|
+
if (count !== undefined && count !== null && !isNaN(count) && count > 0) {
|
|
139
|
+
messages = messages.slice(-count); // Get the most recent N messages
|
|
140
|
+
}
|
|
141
|
+
return [...messages];
|
|
142
|
+
}
|
|
143
|
+
async getAllMessages(filter, count) {
|
|
144
|
+
const allMessages = [];
|
|
145
|
+
for (const streamData of this.streams.values()) {
|
|
146
|
+
allMessages.push(...streamData.messages);
|
|
147
|
+
}
|
|
148
|
+
// Sort by position
|
|
149
|
+
allMessages.sort((a, b) => Number(a.position) - Number(b.position));
|
|
150
|
+
let filtered = this.applyFilter(allMessages, filter);
|
|
151
|
+
if (count !== undefined && count !== null && !isNaN(count) && count > 0) {
|
|
152
|
+
filtered = filtered.slice(-count); // Get the most recent N messages
|
|
153
|
+
}
|
|
154
|
+
return filtered;
|
|
155
|
+
}
|
|
156
|
+
async getAllCommands(filter, count) {
|
|
157
|
+
return this.getAllMessages({ ...filter, messageType: 'command' }, count);
|
|
158
|
+
}
|
|
159
|
+
async getAllEvents(filter, count) {
|
|
160
|
+
return this.getAllMessages({ ...filter, messageType: 'event' }, count);
|
|
161
|
+
}
|
|
162
|
+
applyFilter(messages, filter) {
|
|
163
|
+
if (filter === undefined || filter === null) {
|
|
164
|
+
return messages;
|
|
165
|
+
}
|
|
166
|
+
return messages.filter((message) => this.messageMatchesFilter(message, filter));
|
|
167
|
+
}
|
|
168
|
+
messageMatchesFilter(message, filter) {
|
|
169
|
+
return (this.passesTypeFilter(message, filter) &&
|
|
170
|
+
this.passesIdentifierFilters(message, filter) &&
|
|
171
|
+
this.passesPositionFilters(message, filter) &&
|
|
172
|
+
this.passesTimestampFilters(message, filter) &&
|
|
173
|
+
this.passesJsonFilter(message, filter));
|
|
174
|
+
}
|
|
175
|
+
passesTypeFilter(message, filter) {
|
|
176
|
+
// Message type filter
|
|
177
|
+
if (filter.messageType !== undefined && filter.messageType !== null && message.messageType !== filter.messageType) {
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
// Message names filter
|
|
181
|
+
if (filter.messageNames !== undefined &&
|
|
182
|
+
filter.messageNames !== null &&
|
|
183
|
+
filter.messageNames.length > 0 &&
|
|
184
|
+
!filter.messageNames.includes(message.message.type)) {
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
return true;
|
|
188
|
+
}
|
|
189
|
+
// eslint-disable-next-line complexity
|
|
190
|
+
passesIdentifierFilters(message, filter) {
|
|
191
|
+
// Stream ID filter
|
|
192
|
+
if (filter.streamId !== undefined &&
|
|
193
|
+
filter.streamId !== null &&
|
|
194
|
+
filter.streamId !== '' &&
|
|
195
|
+
message.streamId !== filter.streamId) {
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
// Session ID filter
|
|
199
|
+
if (filter.sessionId !== undefined &&
|
|
200
|
+
filter.sessionId !== null &&
|
|
201
|
+
filter.sessionId !== '' &&
|
|
202
|
+
message.sessionId !== filter.sessionId) {
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
// Correlation ID filter
|
|
206
|
+
if (filter.correlationId !== undefined &&
|
|
207
|
+
filter.correlationId !== null &&
|
|
208
|
+
filter.correlationId !== '' &&
|
|
209
|
+
message.message.correlationId !== filter.correlationId) {
|
|
210
|
+
return false;
|
|
211
|
+
}
|
|
212
|
+
// Request ID filter
|
|
213
|
+
if (filter.requestId !== undefined &&
|
|
214
|
+
filter.requestId !== null &&
|
|
215
|
+
filter.requestId !== '' &&
|
|
216
|
+
message.message.requestId !== filter.requestId) {
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
return true;
|
|
220
|
+
}
|
|
221
|
+
passesPositionFilters(message, filter) {
|
|
222
|
+
// Position filters
|
|
223
|
+
if (filter.fromPosition !== undefined && filter.fromPosition !== null && message.position < filter.fromPosition) {
|
|
224
|
+
return false;
|
|
225
|
+
}
|
|
226
|
+
if (filter.toPosition !== undefined && filter.toPosition !== null && message.position > filter.toPosition) {
|
|
227
|
+
return false;
|
|
228
|
+
}
|
|
229
|
+
return true;
|
|
230
|
+
}
|
|
231
|
+
passesTimestampFilters(message, filter) {
|
|
232
|
+
// Timestamp filters
|
|
233
|
+
if (filter.fromTimestamp !== undefined &&
|
|
234
|
+
filter.fromTimestamp !== null &&
|
|
235
|
+
message.timestamp < filter.fromTimestamp) {
|
|
236
|
+
return false;
|
|
237
|
+
}
|
|
238
|
+
if (filter.toTimestamp !== undefined && filter.toTimestamp !== null && message.timestamp > filter.toTimestamp) {
|
|
239
|
+
return false;
|
|
240
|
+
}
|
|
241
|
+
return true;
|
|
242
|
+
}
|
|
243
|
+
passesJsonFilter(message, filter) {
|
|
244
|
+
// JSON filter (simple property matching for now)
|
|
245
|
+
if (filter.jsonFilter !== undefined && filter.jsonFilter !== null) {
|
|
246
|
+
return this.matchesJsonFilter(message.message.data, filter.jsonFilter);
|
|
247
|
+
}
|
|
248
|
+
return true;
|
|
249
|
+
}
|
|
250
|
+
matchesJsonFilter(data, jsonFilter) {
|
|
251
|
+
if (data === undefined || data === null || typeof data !== 'object') {
|
|
252
|
+
return false;
|
|
253
|
+
}
|
|
254
|
+
const dataObj = data;
|
|
255
|
+
for (const [key, expectedValue] of Object.entries(jsonFilter)) {
|
|
256
|
+
if (dataObj[key] !== expectedValue) {
|
|
257
|
+
return false;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
return true;
|
|
261
|
+
}
|
|
262
|
+
async getStreamInfo(streamId) {
|
|
263
|
+
const streamData = this.streams.get(streamId);
|
|
264
|
+
if (!streamData) {
|
|
265
|
+
return null;
|
|
266
|
+
}
|
|
267
|
+
const messages = streamData.messages;
|
|
268
|
+
const firstMessage = messages[0];
|
|
269
|
+
const lastMessage = messages[messages.length - 1];
|
|
270
|
+
return {
|
|
271
|
+
streamId,
|
|
272
|
+
revision: streamData.revision,
|
|
273
|
+
messageCount: messages.length,
|
|
274
|
+
firstPosition: firstMessage?.position ?? BigInt(0),
|
|
275
|
+
lastPosition: lastMessage?.position ?? BigInt(0),
|
|
276
|
+
createdAt: streamData.createdAt,
|
|
277
|
+
lastUpdated: streamData.lastUpdated,
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
async getStreams() {
|
|
281
|
+
return Array.from(this.streams.keys());
|
|
282
|
+
}
|
|
283
|
+
async getSessions() {
|
|
284
|
+
return Array.from(this.sessions.values());
|
|
285
|
+
}
|
|
286
|
+
async getSessionInfo(sessionId) {
|
|
287
|
+
return this.sessions.get(sessionId) || null;
|
|
288
|
+
}
|
|
289
|
+
async getSessionMessages(sessionId, filter, count) {
|
|
290
|
+
const sessionStreamId = `session-${sessionId}`;
|
|
291
|
+
const sessionMessages = await this.getMessages(sessionStreamId, undefined, count);
|
|
292
|
+
if (filter) {
|
|
293
|
+
return this.applyFilter(sessionMessages, { ...filter, sessionId });
|
|
294
|
+
}
|
|
295
|
+
return sessionMessages;
|
|
296
|
+
}
|
|
297
|
+
async getStats() {
|
|
298
|
+
let totalMessages = 0;
|
|
299
|
+
let totalCommands = 0;
|
|
300
|
+
let totalEvents = 0;
|
|
301
|
+
let oldestTimestamp;
|
|
302
|
+
let newestTimestamp;
|
|
303
|
+
for (const streamData of this.streams.values()) {
|
|
304
|
+
for (const message of streamData.messages) {
|
|
305
|
+
totalMessages++;
|
|
306
|
+
if (message.messageType === 'command') {
|
|
307
|
+
totalCommands++;
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
totalEvents++;
|
|
311
|
+
}
|
|
312
|
+
if (!oldestTimestamp || message.timestamp < oldestTimestamp) {
|
|
313
|
+
oldestTimestamp = message.timestamp;
|
|
314
|
+
}
|
|
315
|
+
if (!newestTimestamp || message.timestamp > newestTimestamp) {
|
|
316
|
+
newestTimestamp = message.timestamp;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
return {
|
|
321
|
+
totalMessages,
|
|
322
|
+
totalCommands,
|
|
323
|
+
totalEvents,
|
|
324
|
+
totalStreams: this.streams.size,
|
|
325
|
+
totalSessions: this.sessions.size,
|
|
326
|
+
memoryUsage: this.estimateMemoryUsage(),
|
|
327
|
+
oldestMessage: oldestTimestamp,
|
|
328
|
+
newestMessage: newestTimestamp,
|
|
329
|
+
};
|
|
330
|
+
}
|
|
331
|
+
estimateMemoryUsage() {
|
|
332
|
+
// Rough estimation of memory usage in bytes
|
|
333
|
+
let size = 0;
|
|
334
|
+
for (const streamData of this.streams.values()) {
|
|
335
|
+
for (const message of streamData.messages) {
|
|
336
|
+
// Convert BigInt fields to strings for JSON serialization
|
|
337
|
+
const serializedMessage = {
|
|
338
|
+
...message,
|
|
339
|
+
revision: message.revision.toString(),
|
|
340
|
+
position: message.position.toString(),
|
|
341
|
+
};
|
|
342
|
+
size += JSON.stringify(serializedMessage).length * 2; // Rough estimate for UTF-16
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
return size;
|
|
346
|
+
}
|
|
347
|
+
async reset() {
|
|
348
|
+
debug('Resetting message store');
|
|
349
|
+
this.streams.clear();
|
|
350
|
+
this.sessions.clear();
|
|
351
|
+
this.globalPosition = BigInt(0);
|
|
352
|
+
this.currentSessionId = null;
|
|
353
|
+
}
|
|
354
|
+
async dispose() {
|
|
355
|
+
debug('Disposing message store');
|
|
356
|
+
await this.reset();
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
//# sourceMappingURL=MemoryMessageStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MemoryMessageStore.js","sourceRoot":"","sources":["../../../src/memory/MemoryMessageStore.ts"],"names":[],"mappings":"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"}
|