@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.
Files changed (96) hide show
  1. package/dist/connection.d.ts +86 -0
  2. package/dist/connection.d.ts.map +1 -0
  3. package/dist/connection.js +133 -0
  4. package/dist/connection.js.map +1 -0
  5. package/dist/errors.d.ts +72 -0
  6. package/dist/errors.d.ts.map +1 -0
  7. package/dist/errors.js +149 -0
  8. package/dist/errors.js.map +1 -0
  9. package/dist/event-processor-info.d.ts +32 -0
  10. package/dist/event-processor-info.d.ts.map +1 -0
  11. package/dist/event-processor-info.js +24 -0
  12. package/dist/event-processor-info.js.map +1 -0
  13. package/dist/flow-controlled-sender.d.ts +12 -0
  14. package/dist/flow-controlled-sender.d.ts.map +1 -0
  15. package/dist/flow-controlled-sender.js +53 -0
  16. package/dist/flow-controlled-sender.js.map +1 -0
  17. package/dist/generated/command.d.ts +169 -0
  18. package/dist/generated/command.d.ts.map +1 -0
  19. package/dist/generated/command.js +964 -0
  20. package/dist/generated/command.js.map +1 -0
  21. package/dist/generated/common.d.ts +76 -0
  22. package/dist/generated/common.d.ts.map +1 -0
  23. package/dist/generated/common.js +648 -0
  24. package/dist/generated/common.js.map +1 -0
  25. package/dist/generated/eventstore.d.ts +337 -0
  26. package/dist/generated/eventstore.d.ts.map +1 -0
  27. package/dist/generated/eventstore.js +1757 -0
  28. package/dist/generated/eventstore.js.map +1 -0
  29. package/dist/generated/platform.d.ts +242 -0
  30. package/dist/generated/platform.d.ts.map +1 -0
  31. package/dist/generated/platform.js +1525 -0
  32. package/dist/generated/platform.js.map +1 -0
  33. package/dist/generated/query.d.ts +265 -0
  34. package/dist/generated/query.d.ts.map +1 -0
  35. package/dist/generated/query.js +2114 -0
  36. package/dist/generated/query.js.map +1 -0
  37. package/dist/generated/snapshot.d.ts +180 -0
  38. package/dist/generated/snapshot.d.ts.map +1 -0
  39. package/dist/generated/snapshot.js +861 -0
  40. package/dist/generated/snapshot.js.map +1 -0
  41. package/dist/index.d.ts +13 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +13 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/kronosdb-event-store.d.ts +17 -0
  46. package/dist/kronosdb-event-store.d.ts.map +1 -0
  47. package/dist/kronosdb-event-store.js +328 -0
  48. package/dist/kronosdb-event-store.js.map +1 -0
  49. package/dist/kronosdb-snapshot-store.d.ts +10 -0
  50. package/dist/kronosdb-snapshot-store.d.ts.map +1 -0
  51. package/dist/kronosdb-snapshot-store.js +79 -0
  52. package/dist/kronosdb-snapshot-store.js.map +1 -0
  53. package/dist/kronosdb.d.ts +53 -0
  54. package/dist/kronosdb.d.ts.map +1 -0
  55. package/dist/kronosdb.js +852 -0
  56. package/dist/kronosdb.js.map +1 -0
  57. package/dist/metadata-conversion.d.ts +37 -0
  58. package/dist/metadata-conversion.d.ts.map +1 -0
  59. package/dist/metadata-conversion.js +75 -0
  60. package/dist/metadata-conversion.js.map +1 -0
  61. package/dist/outbound-stream.d.ts +15 -0
  62. package/dist/outbound-stream.d.ts.map +1 -0
  63. package/dist/outbound-stream.js +39 -0
  64. package/dist/outbound-stream.js.map +1 -0
  65. package/dist/platform-service.d.ts +87 -0
  66. package/dist/platform-service.d.ts.map +1 -0
  67. package/dist/platform-service.js +218 -0
  68. package/dist/platform-service.js.map +1 -0
  69. package/dist/service-definitions.d.ts +187 -0
  70. package/dist/service-definitions.d.ts.map +1 -0
  71. package/dist/service-definitions.js +18 -0
  72. package/dist/service-definitions.js.map +1 -0
  73. package/dist/shutdown-latch.d.ts +18 -0
  74. package/dist/shutdown-latch.d.ts.map +1 -0
  75. package/dist/shutdown-latch.js +51 -0
  76. package/dist/shutdown-latch.js.map +1 -0
  77. package/package.json +69 -0
  78. package/src/connection.ts +235 -0
  79. package/src/errors.ts +173 -0
  80. package/src/event-processor-info.ts +53 -0
  81. package/src/flow-controlled-sender.ts +73 -0
  82. package/src/generated/command.ts +1226 -0
  83. package/src/generated/common.ts +770 -0
  84. package/src/generated/eventstore.ts +2241 -0
  85. package/src/generated/platform.ts +1914 -0
  86. package/src/generated/query.ts +2571 -0
  87. package/src/generated/snapshot.ts +1110 -0
  88. package/src/index.ts +87 -0
  89. package/src/kronosdb-event-store.ts +401 -0
  90. package/src/kronosdb-snapshot-store.ts +104 -0
  91. package/src/kronosdb.ts +1000 -0
  92. package/src/metadata-conversion.ts +85 -0
  93. package/src/outbound-stream.ts +52 -0
  94. package/src/platform-service.ts +297 -0
  95. package/src/service-definitions.ts +25 -0
  96. 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
+ }