@kurrent/kurrentdb-client 1.0.0-alpha.1

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 (281) hide show
  1. package/README.md +201 -0
  2. package/dist/Client/ServerFeatures.d.ts +17 -0
  3. package/dist/Client/ServerFeatures.js +56 -0
  4. package/dist/Client/ServerFeatures.js.map +1 -0
  5. package/dist/Client/discovery.d.ts +15 -0
  6. package/dist/Client/discovery.js +135 -0
  7. package/dist/Client/discovery.js.map +1 -0
  8. package/dist/Client/http.d.ts +19 -0
  9. package/dist/Client/http.js +97 -0
  10. package/dist/Client/http.js.map +1 -0
  11. package/dist/Client/index.d.ts +119 -0
  12. package/dist/Client/index.js +390 -0
  13. package/dist/Client/index.js.map +1 -0
  14. package/dist/Client/parseConnectionString.d.ts +23 -0
  15. package/dist/Client/parseConnectionString.js +238 -0
  16. package/dist/Client/parseConnectionString.js.map +1 -0
  17. package/dist/bridge/index.d.ts +66 -0
  18. package/dist/bridge/index.js +83 -0
  19. package/dist/bridge/index.js.map +1 -0
  20. package/dist/bridge/load.d.ts +1 -0
  21. package/dist/bridge/load.js +20 -0
  22. package/dist/bridge/load.js.map +1 -0
  23. package/dist/constants.d.ts +58 -0
  24. package/dist/constants.js +75 -0
  25. package/dist/constants.js.map +1 -0
  26. package/dist/events/binaryEvent.d.ts +16 -0
  27. package/dist/events/binaryEvent.js +14 -0
  28. package/dist/events/binaryEvent.js.map +1 -0
  29. package/dist/events/convertMetadata.d.ts +1 -0
  30. package/dist/events/convertMetadata.js +11 -0
  31. package/dist/events/convertMetadata.js.map +1 -0
  32. package/dist/events/index.d.ts +2 -0
  33. package/dist/events/index.js +19 -0
  34. package/dist/events/index.js.map +1 -0
  35. package/dist/events/jsonEvent.d.ts +8 -0
  36. package/dist/events/jsonEvent.js +14 -0
  37. package/dist/events/jsonEvent.js.map +1 -0
  38. package/dist/index.d.ts +13 -0
  39. package/dist/index.js +32 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/persistentSubscription/createPersistentSubscriptionToAll.d.ts +23 -0
  42. package/dist/persistentSubscription/createPersistentSubscriptionToAll.js +90 -0
  43. package/dist/persistentSubscription/createPersistentSubscriptionToAll.js.map +1 -0
  44. package/dist/persistentSubscription/createPersistentSubscriptionToStream.d.ts +17 -0
  45. package/dist/persistentSubscription/createPersistentSubscriptionToStream.js +49 -0
  46. package/dist/persistentSubscription/createPersistentSubscriptionToStream.js.map +1 -0
  47. package/dist/persistentSubscription/deletePersistentSubscriptionToAll.d.ts +13 -0
  48. package/dist/persistentSubscription/deletePersistentSubscriptionToAll.js +30 -0
  49. package/dist/persistentSubscription/deletePersistentSubscriptionToAll.js.map +1 -0
  50. package/dist/persistentSubscription/deletePersistentSubscriptionToStream.d.ts +13 -0
  51. package/dist/persistentSubscription/deletePersistentSubscriptionToStream.js +28 -0
  52. package/dist/persistentSubscription/deletePersistentSubscriptionToStream.js.map +1 -0
  53. package/dist/persistentSubscription/getPersistentSubscriptionToAllInfo.d.ts +13 -0
  54. package/dist/persistentSubscription/getPersistentSubscriptionToAllInfo.js +31 -0
  55. package/dist/persistentSubscription/getPersistentSubscriptionToAllInfo.js.map +1 -0
  56. package/dist/persistentSubscription/getPersistentSubscriptionToStreamInfo.d.ts +14 -0
  57. package/dist/persistentSubscription/getPersistentSubscriptionToStreamInfo.js +49 -0
  58. package/dist/persistentSubscription/getPersistentSubscriptionToStreamInfo.js.map +1 -0
  59. package/dist/persistentSubscription/index.d.ts +16 -0
  60. package/dist/persistentSubscription/index.js +33 -0
  61. package/dist/persistentSubscription/index.js.map +1 -0
  62. package/dist/persistentSubscription/listAllPersistentSubscriptions.d.ts +13 -0
  63. package/dist/persistentSubscription/listAllPersistentSubscriptions.js +42 -0
  64. package/dist/persistentSubscription/listAllPersistentSubscriptions.js.map +1 -0
  65. package/dist/persistentSubscription/listPersistentSubscriptionsToAll.d.ts +13 -0
  66. package/dist/persistentSubscription/listPersistentSubscriptionsToAll.js +33 -0
  67. package/dist/persistentSubscription/listPersistentSubscriptionsToAll.js.map +1 -0
  68. package/dist/persistentSubscription/listPersistentSubscriptionsToStream.d.ts +14 -0
  69. package/dist/persistentSubscription/listPersistentSubscriptionsToStream.js +51 -0
  70. package/dist/persistentSubscription/listPersistentSubscriptionsToStream.js.map +1 -0
  71. package/dist/persistentSubscription/replayParkedMessagesToAll.d.ts +18 -0
  72. package/dist/persistentSubscription/replayParkedMessagesToAll.js +36 -0
  73. package/dist/persistentSubscription/replayParkedMessagesToAll.js.map +1 -0
  74. package/dist/persistentSubscription/replayParkedMessagesToStream.d.ts +19 -0
  75. package/dist/persistentSubscription/replayParkedMessagesToStream.js +57 -0
  76. package/dist/persistentSubscription/replayParkedMessagesToStream.js.map +1 -0
  77. package/dist/persistentSubscription/restartPersistentSubscriptionSubsystem.d.ts +11 -0
  78. package/dist/persistentSubscription/restartPersistentSubscriptionSubsystem.js +30 -0
  79. package/dist/persistentSubscription/restartPersistentSubscriptionSubsystem.js.map +1 -0
  80. package/dist/persistentSubscription/subscribeToPersistentSubscriptionToAll.d.ts +20 -0
  81. package/dist/persistentSubscription/subscribeToPersistentSubscriptionToAll.js +38 -0
  82. package/dist/persistentSubscription/subscribeToPersistentSubscriptionToAll.js.map +1 -0
  83. package/dist/persistentSubscription/subscribeToPersistentSubscriptionToStream.d.ts +20 -0
  84. package/dist/persistentSubscription/subscribeToPersistentSubscriptionToStream.js +37 -0
  85. package/dist/persistentSubscription/subscribeToPersistentSubscriptionToStream.js.map +1 -0
  86. package/dist/persistentSubscription/updatePersistentSubscriptionToAll.d.ts +15 -0
  87. package/dist/persistentSubscription/updatePersistentSubscriptionToAll.js +53 -0
  88. package/dist/persistentSubscription/updatePersistentSubscriptionToAll.js.map +1 -0
  89. package/dist/persistentSubscription/updatePersistentSubscriptionToStream.d.ts +15 -0
  90. package/dist/persistentSubscription/updatePersistentSubscriptionToStream.js +49 -0
  91. package/dist/persistentSubscription/updatePersistentSubscriptionToStream.js.map +1 -0
  92. package/dist/persistentSubscription/utils/PersistentSubscriptionImpl.d.ts +18 -0
  93. package/dist/persistentSubscription/utils/PersistentSubscriptionImpl.js +112 -0
  94. package/dist/persistentSubscription/utils/PersistentSubscriptionImpl.js.map +1 -0
  95. package/dist/persistentSubscription/utils/mapPersistentSubscriptionInfo.d.ts +146 -0
  96. package/dist/persistentSubscription/utils/mapPersistentSubscriptionInfo.js +204 -0
  97. package/dist/persistentSubscription/utils/mapPersistentSubscriptionInfo.js.map +1 -0
  98. package/dist/persistentSubscription/utils/persistentSubscriptionSettings.d.ts +90 -0
  99. package/dist/persistentSubscription/utils/persistentSubscriptionSettings.js +39 -0
  100. package/dist/persistentSubscription/utils/persistentSubscriptionSettings.js.map +1 -0
  101. package/dist/persistentSubscription/utils/settingsToGRPC.d.ts +5 -0
  102. package/dist/persistentSubscription/utils/settingsToGRPC.js +49 -0
  103. package/dist/persistentSubscription/utils/settingsToGRPC.js.map +1 -0
  104. package/dist/projections/createProjection.d.ts +24 -0
  105. package/dist/projections/createProjection.js +48 -0
  106. package/dist/projections/createProjection.js.map +1 -0
  107. package/dist/projections/deleteProjection.d.ts +28 -0
  108. package/dist/projections/deleteProjection.js +33 -0
  109. package/dist/projections/deleteProjection.js.map +1 -0
  110. package/dist/projections/disableProjection.d.ts +19 -0
  111. package/dist/projections/disableProjection.js +34 -0
  112. package/dist/projections/disableProjection.js.map +1 -0
  113. package/dist/projections/enableProjection.d.ts +12 -0
  114. package/dist/projections/enableProjection.js +25 -0
  115. package/dist/projections/enableProjection.js.map +1 -0
  116. package/dist/projections/getProjectionResult.d.ts +17 -0
  117. package/dist/projections/getProjectionResult.js +29 -0
  118. package/dist/projections/getProjectionResult.js.map +1 -0
  119. package/dist/projections/getProjectionState.d.ts +17 -0
  120. package/dist/projections/getProjectionState.js +29 -0
  121. package/dist/projections/getProjectionState.js.map +1 -0
  122. package/dist/projections/getProjectionStatus.d.ts +12 -0
  123. package/dist/projections/getProjectionStatus.js +36 -0
  124. package/dist/projections/getProjectionStatus.js.map +1 -0
  125. package/dist/projections/index.d.ts +11 -0
  126. package/dist/projections/index.js +28 -0
  127. package/dist/projections/index.js.map +1 -0
  128. package/dist/projections/listProjections.d.ts +12 -0
  129. package/dist/projections/listProjections.js +36 -0
  130. package/dist/projections/listProjections.js.map +1 -0
  131. package/dist/projections/resetProjection.d.ts +13 -0
  132. package/dist/projections/resetProjection.js +25 -0
  133. package/dist/projections/resetProjection.js.map +1 -0
  134. package/dist/projections/restartSubsystem.d.ts +11 -0
  135. package/dist/projections/restartSubsystem.js +21 -0
  136. package/dist/projections/restartSubsystem.js.map +1 -0
  137. package/dist/projections/updateProjection.d.ts +20 -0
  138. package/dist/projections/updateProjection.js +34 -0
  139. package/dist/projections/updateProjection.js.map +1 -0
  140. package/dist/projections/utils/mapGrpcProjectionDetails.d.ts +3 -0
  141. package/dist/projections/utils/mapGrpcProjectionDetails.js +31 -0
  142. package/dist/projections/utils/mapGrpcProjectionDetails.js.map +1 -0
  143. package/dist/streams/appendToStream/append.d.ts +5 -0
  144. package/dist/streams/appendToStream/append.js +131 -0
  145. package/dist/streams/appendToStream/append.js.map +1 -0
  146. package/dist/streams/appendToStream/batchAppend.d.ts +5 -0
  147. package/dist/streams/appendToStream/batchAppend.js +145 -0
  148. package/dist/streams/appendToStream/batchAppend.js.map +1 -0
  149. package/dist/streams/appendToStream/index.d.ts +24 -0
  150. package/dist/streams/appendToStream/index.js +24 -0
  151. package/dist/streams/appendToStream/index.js.map +1 -0
  152. package/dist/streams/appendToStream/unpackError.d.ts +5 -0
  153. package/dist/streams/appendToStream/unpackError.js +54 -0
  154. package/dist/streams/appendToStream/unpackError.js.map +1 -0
  155. package/dist/streams/deleteStream.d.ts +18 -0
  156. package/dist/streams/deleteStream.js +51 -0
  157. package/dist/streams/deleteStream.js.map +1 -0
  158. package/dist/streams/getStreamMetadata.d.ts +27 -0
  159. package/dist/streams/getStreamMetadata.js +40 -0
  160. package/dist/streams/getStreamMetadata.js.map +1 -0
  161. package/dist/streams/index.d.ts +9 -0
  162. package/dist/streams/index.js +27 -0
  163. package/dist/streams/index.js.map +1 -0
  164. package/dist/streams/readAll.d.ts +35 -0
  165. package/dist/streams/readAll.js +37 -0
  166. package/dist/streams/readAll.js.map +1 -0
  167. package/dist/streams/readStream.d.ts +35 -0
  168. package/dist/streams/readStream.js +58 -0
  169. package/dist/streams/readStream.js.map +1 -0
  170. package/dist/streams/setStreamMetadata.d.ts +20 -0
  171. package/dist/streams/setStreamMetadata.js +20 -0
  172. package/dist/streams/setStreamMetadata.js.map +1 -0
  173. package/dist/streams/subscribeToAll.d.ts +30 -0
  174. package/dist/streams/subscribeToAll.js +89 -0
  175. package/dist/streams/subscribeToAll.js.map +1 -0
  176. package/dist/streams/subscribeToStream.d.ts +27 -0
  177. package/dist/streams/subscribeToStream.js +52 -0
  178. package/dist/streams/subscribeToStream.js.map +1 -0
  179. package/dist/streams/tombstoneStream.d.ts +18 -0
  180. package/dist/streams/tombstoneStream.js +51 -0
  181. package/dist/streams/tombstoneStream.js.map +1 -0
  182. package/dist/streams/utils/ReadStream.d.ts +14 -0
  183. package/dist/streams/utils/ReadStream.js +61 -0
  184. package/dist/streams/utils/ReadStream.js.map +1 -0
  185. package/dist/streams/utils/Subscription.d.ts +16 -0
  186. package/dist/streams/utils/Subscription.js +71 -0
  187. package/dist/streams/utils/Subscription.js.map +1 -0
  188. package/dist/streams/utils/streamMetadata.d.ts +53 -0
  189. package/dist/streams/utils/streamMetadata.js +77 -0
  190. package/dist/streams/utils/streamMetadata.js.map +1 -0
  191. package/dist/streams/utils/systemStreams.d.ts +20 -0
  192. package/dist/streams/utils/systemStreams.js +28 -0
  193. package/dist/streams/utils/systemStreams.js.map +1 -0
  194. package/dist/types/events.d.ts +157 -0
  195. package/dist/types/events.js +3 -0
  196. package/dist/types/events.js.map +1 -0
  197. package/dist/types/index.d.ts +348 -0
  198. package/dist/types/index.js +22 -0
  199. package/dist/types/index.js.map +1 -0
  200. package/dist/utils/CommandError.d.ts +174 -0
  201. package/dist/utils/CommandError.js +403 -0
  202. package/dist/utils/CommandError.js.map +1 -0
  203. package/dist/utils/backpressuredWrite.d.ts +2 -0
  204. package/dist/utils/backpressuredWrite.js +50 -0
  205. package/dist/utils/backpressuredWrite.js.map +1 -0
  206. package/dist/utils/convertBridgeError.d.ts +1 -0
  207. package/dist/utils/convertBridgeError.js +41 -0
  208. package/dist/utils/convertBridgeError.js.map +1 -0
  209. package/dist/utils/convertGrpcEvent.d.ts +10 -0
  210. package/dist/utils/convertGrpcEvent.js +135 -0
  211. package/dist/utils/convertGrpcEvent.js.map +1 -0
  212. package/dist/utils/convertRustEvent.d.ts +4 -0
  213. package/dist/utils/convertRustEvent.js +85 -0
  214. package/dist/utils/convertRustEvent.js.map +1 -0
  215. package/dist/utils/debug.d.ts +7 -0
  216. package/dist/utils/debug.js +30 -0
  217. package/dist/utils/debug.js.map +1 -0
  218. package/dist/utils/filter.d.ts +44 -0
  219. package/dist/utils/filter.js +29 -0
  220. package/dist/utils/filter.js.map +1 -0
  221. package/dist/utils/grpcStreamIdentifier.d.ts +2 -0
  222. package/dist/utils/grpcStreamIdentifier.js +11 -0
  223. package/dist/utils/grpcStreamIdentifier.js.map +1 -0
  224. package/dist/utils/grpcUUID.d.ts +4 -0
  225. package/dist/utils/grpcUUID.js +29 -0
  226. package/dist/utils/grpcUUID.js.map +1 -0
  227. package/dist/utils/index.d.ts +9 -0
  228. package/dist/utils/index.js +26 -0
  229. package/dist/utils/index.js.map +1 -0
  230. package/dist/utils/isClientCancellationError.d.ts +1 -0
  231. package/dist/utils/isClientCancellationError.js +13 -0
  232. package/dist/utils/isClientCancellationError.js.map +1 -0
  233. package/dist/utils/utilityTypes.d.ts +2 -0
  234. package/dist/utils/utilityTypes.js +3 -0
  235. package/dist/utils/utilityTypes.js.map +1 -0
  236. package/generated/cluster_grpc_pb.d.ts +211 -0
  237. package/generated/cluster_grpc_pb.js +247 -0
  238. package/generated/cluster_pb.d.ts +546 -0
  239. package/generated/cluster_pb.js +4357 -0
  240. package/generated/code_grpc_pb.js +1 -0
  241. package/generated/code_pb.d.ts +27 -0
  242. package/generated/code_pb.js +48 -0
  243. package/generated/gossip_grpc_pb.d.ts +42 -0
  244. package/generated/gossip_grpc_pb.js +45 -0
  245. package/generated/gossip_pb.d.ts +111 -0
  246. package/generated/gossip_pb.js +727 -0
  247. package/generated/monitoring_grpc_pb.d.ts +39 -0
  248. package/generated/monitoring_grpc_pb.js +44 -0
  249. package/generated/monitoring_pb.d.ts +52 -0
  250. package/generated/monitoring_pb.js +361 -0
  251. package/generated/operations_grpc_pb.d.ts +144 -0
  252. package/generated/operations_grpc_pb.js +144 -0
  253. package/generated/operations_pb.d.ts +151 -0
  254. package/generated/operations_pb.js +1050 -0
  255. package/generated/persistent_grpc_pb.d.ts +160 -0
  256. package/generated/persistent_grpc_pb.js +265 -0
  257. package/generated/persistent_pb.d.ts +1702 -0
  258. package/generated/persistent_pb.js +12340 -0
  259. package/generated/projections_grpc_pb.d.ts +194 -0
  260. package/generated/projections_grpc_pb.js +332 -0
  261. package/generated/projections_pb.d.ts +821 -0
  262. package/generated/projections_pb.js +6065 -0
  263. package/generated/serverfeatures_grpc_pb.d.ts +42 -0
  264. package/generated/serverfeatures_grpc_pb.js +45 -0
  265. package/generated/serverfeatures_pb.d.ts +61 -0
  266. package/generated/serverfeatures_pb.js +476 -0
  267. package/generated/shared_grpc_pb.js +1 -0
  268. package/generated/shared_pb.d.ts +335 -0
  269. package/generated/shared_pb.js +2374 -0
  270. package/generated/status_grpc_pb.js +1 -0
  271. package/generated/status_pb.d.ts +38 -0
  272. package/generated/status_pb.js +261 -0
  273. package/generated/streams_grpc_pb.d.ts +112 -0
  274. package/generated/streams_grpc_pb.js +180 -0
  275. package/generated/streams_pb.d.ts +1660 -0
  276. package/generated/streams_pb.js +11556 -0
  277. package/generated/users_grpc_pb.d.ts +158 -0
  278. package/generated/users_grpc_pb.js +275 -0
  279. package/generated/users_pb.d.ts +601 -0
  280. package/generated/users_pb.js +4451 -0
  281. package/package.json +65 -0
