@cratis/chronicle.contracts 0.0.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/ChronicleConnection.ts +419 -0
- package/ChronicleConnectionString.ts +462 -0
- package/ChronicleServices.ts +104 -0
- package/DateTimeOffset.ts +27 -0
- package/README.md +221 -0
- package/TokenProvider.ts +167 -0
- package/dist/ChronicleConnection.d.ts +63 -0
- package/dist/ChronicleConnection.d.ts.map +1 -0
- package/dist/ChronicleConnection.js +223 -0
- package/dist/ChronicleConnection.js.map +1 -0
- package/dist/ChronicleConnectionString.d.ts +67 -0
- package/dist/ChronicleConnectionString.d.ts.map +1 -0
- package/dist/ChronicleConnectionString.js +255 -0
- package/dist/ChronicleConnectionString.js.map +1 -0
- package/dist/ChronicleServices.d.ts +35 -0
- package/dist/ChronicleServices.d.ts.map +1 -0
- package/dist/ChronicleServices.js +2 -0
- package/dist/ChronicleServices.js.map +1 -0
- package/dist/DateTimeOffset.d.ts +4 -0
- package/dist/DateTimeOffset.d.ts.map +1 -0
- package/dist/DateTimeOffset.js +11 -0
- package/dist/DateTimeOffset.js.map +1 -0
- package/dist/TokenProvider.d.ts +21 -0
- package/dist/TokenProvider.d.ts.map +1 -0
- package/dist/TokenProvider.js +92 -0
- package/dist/TokenProvider.js.map +1 -0
- package/dist/cjs/ChronicleConnection.d.ts +63 -0
- package/dist/cjs/ChronicleConnection.d.ts.map +1 -0
- package/dist/cjs/ChronicleConnection.js +245 -0
- package/dist/cjs/ChronicleConnection.js.map +1 -0
- package/dist/cjs/ChronicleConnectionString.d.ts +67 -0
- package/dist/cjs/ChronicleConnectionString.d.ts.map +1 -0
- package/dist/cjs/ChronicleConnectionString.js +280 -0
- package/dist/cjs/ChronicleConnectionString.js.map +1 -0
- package/dist/cjs/ChronicleServices.d.ts +35 -0
- package/dist/cjs/ChronicleServices.d.ts.map +1 -0
- package/dist/cjs/DateTimeOffset.d.ts +4 -0
- package/dist/cjs/DateTimeOffset.d.ts.map +1 -0
- package/dist/cjs/DateTimeOffset.js +16 -0
- package/dist/cjs/DateTimeOffset.js.map +1 -0
- package/dist/cjs/TokenProvider.d.ts +21 -0
- package/dist/cjs/TokenProvider.d.ts.map +1 -0
- package/dist/cjs/TokenProvider.js +118 -0
- package/dist/cjs/TokenProvider.js.map +1 -0
- package/dist/cjs/generated/clients.d.ts +82 -0
- package/dist/cjs/generated/clients.d.ts.map +1 -0
- package/dist/cjs/generated/clients.js +235 -0
- package/dist/cjs/generated/clients.js.map +1 -0
- package/dist/cjs/generated/cratis_chronicle_contracts.d.ts +135 -0
- package/dist/cjs/generated/cratis_chronicle_contracts.d.ts.map +1 -0
- package/dist/cjs/generated/cratis_chronicle_contracts.js +300 -0
- package/dist/cjs/generated/cratis_chronicle_contracts.js.map +1 -0
- package/dist/cjs/generated/events.d.ts +166 -0
- package/dist/cjs/generated/events.d.ts.map +1 -0
- package/dist/cjs/generated/events.js +899 -0
- package/dist/cjs/generated/events.js.map +1 -0
- package/dist/cjs/generated/events_constraints.d.ts +83 -0
- package/dist/cjs/generated/events_constraints.d.ts.map +1 -0
- package/dist/cjs/generated/events_constraints.js +512 -0
- package/dist/cjs/generated/events_constraints.js.map +1 -0
- package/dist/cjs/generated/eventsequences.d.ts +400 -0
- package/dist/cjs/generated/eventsequences.d.ts.map +1 -0
- package/dist/cjs/generated/eventsequences.js +3866 -0
- package/dist/cjs/generated/eventsequences.js.map +1 -0
- package/dist/cjs/generated/google/protobuf/empty.d.ts +19 -0
- package/dist/cjs/generated/google/protobuf/empty.d.ts.map +1 -0
- package/dist/cjs/generated/google/protobuf/empty.js +42 -0
- package/dist/cjs/generated/google/protobuf/empty.js.map +1 -0
- package/dist/cjs/generated/host.d.ts +61 -0
- package/dist/cjs/generated/host.d.ts.map +1 -0
- package/dist/cjs/generated/host.js +103 -0
- package/dist/cjs/generated/host.js.map +1 -0
- package/dist/cjs/generated/identities.d.ts +70 -0
- package/dist/cjs/generated/identities.d.ts.map +1 -0
- package/dist/cjs/generated/identities.js +255 -0
- package/dist/cjs/generated/identities.js.map +1 -0
- package/dist/cjs/generated/jobs.d.ts +258 -0
- package/dist/cjs/generated/jobs.d.ts.map +1 -0
- package/dist/cjs/generated/jobs.js +1709 -0
- package/dist/cjs/generated/jobs.js.map +1 -0
- package/dist/cjs/generated/observation.d.ts +278 -0
- package/dist/cjs/generated/observation.d.ts.map +1 -0
- package/dist/cjs/generated/observation.js +1573 -0
- package/dist/cjs/generated/observation.js.map +1 -0
- package/dist/cjs/generated/observation_eventstoresubscriptions.d.ts +99 -0
- package/dist/cjs/generated/observation_eventstoresubscriptions.d.ts.map +1 -0
- package/dist/cjs/generated/observation_reactors.d.ts +198 -0
- package/dist/cjs/generated/observation_reactors.d.ts.map +1 -0
- package/dist/cjs/generated/observation_reactors.js +1918 -0
- package/dist/cjs/generated/observation_reactors.js.map +1 -0
- package/dist/cjs/generated/observation_reducers.d.ts +183 -0
- package/dist/cjs/generated/observation_reducers.d.ts.map +1 -0
- package/dist/cjs/generated/observation_reducers.js +1906 -0
- package/dist/cjs/generated/observation_reducers.js.map +1 -0
- package/dist/cjs/generated/observation_webhooks.d.ts +203 -0
- package/dist/cjs/generated/observation_webhooks.d.ts.map +1 -0
- package/dist/cjs/generated/observation_webhooks.js +1344 -0
- package/dist/cjs/generated/observation_webhooks.js.map +1 -0
- package/dist/cjs/generated/projections.d.ts +421 -0
- package/dist/cjs/generated/projections.d.ts.map +1 -0
- package/dist/cjs/generated/projections.js +3985 -0
- package/dist/cjs/generated/projections.js.map +1 -0
- package/dist/cjs/generated/protobuf-net/bcl.d.ts +55 -0
- package/dist/cjs/generated/protobuf-net/bcl.d.ts.map +1 -0
- package/dist/cjs/generated/protobuf-net/bcl.js +457 -0
- package/dist/cjs/generated/protobuf-net/bcl.js.map +1 -0
- package/dist/cjs/generated/readmodels.d.ts +436 -0
- package/dist/cjs/generated/readmodels.d.ts.map +1 -0
- package/dist/cjs/generated/readmodels.js +3608 -0
- package/dist/cjs/generated/readmodels.js.map +1 -0
- package/dist/cjs/generated/recommendations.d.ts +109 -0
- package/dist/cjs/generated/recommendations.d.ts.map +1 -0
- package/dist/cjs/generated/recommendations.js +430 -0
- package/dist/cjs/generated/recommendations.js.map +1 -0
- package/dist/cjs/generated/security.d.ts +288 -0
- package/dist/cjs/generated/security.d.ts.map +1 -0
- package/dist/cjs/generated/security.js +1247 -0
- package/dist/cjs/generated/security.js.map +1 -0
- package/dist/cjs/generated/seeding.d.ts +109 -0
- package/dist/cjs/generated/seeding.d.ts.map +1 -0
- package/dist/cjs/generated/seeding.js +619 -0
- package/dist/cjs/generated/seeding.js.map +1 -0
- package/dist/cjs/index.d.ts +33 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +372 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/esm/ChronicleConnection.d.ts +63 -0
- package/dist/esm/ChronicleConnection.d.ts.map +1 -0
- package/dist/esm/ChronicleConnection.js +224 -0
- package/dist/esm/ChronicleConnection.js.map +1 -0
- package/dist/esm/ChronicleConnectionString.d.ts +67 -0
- package/dist/esm/ChronicleConnectionString.d.ts.map +1 -0
- package/dist/esm/ChronicleConnectionString.js +258 -0
- package/dist/esm/ChronicleConnectionString.js.map +1 -0
- package/dist/esm/ChronicleServices.d.ts +35 -0
- package/dist/esm/ChronicleServices.d.ts.map +1 -0
- package/dist/esm/DateTimeOffset.d.ts +4 -0
- package/dist/esm/DateTimeOffset.d.ts.map +1 -0
- package/dist/esm/DateTimeOffset.js +13 -0
- package/dist/esm/DateTimeOffset.js.map +1 -0
- package/dist/esm/TokenProvider.d.ts +21 -0
- package/dist/esm/TokenProvider.d.ts.map +1 -0
- package/dist/esm/TokenProvider.js +95 -0
- package/dist/esm/TokenProvider.js.map +1 -0
- package/dist/esm/generated/clients.d.ts +82 -0
- package/dist/esm/generated/clients.d.ts.map +1 -0
- package/dist/esm/generated/clients.js +228 -0
- package/dist/esm/generated/clients.js.map +1 -0
- package/dist/esm/generated/cratis_chronicle_contracts.d.ts +135 -0
- package/dist/esm/generated/cratis_chronicle_contracts.d.ts.map +1 -0
- package/dist/esm/generated/cratis_chronicle_contracts.js +291 -0
- package/dist/esm/generated/cratis_chronicle_contracts.js.map +1 -0
- package/dist/esm/generated/events.d.ts +166 -0
- package/dist/esm/generated/events.d.ts.map +1 -0
- package/dist/esm/generated/events.js +885 -0
- package/dist/esm/generated/events.js.map +1 -0
- package/dist/esm/generated/events_constraints.d.ts +83 -0
- package/dist/esm/generated/events_constraints.d.ts.map +1 -0
- package/dist/esm/generated/events_constraints.js +501 -0
- package/dist/esm/generated/events_constraints.js.map +1 -0
- package/dist/esm/generated/eventsequences.d.ts +400 -0
- package/dist/esm/generated/eventsequences.d.ts.map +1 -0
- package/dist/esm/generated/eventsequences.js +3829 -0
- package/dist/esm/generated/eventsequences.js.map +1 -0
- package/dist/esm/generated/google/protobuf/empty.d.ts +19 -0
- package/dist/esm/generated/google/protobuf/empty.d.ts.map +1 -0
- package/dist/esm/generated/google/protobuf/empty.js +40 -0
- package/dist/esm/generated/google/protobuf/empty.js.map +1 -0
- package/dist/esm/generated/host.d.ts +61 -0
- package/dist/esm/generated/host.d.ts.map +1 -0
- package/dist/esm/generated/host.js +99 -0
- package/dist/esm/generated/host.js.map +1 -0
- package/dist/esm/generated/identities.d.ts +70 -0
- package/dist/esm/generated/identities.d.ts.map +1 -0
- package/dist/esm/generated/identities.js +249 -0
- package/dist/esm/generated/identities.js.map +1 -0
- package/dist/esm/generated/jobs.d.ts +258 -0
- package/dist/esm/generated/jobs.d.ts.map +1 -0
- package/dist/esm/generated/jobs.js +1684 -0
- package/dist/esm/generated/jobs.js.map +1 -0
- package/dist/esm/generated/observation.d.ts +278 -0
- package/dist/esm/generated/observation.d.ts.map +1 -0
- package/dist/esm/generated/observation.js +1548 -0
- package/dist/esm/generated/observation.js.map +1 -0
- package/dist/esm/generated/observation_eventstoresubscriptions.d.ts +99 -0
- package/dist/esm/generated/observation_eventstoresubscriptions.d.ts.map +1 -0
- package/dist/esm/generated/observation_reactors.d.ts +198 -0
- package/dist/esm/generated/observation_reactors.d.ts.map +1 -0
- package/dist/esm/generated/observation_reactors.js +1893 -0
- package/dist/esm/generated/observation_reactors.js.map +1 -0
- package/dist/esm/generated/observation_reducers.d.ts +183 -0
- package/dist/esm/generated/observation_reducers.d.ts.map +1 -0
- package/dist/esm/generated/observation_reducers.js +1882 -0
- package/dist/esm/generated/observation_reducers.js.map +1 -0
- package/dist/esm/generated/observation_webhooks.d.ts +203 -0
- package/dist/esm/generated/observation_webhooks.d.ts.map +1 -0
- package/dist/esm/generated/observation_webhooks.js +1323 -0
- package/dist/esm/generated/observation_webhooks.js.map +1 -0
- package/dist/esm/generated/projections.d.ts +421 -0
- package/dist/esm/generated/projections.d.ts.map +1 -0
- package/dist/esm/generated/projections.js +3930 -0
- package/dist/esm/generated/projections.js.map +1 -0
- package/dist/esm/generated/protobuf-net/bcl.d.ts +55 -0
- package/dist/esm/generated/protobuf-net/bcl.d.ts.map +1 -0
- package/dist/esm/generated/protobuf-net/bcl.js +449 -0
- package/dist/esm/generated/protobuf-net/bcl.js.map +1 -0
- package/dist/esm/generated/readmodels.d.ts +436 -0
- package/dist/esm/generated/readmodels.d.ts.map +1 -0
- package/dist/esm/generated/readmodels.js +3564 -0
- package/dist/esm/generated/readmodels.js.map +1 -0
- package/dist/esm/generated/recommendations.d.ts +109 -0
- package/dist/esm/generated/recommendations.d.ts.map +1 -0
- package/dist/esm/generated/recommendations.js +422 -0
- package/dist/esm/generated/recommendations.js.map +1 -0
- package/dist/esm/generated/security.d.ts +288 -0
- package/dist/esm/generated/security.d.ts.map +1 -0
- package/dist/esm/generated/security.js +1228 -0
- package/dist/esm/generated/security.js.map +1 -0
- package/dist/esm/generated/seeding.d.ts +109 -0
- package/dist/esm/generated/seeding.d.ts.map +1 -0
- package/dist/esm/generated/seeding.js +609 -0
- package/dist/esm/generated/seeding.js.map +1 -0
- package/dist/esm/index.d.ts +33 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +23 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/generated/clients.d.ts +82 -0
- package/dist/generated/clients.d.ts.map +1 -0
- package/dist/generated/clients.js +225 -0
- package/dist/generated/clients.js.map +1 -0
- package/dist/generated/cratis_chronicle_contracts.d.ts +135 -0
- package/dist/generated/cratis_chronicle_contracts.d.ts.map +1 -0
- package/dist/generated/cratis_chronicle_contracts.js +289 -0
- package/dist/generated/cratis_chronicle_contracts.js.map +1 -0
- package/dist/generated/events.d.ts +166 -0
- package/dist/generated/events.d.ts.map +1 -0
- package/dist/generated/events.js +883 -0
- package/dist/generated/events.js.map +1 -0
- package/dist/generated/events_constraints.d.ts +83 -0
- package/dist/generated/events_constraints.d.ts.map +1 -0
- package/dist/generated/events_constraints.js +499 -0
- package/dist/generated/events_constraints.js.map +1 -0
- package/dist/generated/eventsequences.d.ts +400 -0
- package/dist/generated/eventsequences.d.ts.map +1 -0
- package/dist/generated/eventsequences.js +3829 -0
- package/dist/generated/eventsequences.js.map +1 -0
- package/dist/generated/google/protobuf/empty.d.ts +19 -0
- package/dist/generated/google/protobuf/empty.d.ts.map +1 -0
- package/dist/generated/google/protobuf/empty.js +40 -0
- package/dist/generated/google/protobuf/empty.js.map +1 -0
- package/dist/generated/host.d.ts +61 -0
- package/dist/generated/host.d.ts.map +1 -0
- package/dist/generated/host.js +97 -0
- package/dist/generated/host.js.map +1 -0
- package/dist/generated/identities.d.ts +70 -0
- package/dist/generated/identities.d.ts.map +1 -0
- package/dist/generated/identities.js +247 -0
- package/dist/generated/identities.js.map +1 -0
- package/dist/generated/jobs.d.ts +258 -0
- package/dist/generated/jobs.d.ts.map +1 -0
- package/dist/generated/jobs.js +1682 -0
- package/dist/generated/jobs.js.map +1 -0
- package/dist/generated/observation.d.ts +278 -0
- package/dist/generated/observation.d.ts.map +1 -0
- package/dist/generated/observation.js +1546 -0
- package/dist/generated/observation.js.map +1 -0
- package/dist/generated/observation_eventstoresubscriptions.d.ts +99 -0
- package/dist/generated/observation_eventstoresubscriptions.d.ts.map +1 -0
- package/dist/generated/observation_eventstoresubscriptions.js +452 -0
- package/dist/generated/observation_eventstoresubscriptions.js.map +1 -0
- package/dist/generated/observation_reactors.d.ts +198 -0
- package/dist/generated/observation_reactors.d.ts.map +1 -0
- package/dist/generated/observation_reactors.js +1891 -0
- package/dist/generated/observation_reactors.js.map +1 -0
- package/dist/generated/observation_reducers.d.ts +183 -0
- package/dist/generated/observation_reducers.d.ts.map +1 -0
- package/dist/generated/observation_reducers.js +1880 -0
- package/dist/generated/observation_reducers.js.map +1 -0
- package/dist/generated/observation_webhooks.d.ts +203 -0
- package/dist/generated/observation_webhooks.d.ts.map +1 -0
- package/dist/generated/observation_webhooks.js +1321 -0
- package/dist/generated/observation_webhooks.js.map +1 -0
- package/dist/generated/projections.d.ts +421 -0
- package/dist/generated/projections.d.ts.map +1 -0
- package/dist/generated/projections.js +3928 -0
- package/dist/generated/projections.js.map +1 -0
- package/dist/generated/protobuf-net/bcl.d.ts +55 -0
- package/dist/generated/protobuf-net/bcl.d.ts.map +1 -0
- package/dist/generated/protobuf-net/bcl.js +447 -0
- package/dist/generated/protobuf-net/bcl.js.map +1 -0
- package/dist/generated/readmodels.d.ts +436 -0
- package/dist/generated/readmodels.d.ts.map +1 -0
- package/dist/generated/readmodels.js +3562 -0
- package/dist/generated/readmodels.js.map +1 -0
- package/dist/generated/recommendations.d.ts +109 -0
- package/dist/generated/recommendations.d.ts.map +1 -0
- package/dist/generated/recommendations.js +420 -0
- package/dist/generated/recommendations.js.map +1 -0
- package/dist/generated/security.d.ts +288 -0
- package/dist/generated/security.d.ts.map +1 -0
- package/dist/generated/security.js +1226 -0
- package/dist/generated/security.js.map +1 -0
- package/dist/generated/seeding.d.ts +109 -0
- package/dist/generated/seeding.d.ts.map +1 -0
- package/dist/generated/seeding.js +607 -0
- package/dist/generated/seeding.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/generated/clients.ts +356 -0
- package/generated/cratis_chronicle_contracts.ts +480 -0
- package/generated/events.ts +1191 -0
- package/generated/events_constraints.ts +668 -0
- package/generated/eventsequences.ts +4629 -0
- package/generated/google/protobuf/empty.ts +82 -0
- package/generated/host.ts +191 -0
- package/generated/identities.ts +368 -0
- package/generated/jobs.ts +2093 -0
- package/generated/observation.ts +1999 -0
- package/generated/observation_eventstoresubscriptions.ts +646 -0
- package/generated/observation_reactors.ts +2278 -0
- package/generated/observation_reducers.ts +2248 -0
- package/generated/observation_webhooks.ts +1717 -0
- package/generated/projections.ts +4817 -0
- package/generated/protobuf-net/bcl.ts +562 -0
- package/generated/readmodels.ts +4378 -0
- package/generated/recommendations.ts +602 -0
- package/generated/security.ts +1668 -0
- package/generated/seeding.ts +805 -0
- package/index.ts +46 -0
- package/package.json +49 -0
package/README.md
ADDED
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
# @cratis/chronicle.contracts
|
|
2
|
+
|
|
3
|
+
TypeScript gRPC contracts for Chronicle with full type safety and IDE support.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @cratis/chronicle.contracts
|
|
9
|
+
# or
|
|
10
|
+
yarn add @cratis/chronicle.contracts
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Usage
|
|
14
|
+
|
|
15
|
+
This package provides strongly-typed Chronicle gRPC service clients generated from proto definitions using ts-proto.
|
|
16
|
+
|
|
17
|
+
### Quick Start
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
import { ChronicleConnection, ChronicleConnectionString } from '@cratis/chronicle.contracts';
|
|
21
|
+
|
|
22
|
+
// Create a connection using a connection string
|
|
23
|
+
const connection = new ChronicleConnection({
|
|
24
|
+
connectionString: 'chronicle://localhost:35000'
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
// Connect to Chronicle
|
|
28
|
+
await connection.connect();
|
|
29
|
+
|
|
30
|
+
// Use the services with full type safety and IDE completion
|
|
31
|
+
const eventStores = await connection.eventStores.GetEventStores({});
|
|
32
|
+
console.log('Event stores:', eventStores.items);
|
|
33
|
+
|
|
34
|
+
// Clean up
|
|
35
|
+
connection.dispose();
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Connection Strings
|
|
39
|
+
|
|
40
|
+
Chronicle supports connection strings similar to database connection strings, providing a consistent way to configure connections:
|
|
41
|
+
|
|
42
|
+
```typescript
|
|
43
|
+
// Basic connection
|
|
44
|
+
const connection = new ChronicleConnection({
|
|
45
|
+
connectionString: 'chronicle://localhost:35000'
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
// With client credentials (username:password)
|
|
49
|
+
const connection = new ChronicleConnection({
|
|
50
|
+
connectionString: 'chronicle://myuser:mypassword@localhost:35000'
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
// With API key authentication
|
|
54
|
+
const connection = new ChronicleConnection({
|
|
55
|
+
connectionString: 'chronicle://localhost:35000?apiKey=your-api-key-here'
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
// With TLS disabled (for development)
|
|
59
|
+
const connection = new ChronicleConnection({
|
|
60
|
+
connectionString: 'chronicle://localhost:35000?disableTls=true'
|
|
61
|
+
});
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Development Connection
|
|
65
|
+
|
|
66
|
+
For local development, use the built-in development connection with default credentials:
|
|
67
|
+
|
|
68
|
+
```typescript
|
|
69
|
+
import { ChronicleConnectionString } from '@cratis/chronicle.contracts';
|
|
70
|
+
|
|
71
|
+
const connection = new ChronicleConnection({
|
|
72
|
+
connectionString: ChronicleConnectionString.Development
|
|
73
|
+
});
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
The development connection string uses:
|
|
77
|
+
- **Client ID**: `chronicle-dev-client`
|
|
78
|
+
- **Client Secret**: `chronicle-dev-secret`
|
|
79
|
+
- **Host**: `localhost:35000`
|
|
80
|
+
|
|
81
|
+
These are the default development credentials that Chronicle Kernel accepts when running in development mode.
|
|
82
|
+
|
|
83
|
+
### Working with Connection Strings
|
|
84
|
+
|
|
85
|
+
```typescript
|
|
86
|
+
import { ChronicleConnectionString } from '@cratis/chronicle.contracts';
|
|
87
|
+
|
|
88
|
+
// Parse a connection string
|
|
89
|
+
const connStr = new ChronicleConnectionString('chronicle://localhost:35000');
|
|
90
|
+
|
|
91
|
+
// Access connection details
|
|
92
|
+
console.log(connStr.serverAddress.host); // 'localhost'
|
|
93
|
+
console.log(connStr.serverAddress.port); // 35000
|
|
94
|
+
|
|
95
|
+
// Create new connection strings with modifications
|
|
96
|
+
const withCreds = connStr.withCredentials('myuser', 'mypassword');
|
|
97
|
+
const withApiKey = connStr.withApiKey('my-api-key');
|
|
98
|
+
|
|
99
|
+
// Convert to string
|
|
100
|
+
console.log(withCreds.toString()); // chronicle://myuser:mypassword@localhost:35000
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Authentication
|
|
104
|
+
|
|
105
|
+
Chronicle supports two authentication modes. When using Client Credentials, the TypeScript client automatically obtains a bearer token from the authentication authority using OAuth 2.0 client_credentials flow.
|
|
106
|
+
|
|
107
|
+
#### Client Credentials (OAuth2 client_credentials flow)
|
|
108
|
+
|
|
109
|
+
The client automatically obtains and refreshes bearer tokens from the Chronicle server (or a custom authority):
|
|
110
|
+
|
|
111
|
+
```typescript
|
|
112
|
+
const connection = new ChronicleConnection({
|
|
113
|
+
connectionString: 'chronicle://client-id:client-secret@localhost:35000'
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
// With custom authority
|
|
117
|
+
const connection = new ChronicleConnection({
|
|
118
|
+
connectionString: 'chronicle://client-id:client-secret@localhost:35000',
|
|
119
|
+
authority: 'https://my-auth-server.com',
|
|
120
|
+
managementPort: 8080 // Optional, defaults to 8080
|
|
121
|
+
});
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
The token is automatically included as a Bearer token in the authorization header for all gRPC calls.
|
|
125
|
+
|
|
126
|
+
#### API Key
|
|
127
|
+
|
|
128
|
+
```typescript
|
|
129
|
+
const connection = new ChronicleConnection({
|
|
130
|
+
connectionString: 'chronicle://localhost:35000?apiKey=your-api-key'
|
|
131
|
+
});
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Using Individual Services
|
|
135
|
+
|
|
136
|
+
You can also import and use services directly:
|
|
137
|
+
|
|
138
|
+
```typescript
|
|
139
|
+
import { EventStoresClient } from '@cratis/chronicle.contracts';
|
|
140
|
+
import * as grpc from '@grpc/grpc-js';
|
|
141
|
+
|
|
142
|
+
const client = new EventStoresClient(
|
|
143
|
+
'localhost:35000',
|
|
144
|
+
grpc.credentials.createInsecure()
|
|
145
|
+
);
|
|
146
|
+
|
|
147
|
+
const response = await client.GetEventStores({});
|
|
148
|
+
console.log('Event stores:', response.items);
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Configuration Options
|
|
152
|
+
|
|
153
|
+
```typescript
|
|
154
|
+
const connection = new ChronicleConnection({
|
|
155
|
+
connectionString: 'chronicle://localhost:35000',
|
|
156
|
+
|
|
157
|
+
// Optional: Override credentials from connection string
|
|
158
|
+
credentials: grpc.credentials.createSsl(),
|
|
159
|
+
|
|
160
|
+
// Optional: connection timeout in ms
|
|
161
|
+
connectTimeout: 10000,
|
|
162
|
+
|
|
163
|
+
// Optional: message size limits
|
|
164
|
+
maxReceiveMessageSize: 1024 * 1024 * 10, // 10MB
|
|
165
|
+
maxSendMessageSize: 1024 * 1024 * 10, // 10MB
|
|
166
|
+
|
|
167
|
+
// Optional: for request tracking
|
|
168
|
+
correlationId: 'my-correlation-id',
|
|
169
|
+
|
|
170
|
+
// Optional: Custom authentication authority URL
|
|
171
|
+
// If not set, uses Chronicle server as the authority
|
|
172
|
+
authority: 'https://my-auth-server.com',
|
|
173
|
+
|
|
174
|
+
// Optional: Management port for authentication endpoint (defaults to 8080)
|
|
175
|
+
managementPort: 8080
|
|
176
|
+
});
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Legacy Server Address
|
|
180
|
+
|
|
181
|
+
For backward compatibility, you can still use `serverAddress`:
|
|
182
|
+
|
|
183
|
+
```typescript
|
|
184
|
+
const connection = new ChronicleConnection({
|
|
185
|
+
serverAddress: 'localhost:35000'
|
|
186
|
+
});
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### Available Services
|
|
190
|
+
|
|
191
|
+
The `ChronicleConnection` provides access to all Chronicle services:
|
|
192
|
+
|
|
193
|
+
- `eventStores` - Event store management
|
|
194
|
+
- `namespaces` - Namespace management
|
|
195
|
+
- `recommendations` - Recommendations
|
|
196
|
+
- `identities` - Identity management
|
|
197
|
+
- `eventSequences` - Event sequence operations
|
|
198
|
+
- `eventTypes` - Event type management
|
|
199
|
+
- `constraints` - Event constraints
|
|
200
|
+
- `observers` - Observer management
|
|
201
|
+
- `failedPartitions` - Failed partition handling
|
|
202
|
+
- `reactors` - Reactor management
|
|
203
|
+
- `reducers` - Reducer management
|
|
204
|
+
- `projections` - Projection management
|
|
205
|
+
- `readModels` - Read model operations
|
|
206
|
+
- `jobs` - Job management
|
|
207
|
+
- `eventSeeding` - Event seeding
|
|
208
|
+
- `server` - Server information
|
|
209
|
+
|
|
210
|
+
### Type Safety
|
|
211
|
+
|
|
212
|
+
All services are fully typed with TypeScript interfaces generated from proto definitions, providing:
|
|
213
|
+
|
|
214
|
+
- **IntelliSense** in your IDE
|
|
215
|
+
- **Compile-time type checking**
|
|
216
|
+
- **Auto-completion** for all methods and parameters
|
|
217
|
+
- **Type inference** for request and response objects
|
|
218
|
+
|
|
219
|
+
## License
|
|
220
|
+
|
|
221
|
+
MIT
|
package/TokenProvider.ts
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
import * as https from 'https';
|
|
5
|
+
import * as http from 'http';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Interface for providing authentication tokens
|
|
9
|
+
*/
|
|
10
|
+
export interface ITokenProvider {
|
|
11
|
+
/**
|
|
12
|
+
* Gets the current access token
|
|
13
|
+
* @returns Promise resolving to the access token or undefined if not available
|
|
14
|
+
*/
|
|
15
|
+
getAccessToken(): Promise<string | undefined>;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Refreshes the access token by clearing cached tokens and obtaining a new one
|
|
19
|
+
* @returns Promise resolving to the new access token or undefined if not available
|
|
20
|
+
*/
|
|
21
|
+
refresh(): Promise<string | undefined>;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* No-op token provider for when authentication is not required
|
|
26
|
+
*/
|
|
27
|
+
export class NoOpTokenProvider implements ITokenProvider {
|
|
28
|
+
async getAccessToken(): Promise<string | undefined> {
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
async refresh(): Promise<string | undefined> {
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* OAuth token response from the token endpoint
|
|
39
|
+
*/
|
|
40
|
+
interface OAuthTokenResponse {
|
|
41
|
+
access_token: string;
|
|
42
|
+
expires_in: number;
|
|
43
|
+
token_type: string;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* OAuth token provider using client credentials flow
|
|
48
|
+
*/
|
|
49
|
+
export class OAuthTokenProvider implements ITokenProvider {
|
|
50
|
+
private accessToken?: string;
|
|
51
|
+
private tokenExpiry: Date = new Date(0);
|
|
52
|
+
private refreshPromise?: Promise<string | undefined>;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Creates a new OAuth token provider
|
|
56
|
+
* @param tokenEndpoint The token endpoint URL
|
|
57
|
+
* @param clientId The OAuth client ID
|
|
58
|
+
* @param clientSecret The OAuth client secret
|
|
59
|
+
*/
|
|
60
|
+
constructor(
|
|
61
|
+
private readonly tokenEndpoint: string,
|
|
62
|
+
private readonly clientId: string,
|
|
63
|
+
private readonly clientSecret: string
|
|
64
|
+
) {}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Gets the current access token, fetching a new one if needed
|
|
68
|
+
*/
|
|
69
|
+
async getAccessToken(): Promise<string | undefined> {
|
|
70
|
+
if (this.accessToken && new Date() < this.tokenExpiry) {
|
|
71
|
+
return this.accessToken;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// If we're already refreshing, wait for that promise
|
|
75
|
+
if (this.refreshPromise) {
|
|
76
|
+
return this.refreshPromise;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
this.refreshPromise = this.fetchAccessToken();
|
|
80
|
+
try {
|
|
81
|
+
return await this.refreshPromise;
|
|
82
|
+
} finally {
|
|
83
|
+
this.refreshPromise = undefined;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Refreshes the access token by clearing the cache and fetching a new one
|
|
89
|
+
*/
|
|
90
|
+
async refresh(): Promise<string | undefined> {
|
|
91
|
+
this.accessToken = undefined;
|
|
92
|
+
this.tokenExpiry = new Date(0);
|
|
93
|
+
return this.getAccessToken();
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Fetches a new access token from the token endpoint
|
|
98
|
+
*/
|
|
99
|
+
private async fetchAccessToken(): Promise<string | undefined> {
|
|
100
|
+
const params = new URLSearchParams();
|
|
101
|
+
params.append('grant_type', 'client_credentials');
|
|
102
|
+
params.append('client_id', this.clientId);
|
|
103
|
+
params.append('client_secret', this.clientSecret);
|
|
104
|
+
|
|
105
|
+
const body = params.toString();
|
|
106
|
+
|
|
107
|
+
return new Promise((resolve, reject) => {
|
|
108
|
+
const url = new URL(this.tokenEndpoint);
|
|
109
|
+
const isHttps = url.protocol === 'https:';
|
|
110
|
+
const httpModule = isHttps ? https : http;
|
|
111
|
+
|
|
112
|
+
const options = {
|
|
113
|
+
method: 'POST',
|
|
114
|
+
headers: {
|
|
115
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
116
|
+
'Content-Length': Buffer.byteLength(body),
|
|
117
|
+
},
|
|
118
|
+
// Accept self-signed certificates in development
|
|
119
|
+
rejectUnauthorized: false,
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
const req = httpModule.request(url, options, (res) => {
|
|
123
|
+
let data = '';
|
|
124
|
+
|
|
125
|
+
res.on('data', (chunk) => {
|
|
126
|
+
data += chunk;
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
res.on('end', () => {
|
|
130
|
+
if (res.statusCode === 200) {
|
|
131
|
+
try {
|
|
132
|
+
const tokenResponse: OAuthTokenResponse = JSON.parse(data);
|
|
133
|
+
this.accessToken = tokenResponse.access_token;
|
|
134
|
+
|
|
135
|
+
// Set expiry with 60 second buffer
|
|
136
|
+
const expiresInSeconds = tokenResponse.expires_in || 3600;
|
|
137
|
+
this.tokenExpiry = new Date(
|
|
138
|
+
Date.now() + (expiresInSeconds - 60) * 1000
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
resolve(this.accessToken);
|
|
142
|
+
} catch (error) {
|
|
143
|
+
reject(
|
|
144
|
+
new Error(
|
|
145
|
+
`Failed to parse token response: ${error instanceof Error ? error.message : String(error)}`
|
|
146
|
+
)
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
} else {
|
|
150
|
+
reject(
|
|
151
|
+
new Error(
|
|
152
|
+
`Token request failed with status ${res.statusCode}: ${data}`
|
|
153
|
+
)
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
req.on('error', (error) => {
|
|
160
|
+
reject(new Error(`Token request failed: ${error.message}`));
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
req.write(body);
|
|
164
|
+
req.end();
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import * as grpc from '@grpc/grpc-js';
|
|
2
|
+
import { EventStoresClient } from './generated/cratis_chronicle_contracts';
|
|
3
|
+
import { NamespacesClient } from './generated/cratis_chronicle_contracts';
|
|
4
|
+
import { RecommendationsClient } from './generated/recommendations';
|
|
5
|
+
import { IdentitiesClient } from './generated/identities';
|
|
6
|
+
import { EventSequencesClient } from './generated/eventsequences';
|
|
7
|
+
import { EventTypesClient } from './generated/events';
|
|
8
|
+
import { ConstraintsClient } from './generated/events_constraints';
|
|
9
|
+
import { ObserversClient } from './generated/observation';
|
|
10
|
+
import { FailedPartitionsClient } from './generated/observation';
|
|
11
|
+
import { ReactorsClient } from './generated/observation_reactors';
|
|
12
|
+
import { ReducersClient } from './generated/observation_reducers';
|
|
13
|
+
import { ProjectionsClient } from './generated/projections';
|
|
14
|
+
import { ReadModelsClient } from './generated/readmodels';
|
|
15
|
+
import { JobsClient } from './generated/jobs';
|
|
16
|
+
import { EventSeedingClient } from './generated/seeding';
|
|
17
|
+
import { ServerClient } from './generated/host';
|
|
18
|
+
import type { ChronicleServices } from './ChronicleServices';
|
|
19
|
+
import { ChronicleConnectionString } from './ChronicleConnectionString';
|
|
20
|
+
export interface ChronicleConnectionOptions {
|
|
21
|
+
connectionString?: string | ChronicleConnectionString;
|
|
22
|
+
serverAddress?: string;
|
|
23
|
+
credentials?: grpc.ChannelCredentials;
|
|
24
|
+
connectTimeout?: number;
|
|
25
|
+
maxReceiveMessageSize?: number;
|
|
26
|
+
maxSendMessageSize?: number;
|
|
27
|
+
correlationId?: string;
|
|
28
|
+
authority?: string;
|
|
29
|
+
managementPort?: number;
|
|
30
|
+
}
|
|
31
|
+
export declare class ChronicleConnection implements ChronicleServices {
|
|
32
|
+
private readonly channel;
|
|
33
|
+
private readonly services;
|
|
34
|
+
private readonly _connectionString;
|
|
35
|
+
private readonly tokenProvider;
|
|
36
|
+
private _isConnected;
|
|
37
|
+
get eventStores(): EventStoresClient;
|
|
38
|
+
get namespaces(): NamespacesClient;
|
|
39
|
+
get recommendations(): RecommendationsClient;
|
|
40
|
+
get identities(): IdentitiesClient;
|
|
41
|
+
get eventSequences(): EventSequencesClient;
|
|
42
|
+
get eventTypes(): EventTypesClient;
|
|
43
|
+
get constraints(): ConstraintsClient;
|
|
44
|
+
get observers(): ObserversClient;
|
|
45
|
+
get failedPartitions(): FailedPartitionsClient;
|
|
46
|
+
get reactors(): ReactorsClient;
|
|
47
|
+
get reducers(): ReducersClient;
|
|
48
|
+
get projections(): ProjectionsClient;
|
|
49
|
+
get readModels(): ReadModelsClient;
|
|
50
|
+
get jobs(): JobsClient;
|
|
51
|
+
get eventSeeding(): EventSeedingClient;
|
|
52
|
+
get server(): ServerClient;
|
|
53
|
+
private connectionService;
|
|
54
|
+
get connectionString(): ChronicleConnectionString;
|
|
55
|
+
constructor(options: ChronicleConnectionOptions);
|
|
56
|
+
private createTokenProvider;
|
|
57
|
+
private createAuthCallCredentials;
|
|
58
|
+
get isConnected(): boolean;
|
|
59
|
+
connect(): Promise<void>;
|
|
60
|
+
disconnect(): void;
|
|
61
|
+
dispose(): void;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=ChronicleConnection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChronicleConnection.d.ts","sourceRoot":"","sources":["../ChronicleConnection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import * as grpc from '@grpc/grpc-js';
|
|
2
|
+
import { EventStoresClient } from './generated/cratis_chronicle_contracts';
|
|
3
|
+
import { NamespacesClient } from './generated/cratis_chronicle_contracts';
|
|
4
|
+
import { RecommendationsClient } from './generated/recommendations';
|
|
5
|
+
import { IdentitiesClient } from './generated/identities';
|
|
6
|
+
import { EventSequencesClient } from './generated/eventsequences';
|
|
7
|
+
import { EventTypesClient } from './generated/events';
|
|
8
|
+
import { ConstraintsClient } from './generated/events_constraints';
|
|
9
|
+
import { ObserversClient } from './generated/observation';
|
|
10
|
+
import { FailedPartitionsClient } from './generated/observation';
|
|
11
|
+
import { ReactorsClient } from './generated/observation_reactors';
|
|
12
|
+
import { ReducersClient } from './generated/observation_reducers';
|
|
13
|
+
import { ProjectionsClient } from './generated/projections';
|
|
14
|
+
import { ReadModelsClient } from './generated/readmodels';
|
|
15
|
+
import { JobsClient } from './generated/jobs';
|
|
16
|
+
import { EventSeedingClient } from './generated/seeding';
|
|
17
|
+
import { ServerClient } from './generated/host';
|
|
18
|
+
import { ConnectionServiceClient } from './generated/clients';
|
|
19
|
+
import { ChronicleConnectionString, AuthenticationMode } from './ChronicleConnectionString';
|
|
20
|
+
import { OAuthTokenProvider, NoOpTokenProvider } from './TokenProvider';
|
|
21
|
+
export class ChronicleConnection {
|
|
22
|
+
channel;
|
|
23
|
+
services;
|
|
24
|
+
_connectionString;
|
|
25
|
+
tokenProvider;
|
|
26
|
+
_isConnected = false;
|
|
27
|
+
get eventStores() {
|
|
28
|
+
return this.services.eventStores;
|
|
29
|
+
}
|
|
30
|
+
get namespaces() {
|
|
31
|
+
return this.services.namespaces;
|
|
32
|
+
}
|
|
33
|
+
get recommendations() {
|
|
34
|
+
return this.services.recommendations;
|
|
35
|
+
}
|
|
36
|
+
get identities() {
|
|
37
|
+
return this.services.identities;
|
|
38
|
+
}
|
|
39
|
+
get eventSequences() {
|
|
40
|
+
return this.services.eventSequences;
|
|
41
|
+
}
|
|
42
|
+
get eventTypes() {
|
|
43
|
+
return this.services.eventTypes;
|
|
44
|
+
}
|
|
45
|
+
get constraints() {
|
|
46
|
+
return this.services.constraints;
|
|
47
|
+
}
|
|
48
|
+
get observers() {
|
|
49
|
+
return this.services.observers;
|
|
50
|
+
}
|
|
51
|
+
get failedPartitions() {
|
|
52
|
+
return this.services.failedPartitions;
|
|
53
|
+
}
|
|
54
|
+
get reactors() {
|
|
55
|
+
return this.services.reactors;
|
|
56
|
+
}
|
|
57
|
+
get reducers() {
|
|
58
|
+
return this.services.reducers;
|
|
59
|
+
}
|
|
60
|
+
get projections() {
|
|
61
|
+
return this.services.projections;
|
|
62
|
+
}
|
|
63
|
+
get readModels() {
|
|
64
|
+
return this.services.readModels;
|
|
65
|
+
}
|
|
66
|
+
get jobs() {
|
|
67
|
+
return this.services.jobs;
|
|
68
|
+
}
|
|
69
|
+
get eventSeeding() {
|
|
70
|
+
return this.services.eventSeeding;
|
|
71
|
+
}
|
|
72
|
+
get server() {
|
|
73
|
+
return this.services.server;
|
|
74
|
+
}
|
|
75
|
+
connectionService;
|
|
76
|
+
get connectionString() {
|
|
77
|
+
return this._connectionString;
|
|
78
|
+
}
|
|
79
|
+
constructor(options) {
|
|
80
|
+
if (options.connectionString) {
|
|
81
|
+
this._connectionString =
|
|
82
|
+
typeof options.connectionString === 'string'
|
|
83
|
+
? new ChronicleConnectionString(options.connectionString)
|
|
84
|
+
: options.connectionString;
|
|
85
|
+
}
|
|
86
|
+
else if (options.serverAddress) {
|
|
87
|
+
this._connectionString = new ChronicleConnectionString(`chronicle://${options.serverAddress}`);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
this._connectionString = ChronicleConnectionString.Default;
|
|
91
|
+
}
|
|
92
|
+
const serverAddress = `${this._connectionString.serverAddress.host}:${this._connectionString.serverAddress.port}`;
|
|
93
|
+
this.tokenProvider = this.createTokenProvider(options);
|
|
94
|
+
let channelCredentials = options.credentials;
|
|
95
|
+
if (!channelCredentials) {
|
|
96
|
+
channelCredentials = this._connectionString.createCredentials();
|
|
97
|
+
const callCredentials = this.createAuthCallCredentials();
|
|
98
|
+
if (callCredentials) {
|
|
99
|
+
channelCredentials = grpc.credentials.combineChannelCredentials(channelCredentials, callCredentials);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
const channelOptions = {};
|
|
103
|
+
if (options.maxReceiveMessageSize) {
|
|
104
|
+
channelOptions['grpc.max_receive_message_length'] = options.maxReceiveMessageSize;
|
|
105
|
+
}
|
|
106
|
+
if (options.maxSendMessageSize) {
|
|
107
|
+
channelOptions['grpc.max_send_message_length'] = options.maxSendMessageSize;
|
|
108
|
+
}
|
|
109
|
+
this.channel = new grpc.Channel(serverAddress, channelCredentials, channelOptions);
|
|
110
|
+
this.connectionService = new ConnectionServiceClient(serverAddress, channelCredentials);
|
|
111
|
+
this.services = {
|
|
112
|
+
eventStores: new EventStoresClient(serverAddress, channelCredentials),
|
|
113
|
+
namespaces: new NamespacesClient(serverAddress, channelCredentials),
|
|
114
|
+
recommendations: new RecommendationsClient(serverAddress, channelCredentials),
|
|
115
|
+
identities: new IdentitiesClient(serverAddress, channelCredentials),
|
|
116
|
+
eventSequences: new EventSequencesClient(serverAddress, channelCredentials),
|
|
117
|
+
eventTypes: new EventTypesClient(serverAddress, channelCredentials),
|
|
118
|
+
constraints: new ConstraintsClient(serverAddress, channelCredentials),
|
|
119
|
+
observers: new ObserversClient(serverAddress, channelCredentials),
|
|
120
|
+
failedPartitions: new FailedPartitionsClient(serverAddress, channelCredentials),
|
|
121
|
+
reactors: new ReactorsClient(serverAddress, channelCredentials),
|
|
122
|
+
reducers: new ReducersClient(serverAddress, channelCredentials),
|
|
123
|
+
projections: new ProjectionsClient(serverAddress, channelCredentials),
|
|
124
|
+
readModels: new ReadModelsClient(serverAddress, channelCredentials),
|
|
125
|
+
jobs: new JobsClient(serverAddress, channelCredentials),
|
|
126
|
+
eventSeeding: new EventSeedingClient(serverAddress, channelCredentials),
|
|
127
|
+
server: new ServerClient(serverAddress, channelCredentials),
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
createTokenProvider(options) {
|
|
131
|
+
try {
|
|
132
|
+
const authMode = this._connectionString.authenticationMode;
|
|
133
|
+
if (authMode === AuthenticationMode.ClientCredentials) {
|
|
134
|
+
const username = this._connectionString.username;
|
|
135
|
+
const password = this._connectionString.password;
|
|
136
|
+
if (!username || !password) {
|
|
137
|
+
return new NoOpTokenProvider();
|
|
138
|
+
}
|
|
139
|
+
const managementPort = options.managementPort || 8080;
|
|
140
|
+
let authorityHost;
|
|
141
|
+
let authorityPort;
|
|
142
|
+
if (options.authority) {
|
|
143
|
+
const authorityUrl = new URL(options.authority);
|
|
144
|
+
authorityHost = authorityUrl.hostname;
|
|
145
|
+
authorityPort = authorityUrl.port ? parseInt(authorityUrl.port, 10) : managementPort;
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
authorityHost = this._connectionString.serverAddress.host;
|
|
149
|
+
authorityPort = managementPort;
|
|
150
|
+
}
|
|
151
|
+
const scheme = this._connectionString.disableTls ? 'http' : 'https';
|
|
152
|
+
const tokenEndpoint = `${scheme}://${authorityHost}:${authorityPort}/connect/token`;
|
|
153
|
+
return new OAuthTokenProvider(tokenEndpoint, username, password);
|
|
154
|
+
}
|
|
155
|
+
return new NoOpTokenProvider();
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
return new NoOpTokenProvider();
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
createAuthCallCredentials() {
|
|
162
|
+
return grpc.credentials.createFromMetadataGenerator(async (params, callback) => {
|
|
163
|
+
try {
|
|
164
|
+
const token = await this.tokenProvider.getAccessToken();
|
|
165
|
+
const metadata = new grpc.Metadata();
|
|
166
|
+
if (token) {
|
|
167
|
+
metadata.add('authorization', `Bearer ${token}`);
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
try {
|
|
171
|
+
const authMode = this._connectionString.authenticationMode;
|
|
172
|
+
if (authMode === AuthenticationMode.ApiKey && this._connectionString.apiKey) {
|
|
173
|
+
metadata.add('api-key', this._connectionString.apiKey);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
callback(null, metadata);
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
callback(error, new grpc.Metadata());
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
get isConnected() {
|
|
187
|
+
return this._isConnected;
|
|
188
|
+
}
|
|
189
|
+
async connect() {
|
|
190
|
+
if (this._isConnected) {
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
return new Promise((resolve, reject) => {
|
|
194
|
+
const deadline = new Date();
|
|
195
|
+
deadline.setSeconds(deadline.getSeconds() + 10);
|
|
196
|
+
this.channel.watchConnectivityState(this.channel.getConnectivityState(true), deadline, (error) => {
|
|
197
|
+
if (error) {
|
|
198
|
+
this._isConnected = false;
|
|
199
|
+
reject(error);
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
const state = this.channel.getConnectivityState(false);
|
|
203
|
+
if (state === grpc.connectivityState.READY) {
|
|
204
|
+
this._isConnected = true;
|
|
205
|
+
resolve();
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
this._isConnected = false;
|
|
209
|
+
reject(new Error(`Connection failed with state: ${state}`));
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
disconnect() {
|
|
216
|
+
this._isConnected = false;
|
|
217
|
+
this.channel.close();
|
|
218
|
+
}
|
|
219
|
+
dispose() {
|
|
220
|
+
this.disconnect();
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=ChronicleConnection.js.map
|