@kronos-ts/kronosdb 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/connection.d.ts +86 -0
- package/dist/connection.d.ts.map +1 -0
- package/dist/connection.js +133 -0
- package/dist/connection.js.map +1 -0
- package/dist/errors.d.ts +72 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +149 -0
- package/dist/errors.js.map +1 -0
- package/dist/event-processor-info.d.ts +32 -0
- package/dist/event-processor-info.d.ts.map +1 -0
- package/dist/event-processor-info.js +24 -0
- package/dist/event-processor-info.js.map +1 -0
- package/dist/flow-controlled-sender.d.ts +12 -0
- package/dist/flow-controlled-sender.d.ts.map +1 -0
- package/dist/flow-controlled-sender.js +53 -0
- package/dist/flow-controlled-sender.js.map +1 -0
- package/dist/generated/command.d.ts +169 -0
- package/dist/generated/command.d.ts.map +1 -0
- package/dist/generated/command.js +964 -0
- package/dist/generated/command.js.map +1 -0
- package/dist/generated/common.d.ts +76 -0
- package/dist/generated/common.d.ts.map +1 -0
- package/dist/generated/common.js +648 -0
- package/dist/generated/common.js.map +1 -0
- package/dist/generated/eventstore.d.ts +337 -0
- package/dist/generated/eventstore.d.ts.map +1 -0
- package/dist/generated/eventstore.js +1757 -0
- package/dist/generated/eventstore.js.map +1 -0
- package/dist/generated/platform.d.ts +242 -0
- package/dist/generated/platform.d.ts.map +1 -0
- package/dist/generated/platform.js +1525 -0
- package/dist/generated/platform.js.map +1 -0
- package/dist/generated/query.d.ts +265 -0
- package/dist/generated/query.d.ts.map +1 -0
- package/dist/generated/query.js +2114 -0
- package/dist/generated/query.js.map +1 -0
- package/dist/generated/snapshot.d.ts +180 -0
- package/dist/generated/snapshot.d.ts.map +1 -0
- package/dist/generated/snapshot.js +861 -0
- package/dist/generated/snapshot.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/kronosdb-event-store.d.ts +17 -0
- package/dist/kronosdb-event-store.d.ts.map +1 -0
- package/dist/kronosdb-event-store.js +328 -0
- package/dist/kronosdb-event-store.js.map +1 -0
- package/dist/kronosdb-snapshot-store.d.ts +10 -0
- package/dist/kronosdb-snapshot-store.d.ts.map +1 -0
- package/dist/kronosdb-snapshot-store.js +79 -0
- package/dist/kronosdb-snapshot-store.js.map +1 -0
- package/dist/kronosdb.d.ts +53 -0
- package/dist/kronosdb.d.ts.map +1 -0
- package/dist/kronosdb.js +852 -0
- package/dist/kronosdb.js.map +1 -0
- package/dist/metadata-conversion.d.ts +37 -0
- package/dist/metadata-conversion.d.ts.map +1 -0
- package/dist/metadata-conversion.js +75 -0
- package/dist/metadata-conversion.js.map +1 -0
- package/dist/outbound-stream.d.ts +15 -0
- package/dist/outbound-stream.d.ts.map +1 -0
- package/dist/outbound-stream.js +39 -0
- package/dist/outbound-stream.js.map +1 -0
- package/dist/platform-service.d.ts +87 -0
- package/dist/platform-service.d.ts.map +1 -0
- package/dist/platform-service.js +218 -0
- package/dist/platform-service.js.map +1 -0
- package/dist/service-definitions.d.ts +187 -0
- package/dist/service-definitions.d.ts.map +1 -0
- package/dist/service-definitions.js +18 -0
- package/dist/service-definitions.js.map +1 -0
- package/dist/shutdown-latch.d.ts +18 -0
- package/dist/shutdown-latch.d.ts.map +1 -0
- package/dist/shutdown-latch.js +51 -0
- package/dist/shutdown-latch.js.map +1 -0
- package/package.json +69 -0
- package/src/connection.ts +235 -0
- package/src/errors.ts +173 -0
- package/src/event-processor-info.ts +53 -0
- package/src/flow-controlled-sender.ts +73 -0
- package/src/generated/command.ts +1226 -0
- package/src/generated/common.ts +770 -0
- package/src/generated/eventstore.ts +2241 -0
- package/src/generated/platform.ts +1914 -0
- package/src/generated/query.ts +2571 -0
- package/src/generated/snapshot.ts +1110 -0
- package/src/index.ts +87 -0
- package/src/kronosdb-event-store.ts +401 -0
- package/src/kronosdb-snapshot-store.ts +104 -0
- package/src/kronosdb.ts +1000 -0
- package/src/metadata-conversion.ts +85 -0
- package/src/outbound-stream.ts +52 -0
- package/src/platform-service.ts +297 -0
- package/src/service-definitions.ts +25 -0
- package/src/shutdown-latch.ts +74 -0
package/src/errors.ts
ADDED
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KronosDB error codes.
|
|
3
|
+
*
|
|
4
|
+
* Error codes follow the KRONOS-XXXX pattern where the first digit
|
|
5
|
+
* indicates the category:
|
|
6
|
+
* - 1xxx: Authentication/instruction errors
|
|
7
|
+
* - 2xxx: Event store errors
|
|
8
|
+
* - 3xxx: Communication errors
|
|
9
|
+
* - 4xxx: Command errors
|
|
10
|
+
* - 5xxx: Query errors
|
|
11
|
+
* - 9xxx: Internal/storage errors
|
|
12
|
+
*/
|
|
13
|
+
export const KronosDbErrorCode = {
|
|
14
|
+
// Authentication & instructions
|
|
15
|
+
AUTHENTICATION_TOKEN_MISSING: "KRONOS-1000",
|
|
16
|
+
AUTHENTICATION_INVALID_TOKEN: "KRONOS-1001",
|
|
17
|
+
|
|
18
|
+
// Event store
|
|
19
|
+
CONSISTENCY_CONDITION_VIOLATED: "KRONOS-2000",
|
|
20
|
+
EVENT_PAYLOAD_TOO_LARGE: "KRONOS-2001",
|
|
21
|
+
NO_EVENT_STORE_LEADER: "KRONOS-2100",
|
|
22
|
+
|
|
23
|
+
// Communication
|
|
24
|
+
CONNECTION_FAILED: "KRONOS-3001",
|
|
25
|
+
GRPC_MESSAGE_TOO_LARGE: "KRONOS-3002",
|
|
26
|
+
|
|
27
|
+
// Commands
|
|
28
|
+
NO_HANDLER_FOR_COMMAND: "KRONOS-4000",
|
|
29
|
+
COMMAND_EXECUTION_ERROR: "KRONOS-4002",
|
|
30
|
+
COMMAND_DISPATCH_ERROR: "KRONOS-4003",
|
|
31
|
+
|
|
32
|
+
// Queries
|
|
33
|
+
NO_HANDLER_FOR_QUERY: "KRONOS-5000",
|
|
34
|
+
QUERY_EXECUTION_ERROR: "KRONOS-5001",
|
|
35
|
+
QUERY_DISPATCH_ERROR: "KRONOS-5002",
|
|
36
|
+
|
|
37
|
+
// Internal/storage
|
|
38
|
+
DATAFILE_READ_ERROR: "KRONOS-9000",
|
|
39
|
+
DATAFILE_WRITE_ERROR: "KRONOS-9100",
|
|
40
|
+
|
|
41
|
+
// Default
|
|
42
|
+
OTHER: "KRONOS-0001",
|
|
43
|
+
} as const
|
|
44
|
+
|
|
45
|
+
export type KronosDbErrorCodeValue = typeof KronosDbErrorCode[keyof typeof KronosDbErrorCode]
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Base error for all KronosDB errors.
|
|
49
|
+
*/
|
|
50
|
+
export class KronosDbError extends Error {
|
|
51
|
+
readonly errorCode: string
|
|
52
|
+
readonly transient: boolean
|
|
53
|
+
|
|
54
|
+
constructor(message: string, errorCode: string, transient: boolean) {
|
|
55
|
+
super(message)
|
|
56
|
+
this.name = "KronosDbError"
|
|
57
|
+
this.errorCode = errorCode
|
|
58
|
+
this.transient = transient
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export class NoHandlerForCommandError extends KronosDbError {
|
|
63
|
+
constructor(message: string) {
|
|
64
|
+
super(message, KronosDbErrorCode.NO_HANDLER_FOR_COMMAND, false)
|
|
65
|
+
this.name = "NoHandlerForCommandError"
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export class NoHandlerForQueryError extends KronosDbError {
|
|
70
|
+
constructor(message: string) {
|
|
71
|
+
super(message, KronosDbErrorCode.NO_HANDLER_FOR_QUERY, false)
|
|
72
|
+
this.name = "NoHandlerForQueryError"
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export class CommandExecutionError extends KronosDbError {
|
|
77
|
+
constructor(message: string) {
|
|
78
|
+
super(message, KronosDbErrorCode.COMMAND_EXECUTION_ERROR, true)
|
|
79
|
+
this.name = "CommandExecutionError"
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export class QueryExecutionError extends KronosDbError {
|
|
84
|
+
constructor(message: string) {
|
|
85
|
+
super(message, KronosDbErrorCode.QUERY_EXECUTION_ERROR, true)
|
|
86
|
+
this.name = "QueryExecutionError"
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export class CommandDispatchError extends KronosDbError {
|
|
91
|
+
constructor(message: string) {
|
|
92
|
+
super(message, KronosDbErrorCode.COMMAND_DISPATCH_ERROR, true)
|
|
93
|
+
this.name = "CommandDispatchError"
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export class QueryDispatchError extends KronosDbError {
|
|
98
|
+
constructor(message: string) {
|
|
99
|
+
super(message, KronosDbErrorCode.QUERY_DISPATCH_ERROR, true)
|
|
100
|
+
this.name = "QueryDispatchError"
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export class ConcurrencyError extends KronosDbError {
|
|
105
|
+
constructor(message: string) {
|
|
106
|
+
super(message, KronosDbErrorCode.CONSISTENCY_CONDITION_VIOLATED, true)
|
|
107
|
+
this.name = "ConcurrencyError"
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export class ConnectionFailedError extends KronosDbError {
|
|
112
|
+
constructor(message: string) {
|
|
113
|
+
super(message, KronosDbErrorCode.CONNECTION_FAILED, true)
|
|
114
|
+
this.name = "ConnectionFailedError"
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export class AuthenticationError extends KronosDbError {
|
|
119
|
+
constructor(message: string, code: string) {
|
|
120
|
+
super(message, code, false)
|
|
121
|
+
this.name = "AuthenticationError"
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const TRANSIENT_CODES = new Set<string>([
|
|
126
|
+
KronosDbErrorCode.COMMAND_EXECUTION_ERROR,
|
|
127
|
+
KronosDbErrorCode.QUERY_EXECUTION_ERROR,
|
|
128
|
+
KronosDbErrorCode.COMMAND_DISPATCH_ERROR,
|
|
129
|
+
KronosDbErrorCode.QUERY_DISPATCH_ERROR,
|
|
130
|
+
KronosDbErrorCode.CONNECTION_FAILED,
|
|
131
|
+
KronosDbErrorCode.GRPC_MESSAGE_TOO_LARGE,
|
|
132
|
+
KronosDbErrorCode.CONSISTENCY_CONDITION_VIOLATED,
|
|
133
|
+
KronosDbErrorCode.NO_EVENT_STORE_LEADER,
|
|
134
|
+
])
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Convert a KronosDB error code + message into a typed exception.
|
|
138
|
+
*/
|
|
139
|
+
export function mapErrorCode(errorCode: string, message: string): KronosDbError {
|
|
140
|
+
switch (errorCode) {
|
|
141
|
+
case KronosDbErrorCode.NO_HANDLER_FOR_COMMAND:
|
|
142
|
+
return new NoHandlerForCommandError(message)
|
|
143
|
+
case KronosDbErrorCode.NO_HANDLER_FOR_QUERY:
|
|
144
|
+
return new NoHandlerForQueryError(message)
|
|
145
|
+
case KronosDbErrorCode.COMMAND_EXECUTION_ERROR:
|
|
146
|
+
return new CommandExecutionError(message)
|
|
147
|
+
case KronosDbErrorCode.QUERY_EXECUTION_ERROR:
|
|
148
|
+
return new QueryExecutionError(message)
|
|
149
|
+
case KronosDbErrorCode.COMMAND_DISPATCH_ERROR:
|
|
150
|
+
return new CommandDispatchError(message)
|
|
151
|
+
case KronosDbErrorCode.QUERY_DISPATCH_ERROR:
|
|
152
|
+
return new QueryDispatchError(message)
|
|
153
|
+
case KronosDbErrorCode.CONSISTENCY_CONDITION_VIOLATED:
|
|
154
|
+
return new ConcurrencyError(message)
|
|
155
|
+
case KronosDbErrorCode.CONNECTION_FAILED:
|
|
156
|
+
case KronosDbErrorCode.GRPC_MESSAGE_TOO_LARGE:
|
|
157
|
+
return new ConnectionFailedError(message)
|
|
158
|
+
case KronosDbErrorCode.AUTHENTICATION_TOKEN_MISSING:
|
|
159
|
+
case KronosDbErrorCode.AUTHENTICATION_INVALID_TOKEN:
|
|
160
|
+
return new AuthenticationError(message, errorCode)
|
|
161
|
+
default:
|
|
162
|
+
return new KronosDbError(
|
|
163
|
+
message,
|
|
164
|
+
errorCode,
|
|
165
|
+
TRANSIENT_CODES.has(errorCode),
|
|
166
|
+
)
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
export function isTransientError(error: unknown): boolean {
|
|
171
|
+
if (error instanceof KronosDbError) return error.transient
|
|
172
|
+
return false
|
|
173
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Status of a single event processor, reported to KronosDB.
|
|
3
|
+
*/
|
|
4
|
+
export interface ProcessorStatus {
|
|
5
|
+
readonly name: string
|
|
6
|
+
readonly running: boolean
|
|
7
|
+
readonly mode: "Tracking" | "Subscribing"
|
|
8
|
+
readonly isStreamingProcessor: boolean
|
|
9
|
+
readonly activeThreads: number
|
|
10
|
+
readonly availableThreads: number
|
|
11
|
+
readonly error: boolean
|
|
12
|
+
readonly errorMessage?: string
|
|
13
|
+
readonly tokenStoreIdentifier: string
|
|
14
|
+
readonly segments: SegmentStatus[]
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface SegmentStatus {
|
|
18
|
+
readonly segmentId: number
|
|
19
|
+
readonly caughtUp: boolean
|
|
20
|
+
readonly replaying: boolean
|
|
21
|
+
readonly onePartOf: number
|
|
22
|
+
readonly tokenPosition: bigint
|
|
23
|
+
readonly errorState: string
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Converts a ProcessorStatus to the proto EventProcessorInfo format.
|
|
28
|
+
*/
|
|
29
|
+
export function toEventProcessorInfo(status: ProcessorStatus): any {
|
|
30
|
+
return {
|
|
31
|
+
processorName: status.name,
|
|
32
|
+
mode: status.mode,
|
|
33
|
+
activeThreads: status.activeThreads,
|
|
34
|
+
running: status.running,
|
|
35
|
+
error: status.error,
|
|
36
|
+
segmentStatus: status.segments.map((seg) => ({
|
|
37
|
+
segmentId: seg.segmentId,
|
|
38
|
+
caughtUp: seg.caughtUp,
|
|
39
|
+
replaying: seg.replaying,
|
|
40
|
+
onePartOf: seg.onePartOf,
|
|
41
|
+
tokenPosition: seg.tokenPosition,
|
|
42
|
+
errorState: seg.errorState,
|
|
43
|
+
})),
|
|
44
|
+
availableThreads: status.availableThreads,
|
|
45
|
+
tokenStoreIdentifier: status.tokenStoreIdentifier,
|
|
46
|
+
isStreamingProcessor: status.isStreamingProcessor,
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Supplier function that returns the current status of all event processors.
|
|
52
|
+
*/
|
|
53
|
+
export type ProcessorStatusSupplier = () => ProcessorStatus[]
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Flow-controlled sender for subscription query updates.
|
|
3
|
+
*/
|
|
4
|
+
export interface FlowControlledSender<T> {
|
|
5
|
+
offer(value: T): boolean
|
|
6
|
+
addPermits(count: number): void
|
|
7
|
+
complete(): void
|
|
8
|
+
completeExceptionally(error: Error): void
|
|
9
|
+
readonly active: boolean
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function createFlowControlledSender<T>(
|
|
13
|
+
send: (value: T) => void,
|
|
14
|
+
onComplete?: () => void,
|
|
15
|
+
onError?: (error: Error) => void,
|
|
16
|
+
maxBufferSize: number = 256,
|
|
17
|
+
): FlowControlledSender<T> {
|
|
18
|
+
const buffer: T[] = []
|
|
19
|
+
let permits = 0
|
|
20
|
+
let isActive = true
|
|
21
|
+
|
|
22
|
+
function drain() {
|
|
23
|
+
while (permits > 0 && buffer.length > 0 && isActive) {
|
|
24
|
+
const value = buffer.shift()!
|
|
25
|
+
permits--
|
|
26
|
+
try {
|
|
27
|
+
send(value)
|
|
28
|
+
} catch (err) {
|
|
29
|
+
console.warn("FlowControlledSender: send error", err)
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return {
|
|
35
|
+
offer(value: T): boolean {
|
|
36
|
+
if (!isActive) return false
|
|
37
|
+
|
|
38
|
+
if (permits > 0) {
|
|
39
|
+
permits--
|
|
40
|
+
send(value)
|
|
41
|
+
return true
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
if (buffer.length >= maxBufferSize) {
|
|
45
|
+
return false
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
buffer.push(value)
|
|
49
|
+
return true
|
|
50
|
+
},
|
|
51
|
+
|
|
52
|
+
addPermits(count: number) {
|
|
53
|
+
permits += count
|
|
54
|
+
drain()
|
|
55
|
+
},
|
|
56
|
+
|
|
57
|
+
complete() {
|
|
58
|
+
isActive = false
|
|
59
|
+
buffer.length = 0
|
|
60
|
+
if (onComplete) onComplete()
|
|
61
|
+
},
|
|
62
|
+
|
|
63
|
+
completeExceptionally(error: Error) {
|
|
64
|
+
isActive = false
|
|
65
|
+
buffer.length = 0
|
|
66
|
+
if (onError) onError(error)
|
|
67
|
+
},
|
|
68
|
+
|
|
69
|
+
get active() {
|
|
70
|
+
return isActive
|
|
71
|
+
},
|
|
72
|
+
}
|
|
73
|
+
}
|