package/README.md ADDED
@@ -0,0 +1,201 @@
1
+ # @kurrent/db-client
2
+
3
+ [![npm][npm-badge]][npm-badge-url]
4
+ [![Github action CI workflow][ci-badge]][ci-badge-url]
5
+ [![license][license-badge]][license-badge-url]
6
+
7
+ This is the package for the NodeJS client for KurrentDB 20+ and uses gRPC as the communication protocol.
8
+
9
+ ## Installation
10
+
11
+ ```shell script
12
+ # Yarn
13
+ $ yarn add @kurrent/db-client
14
+
15
+ # NPM
16
+ $ npm install --save @kurrent/db-client
17
+ ```
18
+
19
+ ## KurrentDB Server Compatibility
20
+
21
+ Tests are run exclusively against Long-Term Support (LTS) versions. While the code may function with older versions, we do not provide any guarantees or support for them.
22
+
23
+ Server setup instructions can be found under the installation section of the [Kurrent Docs]. Follow the Docker setup for the simplest configuration.
24
+
25
+ ## Example
26
+
27
+ The following snippet showcases a simple example where we form a connection, then append and read events from the server.
28
+
29
+ ###### Javascript example:
30
+
31
+ ```javascript
32
+ const {
33
+ KurrentDBClient,
34
+ jsonEvent,
35
+ FORWARDS,
36
+ START,
37
+ } = require('@kurrent/db-client');
38
+
39
+ const client = new KurrentDBClient({
40
+ endpoint: "localhost:2113",
41
+ });
42
+
43
+ async function simpleTest() {
44
+ const streamName = "es_supported_clients";
45
+
46
+ const event = jsonEvent({
47
+ type: "grpc-client",
48
+ data: {
49
+ languages: ["typescript", "javascript"],
50
+ runtime: "NodeJS",
51
+ },
52
+ });
53
+
54
+ const appendResult = await client.appendToStream(streamName, [event]);
55
+
56
+ // read the event
57
+ const events = client.readStream(streamName, {
58
+ fromRevision: START,
59
+ direction: FORWARDS,
60
+ maxCount: 10,
61
+ });
62
+
63
+ for await (const { event } of events) {
64
+ console.log('Appended event: ', event);
65
+ }
66
+ } catch (error) {
67
+ console.error('An error occured: ', error);
68
+ } finally {
69
+ await client.dispose();
70
+ }
71
+ })();
72
+ ```
73
+
74
+ ###### Typescript example:
75
+
76
+ ```typescript
77
+ import {
78
+ KurrentDBClient,
79
+ jsonEvent,
80
+ FORWARDS,
81
+ START,
82
+ JSONEventType,
83
+ } from '@kurrent/db-client';
84
+
85
+ const client = new KurrentDBClient({
86
+ endpoint: 'localhost:2113',
87
+ });
88
+
89
+ interface Reservation {
90
+ reservationId: string;
91
+ movieId: string;
92
+ userId: string;
93
+ seatId: string;
94
+ }
95
+
96
+ type SeatReservedEvent = JSONEventType<
97
+ 'seat-reserved',
98
+ {
99
+ reservationId: string;
100
+ movieId: string;
101
+ userId: string;
102
+ seatId: string;
103
+ }
104
+ >;
105
+
106
+ type SeatChangedEvent = JSONEventType<
107
+ 'seat-changed',
108
+ {
109
+ reservationId: string;
110
+ newSeatId: string;
111
+ }
112
+ >;
113
+
114
+ type ReservationEvents = SeatReservedEvent | SeatChangedEvent;
115
+
116
+ async function simpleTest(): Promise<void> {
117
+ const streamName = 'booking-abc123';
118
+
119
+ const event = jsonEvent<SeatReservedEvent>({
120
+ type: 'seat-reserved',
121
+ data: {
122
+ reservationId: 'abc123',
123
+ movieId: 'tt0368226',
124
+ userId: 'nm0802995',
125
+ seatId: '4b',
126
+ },
127
+ });
128
+
129
+ const appendResult = await client.appendToStream<ReservationEvents>(
130
+ streamName,
131
+ event
132
+ );
133
+
134
+ // By reading the events in the stream, we can construct the current state of the booking
135
+
136
+ interface Reservation {
137
+ reservationId: string;
138
+ movieId: string;
139
+ userId: string;
140
+ seatId: string;
141
+ }
142
+
143
+ const events = client.readStream<ReservationEvents>(streamName, {
144
+ fromRevision: START,
145
+ direction: FORWARDS,
146
+ maxCount: 10,
147
+ });
148
+
149
+ const reservation: Partial<Reservation> = {};
150
+
151
+ for await (const { event } of events) {
152
+ switch (event.type) {
153
+ case 'seat-reserved': {
154
+ reservation.reservationId = event.data.reservationId;
155
+ reservation.movieId = event.data.movieId;
156
+ reservation.seatId = event.data.seatId;
157
+ reservation.userId = event.data.userId;
158
+ break;
159
+ }
160
+ case 'seat-changed': {
161
+ reservation.seatId = event.data.newSeatId;
162
+ break;
163
+ }
164
+ default: {
165
+ const _exhaustiveCheck: never = event;
166
+ break;
167
+ }
168
+ }
169
+ }
170
+ }
171
+
172
+ // Do something with our reservation
173
+ console.log(reservation);
174
+ ```
175
+
176
+ ## Support
177
+
178
+ Information on support can be found on our website: [Kurrent Support]
179
+
180
+ ## Communities
181
+
182
+ - [Discuss]
183
+ - [Discord (Kurrent)][discord-kurrent]
184
+ - [Discord (ddd-cqrs-es)][discord-ddd-cqrs-es]
185
+
186
+ ## Contributing
187
+
188
+ Refer to our [Contribution Guidelines]
189
+
190
+ [Kurrent support]: https://kurrent.io/support/
191
+ [discuss]: https://discuss.eventstore.com/
192
+ [discord-kurrent]: https://discord.gg/Phn9pmCw3t
193
+ [discord-ddd-cqrs-es]: https://discord.com/invite/sEZGSHNNbH
194
+ [npm-badge]: https://img.shields.io/npm/v/@kurrent/db-client.svg
195
+ [npm-badge-url]: https://www.npmjs.com/package/@kurrent/db-client
196
+ [ci-badge]: https://github.com/EventStore/Kurrent-Client-NodeJS/workflows/CI/badge.svg?branch=master
197
+ [ci-badge-url]: https://github.com/EventStore/Kurrent-Client-NodeJS/actions
198
+ [license-badge]: https://img.shields.io/npm/l/@kurrent/db-client.svg
199
+ [license-badge-url]: https://github.com/EventStore/Kurrent-Client-NodeJS/blob/master/LICENSE
200
+ [contribution guidelines]: https://github.com/EventStore/Kurrent-Client-NodeJS/blob/master/CONTRIBUTING.md
201
+ [Kurrent docs]: https://developers.kurrent.io/server/v24.6/quick-start/installation
@@ -0,0 +1,17 @@
1
+ import type { MethodDefinition, ServiceError } from "@grpc/grpc-js";
2
+ import { ServerFeaturesClient } from "../../generated/serverfeatures_grpc_pb";
3
+ import type { SupportedMethods } from "../../generated/serverfeatures_pb";
4
+ import type { GRPCClientConstructor } from "../types";
5
+ type ExecuteClientCapabilities = [
6
+ GRPCClientConstructor<ServerFeaturesClient>,
7
+ string,
8
+ (c: ServerFeaturesClient) => Promise<ServerFeatures>
9
+ ];
10
+ export declare class ServerFeatures {
11
+ #private;
12
+ serverVersion: string;
13
+ static readonly createServerFeatures: ExecuteClientCapabilities;
14
+ constructor(error: ServiceError | null, supportedMethods: SupportedMethods);
15
+ supports: (method: MethodDefinition<any, any>, feature?: string) => boolean;
16
+ }
17
+ export {};
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ServerFeatures = void 0;
4
+ const shared_pb_1 = require("../../generated/shared_pb");
5
+ const serverfeatures_grpc_pb_1 = require("../../generated/serverfeatures_grpc_pb");
6
+ const utils_1 = require("../utils");
7
+ const constants_1 = require("@grpc/grpc-js/build/src/constants");
8
+ const UNKNOWN = "unknown";
9
+ class ServerFeatures {
10
+ serverVersion = UNKNOWN;
11
+ #supported = new Map();
12
+ static createServerFeatures = [
13
+ serverfeatures_grpc_pb_1.ServerFeaturesClient,
14
+ "getSupportedMethods",
15
+ (client) => new Promise((resolve, reject) => {
16
+ utils_1.debug.connection("Fetching server features");
17
+ client.getSupportedMethods(new shared_pb_1.Empty(), (error, supportedMethods) => {
18
+ if (error && error.code !== constants_1.Status.UNIMPLEMENTED) {
19
+ return reject(error);
20
+ }
21
+ return resolve(new ServerFeatures(error, supportedMethods));
22
+ });
23
+ }),
24
+ ];
25
+ constructor(error, supportedMethods) {
26
+ if (error) {
27
+ utils_1.debug.connection("Failed to fetch server features with error: %s", error.message);
28
+ utils_1.debug.connection("Assuming unknown server version.");
29
+ return;
30
+ }
31
+ this.serverVersion = supportedMethods.getEventStoreServerVersion();
32
+ utils_1.debug.connection("Connected to server version %s", this.serverVersion);
33
+ for (const method of supportedMethods.getMethodsList()) {
34
+ const path = `/${method.getServiceName()}/${method.getMethodName()}`.toLowerCase();
35
+ const features = method.getFeaturesList();
36
+ this.#supported.set(path, new Set(features));
37
+ }
38
+ }
39
+ supports = (
40
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
41
+ method, feature) => {
42
+ const path = method.path.toLowerCase();
43
+ const isSupported = feature
44
+ ? !!this.#supported.get(path)?.has(feature)
45
+ : this.#supported.has(path);
46
+ if (isSupported) {
47
+ utils_1.debug.connection("%s %s is Supported", path, feature ?? "");
48
+ }
49
+ else {
50
+ utils_1.debug.connection("%s %s is not Supported", path, feature ?? "");
51
+ }
52
+ return isSupported;
53
+ };
54
+ }
55
+ exports.ServerFeatures = ServerFeatures;
56
+ //# sourceMappingURL=ServerFeatures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServerFeatures.js","sourceRoot":"","sources":["../../src/Client/ServerFeatures.ts"],"names":[],"mappings":";;;AAEA,yDAAkD;AAClD,mFAA8E;AAG9E,oCAAiC;AAEjC,iEAA2D;AAQ3D,MAAM,OAAO,GAAG,SAAS,CAAC;AAE1B,MAAa,cAAc;IAClB,aAAa,GAAW,OAAO,CAAC;IAEvC,UAAU,GAAG,IAAI,GAAG,EAAuB,CAAC;IAE5C,MAAM,CAAU,oBAAoB,GAA8B;QAChE,6CAAoB;QACpB,qBAAqB;QACrB,CAAC,MAA4B,EAAE,EAAE,CAC/B,IAAI,OAAO,CAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC9C,aAAK,CAAC,UAAU,CAAC,0BAA0B,CAAC,CAAC;YAC7C,MAAM,CAAC,mBAAmB,CAAC,IAAI,iBAAK,EAAE,EAAE,CAAC,KAAK,EAAE,gBAAgB,EAAE,EAAE;gBAClE,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAM,CAAC,aAAa,EAAE,CAAC;oBACjD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;gBACvB,CAAC;gBACD,OAAO,OAAO,CAAC,IAAI,cAAc,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC;YAC9D,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;KACL,CAAC;IAEF,YAAY,KAA0B,EAAE,gBAAkC;QACxE,IAAI,KAAK,EAAE,CAAC;YACV,aAAK,CAAC,UAAU,CACd,gDAAgD,EAChD,KAAK,CAAC,OAAO,CACd,CAAC;YACF,aAAK,CAAC,UAAU,CAAC,kCAAkC,CAAC,CAAC;YACrD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,aAAa,GAAG,gBAAgB,CAAC,0BAA0B,EAAE,CAAC;QAEnE,aAAK,CAAC,UAAU,CAAC,gCAAgC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAEvE,KAAK,MAAM,MAAM,IAAI,gBAAgB,CAAC,cAAc,EAAE,EAAE,CAAC;YACvD,MAAM,IAAI,GACR,IAAI,MAAM,CAAC,cAAc,EAAE,IAAI,MAAM,CAAC,aAAa,EAAE,EAAE,CAAC,WAAW,EAAE,CAAC;YACxE,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;YAC1C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAEM,QAAQ,GAAG;IAChB,8DAA8D;IAC9D,MAAkC,EAClC,OAAgB,EACP,EAAE;QACX,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,WAAW,GAAG,OAAO;YACzB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC;YAC3C,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAE9B,IAAI,WAAW,EAAE,CAAC;YAChB,aAAK,CAAC,UAAU,CAAC,oBAAoB,EAAE,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;QAC9D,CAAC;aAAM,CAAC;YACN,aAAK,CAAC,UAAU,CAAC,wBAAwB,EAAE,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC,CAAC;;AA3DJ,wCA4DC"}
@@ -0,0 +1,15 @@
1
+ import { ChannelCredentials } from "@grpc/grpc-js";
2
+ import { EndPoint, NodePreference, VNodeState } from "../types";
3
+ import type { DNSClusterOptions, GossipClusterOptions } from ".";
4
+ export interface MemberInfo {
5
+ instanceId?: string;
6
+ timeStamp: number;
7
+ state: VNodeState;
8
+ isAlive: boolean;
9
+ httpEndpoint?: EndPoint;
10
+ }
11
+ export declare const discoverEndpoint: ({ discoveryInterval, maxDiscoverAttempts, gossipTimeout, nodePreference, ...settings }: DNSClusterOptions | GossipClusterOptions, credentials: ChannelCredentials, failedEndpoint?: EndPoint) => Promise<EndPoint>;
12
+ export declare const isInAllowedState: (member: MemberInfo) => boolean;
13
+ export declare const filterAndOrderMembers: (preference: NodePreference, members: MemberInfo[]) => MemberInfo[];
14
+ export declare const determineBestNode: (preference: NodePreference, members: MemberInfo[]) => EndPoint | undefined;
15
+ export declare const delay: (timeout: number) => Promise<void>;
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.delay = exports.determineBestNode = exports.filterAndOrderMembers = exports.isInAllowedState = exports.discoverEndpoint = void 0;
4
+ const grpc_js_1 = require("@grpc/grpc-js");
5
+ const gossip_grpc_pb_1 = require("../../generated/gossip_grpc_pb");
6
+ const shared_pb_1 = require("../../generated/shared_pb");
7
+ const types_1 = require("../types");
8
+ const constants_1 = require("../constants");
9
+ const utils_1 = require("../utils");
10
+ const discoverEndpoint = async ({ discoveryInterval = 100, maxDiscoverAttempts = 10, gossipTimeout = 5, nodePreference = constants_1.LEADER, ...settings }, credentials, failedEndpoint) => {
11
+ let discoverAttempts = 0;
12
+ while (discoverAttempts < maxDiscoverAttempts) {
13
+ discoverAttempts++;
14
+ try {
15
+ const candidates = "endpoints" in settings ? settings.endpoints : [settings.discover];
16
+ utils_1.debug.connection(`Starting discovery for candidates: %O`, candidates);
17
+ const candidateDiscoveryOrder = [...candidates]
18
+ .sort(shuffle)
19
+ .sort((a) => {
20
+ // Move failed endpoint to the last
21
+ if (a.address === failedEndpoint?.address &&
22
+ a.port === failedEndpoint?.port) {
23
+ return 1;
24
+ }
25
+ return 0;
26
+ });
27
+ for (const candidate of candidateDiscoveryOrder) {
28
+ try {
29
+ const members = await listClusterMembers(candidate, credentials, createDeadline(gossipTimeout));
30
+ const endpoint = (0, exports.determineBestNode)(nodePreference, members);
31
+ if (endpoint)
32
+ return Promise.resolve(endpoint);
33
+ }
34
+ catch (error) {
35
+ utils_1.debug.connection(`Failed to get cluster list from ${candidate.address}:${candidate.port}`, error.toString());
36
+ continue;
37
+ }
38
+ }
39
+ }
40
+ catch (error) {
41
+ utils_1.debug.connection(`Failed to resolve dns: `, error.toString());
42
+ }
43
+ await (0, exports.delay)(discoveryInterval);
44
+ }
45
+ throw new Error(`Failed to discover after ${discoverAttempts} attempts.`);
46
+ };
47
+ exports.discoverEndpoint = discoverEndpoint;
48
+ const allowedStates = new Set([
49
+ types_1.VNodeState.FOLLOWER,
50
+ types_1.VNodeState.LEADER,
51
+ types_1.VNodeState.READONLYREPLICA,
52
+ types_1.VNodeState.PREREADONLYREPLICA,
53
+ types_1.VNodeState.READONLYLEADERLESS,
54
+ ]);
55
+ const isInAllowedState = (member) => member.isAlive && allowedStates.has(member.state);
56
+ exports.isInAllowedState = isInAllowedState;
57
+ // getPreferedStates, higher index is better
58
+ const getPreferedStates = (preference) => {
59
+ switch (preference) {
60
+ case constants_1.LEADER:
61
+ return [types_1.VNodeState.LEADER];
62
+ case constants_1.FOLLOWER:
63
+ return [types_1.VNodeState.FOLLOWER];
64
+ case constants_1.READ_ONLY_REPLICA:
65
+ return [
66
+ types_1.VNodeState.READONLYLEADERLESS,
67
+ types_1.VNodeState.PREREADONLYREPLICA,
68
+ types_1.VNodeState.READONLYREPLICA,
69
+ ];
70
+ default:
71
+ return [];
72
+ }
73
+ };
74
+ const compareByPreference = (preference) => {
75
+ const preferedStates = getPreferedStates(preference);
76
+ return (a, b) => preferedStates.indexOf(b.state) - preferedStates.indexOf(a.state);
77
+ };
78
+ const shuffle = () => Math.random() - 0.5;
79
+ const filterAndOrderMembers = (preference, members) => members
80
+ .filter(exports.isInAllowedState)
81
+ .sort(shuffle)
82
+ .sort(compareByPreference(preference));
83
+ exports.filterAndOrderMembers = filterAndOrderMembers;
84
+ const determineBestNode = (preference, members) => {
85
+ utils_1.debug.connection(`Determining best node with preference "%s" from members: %O`, preference, members);
86
+ const [chosenMember] = (0, exports.filterAndOrderMembers)(preference, members);
87
+ if (!chosenMember || !chosenMember.httpEndpoint)
88
+ return undefined;
89
+ utils_1.debug.connection(`Chose member: %O`, chosenMember);
90
+ return {
91
+ address: chosenMember.httpEndpoint.address,
92
+ port: chosenMember.httpEndpoint.port,
93
+ };
94
+ };
95
+ exports.determineBestNode = determineBestNode;
96
+ function createDeadline(seconds) {
97
+ const deadline = new Date();
98
+ deadline.setSeconds(deadline.getSeconds() + seconds);
99
+ return deadline;
100
+ }
101
+ function listClusterMembers(seed, credentials, deadline) {
102
+ const uri = `${seed.address}:${seed.port}`;
103
+ const client = new gossip_grpc_pb_1.GossipClient(uri, credentials, {});
104
+ return new Promise((resolve, reject) => {
105
+ client.read(new shared_pb_1.Empty(), new grpc_js_1.Metadata(), { deadline }, (error, info) => {
106
+ // regardless of the outcome, we are done with this client.
107
+ client.close();
108
+ if (error)
109
+ return reject(error);
110
+ const members = [];
111
+ for (const grpcMember of info.getMembersList()) {
112
+ let httpEndpoint;
113
+ const grpcHttpEndpoint = grpcMember.getHttpEndPoint();
114
+ if (grpcHttpEndpoint) {
115
+ httpEndpoint = {
116
+ address: grpcHttpEndpoint.getAddress(),
117
+ port: grpcHttpEndpoint.getPort(),
118
+ };
119
+ }
120
+ const member = {
121
+ instanceId: (0, utils_1.parseUUID)(grpcMember.getInstanceId()),
122
+ timeStamp: parseInt(grpcMember.getTimeStamp(), 10),
123
+ state: grpcMember.getState(),
124
+ isAlive: grpcMember.getIsAlive(),
125
+ httpEndpoint,
126
+ };
127
+ members.push(member);
128
+ }
129
+ return resolve(members);
130
+ });
131
+ });
132
+ }
133
+ const delay = (timeout) => new Promise((resolve) => setTimeout(resolve, timeout));
134
+ exports.delay = delay;
135
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/Client/discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { IncomingMessage } from "http";
2
+ import type { Credentials, BaseOptions } from "../types";
3
+ import type { ChannelCredentialOptions, Client } from "./";
4
+ type TransformError = (statusCode: number, statusMessage: string, res: IncomingMessage) => Error | undefined;
5
+ export interface HTTPRequestOptions extends BaseOptions {
6
+ headers?: Record<string, string>;
7
+ searchParams?: Record<string, string | undefined>;
8
+ transformError?: TransformError;
9
+ }
10
+ type HTTPMethod = "GET" | "HEAD" | "POST" | "PUT" | "DELETE" | "CONNECT" | "OPTIONS" | "TRACE" | "PATCH";
11
+ export declare class HTTP {
12
+ #private;
13
+ constructor(client: Client, channelCredentials: ChannelCredentialOptions, defaultUserCredentials?: Credentials);
14
+ request: <T = unknown>(method: HTTPMethod, path: string, { searchParams, ...options }: HTTPRequestOptions, body?: string) => Promise<T>;
15
+ private makeRequest;
16
+ private createURL;
17
+ private getChannel;
18
+ }
19
+ export {};
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HTTP = void 0;
4
+ const http_1 = require("http");
5
+ const https_1 = require("https");
6
+ const url_1 = require("url");
7
+ const utils_1 = require("../utils");
8
+ class HTTP {
9
+ #client;
10
+ #channelCredentials;
11
+ #defaultUserCredentials;
12
+ #insecure;
13
+ constructor(client, channelCredentials, defaultUserCredentials) {
14
+ this.#client = client;
15
+ this.#channelCredentials = channelCredentials;
16
+ this.#defaultUserCredentials = defaultUserCredentials;
17
+ this.#insecure = !!channelCredentials.insecure;
18
+ }
19
+ request = async (method, path, { searchParams, ...options }, body) => {
20
+ const url = await this.createURL(path, searchParams);
21
+ return this.makeRequest(method, url, options, body);
22
+ };
23
+ makeRequest = async (method, url, options, body) => new Promise((resolve, reject) => {
24
+ const headers = {
25
+ "content-type": "application/json",
26
+ ...(options.headers ?? {}),
27
+ };
28
+ const credentials = options.credentials ?? this.#defaultUserCredentials;
29
+ if (!this.#insecure && credentials) {
30
+ headers["Authorization"] = `Basic ${Buffer.from(`${credentials.username}:${credentials.password}`).toString("base64")}`;
31
+ }
32
+ const ca = this.#channelCredentials.rootCertificate
33
+ ? [this.#channelCredentials.rootCertificate]
34
+ : undefined;
35
+ const callback = (res) => {
36
+ if (res.statusCode === 307) {
37
+ return resolve(this.makeRequest(method, new url_1.URL(res.headers.location, url), options, body));
38
+ }
39
+ if (res.statusCode < 200 || res.statusCode >= 300) {
40
+ const error = options.transformError?.(res.statusCode, res.statusMessage, res) ??
41
+ defaultTransformError(res.statusCode, res.statusMessage, res);
42
+ return reject(error);
43
+ }
44
+ let response = "";
45
+ res.on("data", (d) => {
46
+ response += d;
47
+ });
48
+ res.on("end", () => {
49
+ return resolve(JSON.parse(response));
50
+ });
51
+ };
52
+ utils_1.debug.connection(`Making %s call to %s with headers %h`, method, url.toString(), headers);
53
+ const req = this.#insecure
54
+ ? (0, http_1.request)(url, {
55
+ method,
56
+ headers,
57
+ }, callback)
58
+ : (0, https_1.request)(url, {
59
+ method,
60
+ headers,
61
+ ca,
62
+ }, callback);
63
+ req.on("error", (error) => {
64
+ reject(error);
65
+ });
66
+ if (body) {
67
+ req.write(body);
68
+ }
69
+ req.end();
70
+ });
71
+ createURL = async (pathname, searchParams = {}) => {
72
+ const channel = await this.getChannel.call(this.#client);
73
+ const protocol = this.#insecure ? "http://" : "https://";
74
+ const target = channel.getTarget().replace(/^[a-z]*:/, protocol);
75
+ const url = new url_1.URL(target);
76
+ url.pathname = pathname;
77
+ for (const [key, value] of Object.entries(searchParams)) {
78
+ if (value != null) {
79
+ url.searchParams.set(key, value);
80
+ }
81
+ }
82
+ return url;
83
+ };
84
+ getChannel() {
85
+ return this.getChannel();
86
+ }
87
+ }
88
+ exports.HTTP = HTTP;
89
+ const defaultTransformError = (statusCode, statusMessage) => {
90
+ switch (statusCode) {
91
+ case 401: {
92
+ return new utils_1.AccessDeniedError();
93
+ }
94
+ }
95
+ return new utils_1.UnknownError(undefined, statusMessage);
96
+ };
97
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/Client/http.ts"],"names":[],"mappings":"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"}