@verana-labs/vs-agent-sdk 1.11.0-dev.12 → 1.11.0-dev.14

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 (31) hide show
  1. package/README.md +172 -0
  2. package/build/agent/VsAgent.d.ts +1 -1
  3. package/build/agent/createVsAgent.d.ts +1 -1
  4. package/build/blockchain/IndexerWebSocketService.d.ts +33 -0
  5. package/build/blockchain/IndexerWebSocketService.js +181 -0
  6. package/build/blockchain/IndexerWebSocketService.js.map +1 -0
  7. package/build/blockchain/VeranaHelpers.d.ts +4 -0
  8. package/build/blockchain/VeranaHelpers.js +29 -0
  9. package/build/blockchain/VeranaHelpers.js.map +1 -0
  10. package/build/blockchain/VeranaIndexerService.d.ts +8 -0
  11. package/build/blockchain/VeranaIndexerService.js +28 -0
  12. package/build/blockchain/VeranaIndexerService.js.map +1 -0
  13. package/build/blockchain/handlers/IndexerHandlerRegistry.d.ts +25 -0
  14. package/build/blockchain/handlers/IndexerHandlerRegistry.js +34 -0
  15. package/build/blockchain/handlers/IndexerHandlerRegistry.js.map +1 -0
  16. package/build/blockchain/handlers/defaultHandlers.d.ts +6 -0
  17. package/build/blockchain/handlers/defaultHandlers.js +125 -0
  18. package/build/blockchain/handlers/defaultHandlers.js.map +1 -0
  19. package/build/blockchain/handlers/index.d.ts +3 -0
  20. package/build/blockchain/handlers/index.js +20 -0
  21. package/build/blockchain/handlers/index.js.map +1 -0
  22. package/build/blockchain/handlers/stateMutations.d.ts +12 -0
  23. package/build/blockchain/handlers/stateMutations.js +74 -0
  24. package/build/blockchain/handlers/stateMutations.js.map +1 -0
  25. package/build/blockchain/index.d.ts +4 -0
  26. package/build/blockchain/index.js +4 -0
  27. package/build/blockchain/index.js.map +1 -1
  28. package/build/blockchain/types.d.ts +60 -1
  29. package/build/blockchain/types.js +2 -1
  30. package/build/blockchain/types.js.map +1 -1
  31. package/package.json +2 -2
package/README.md ADDED
@@ -0,0 +1,172 @@
1
+ # @verana-labs/vs-agent-sdk
2
+
3
+ Framework-agnostic Verifiable Service Agent SDK with DIDComm, AnonCreds, and blockchain integration.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install @verana-labs/vs-agent-sdk @credo-ts/core @credo-ts/node
9
+ ```
10
+
11
+ ## Basic Usage
12
+
13
+ ```typescript
14
+ import { createVsAgent, setupBaseDidComm } from '@verana-labs/vs-agent-sdk'
15
+ import { getNodeHttpServer } from '@credo-ts/node'
16
+
17
+ const agent = createVsAgent({
18
+ plugins: [
19
+ setupBaseDidComm({
20
+ walletConfig: { dbPath: './wallet' },
21
+ publicApiBaseUrl: 'https://api.example.com',
22
+ endpoints: ['https://agent.example.com/didcomm'],
23
+ }),
24
+ ],
25
+ label: 'My Agent',
26
+ publicApiBaseUrl: 'https://api.example.com',
27
+ dependencies: getNodeHttpServer(),
28
+ })
29
+
30
+ await agent.initialize()
31
+ ```
32
+
33
+ ## Indexer WebSocket
34
+
35
+ Stream blockchain events in real-time:
36
+
37
+ ```typescript
38
+ import { IndexerWebSocketService } from '@verana-labs/vs-agent-sdk'
39
+
40
+ const indexerWs = new IndexerWebSocketService({
41
+ indexerUrl: 'https://indexer.verana.io',
42
+ agent,
43
+ })
44
+
45
+ await indexerWs.start()
46
+ // Auto-reconnects with exponential backoff (max 5min)
47
+ // Persists last block height in agent storage
48
+ ```
49
+
50
+ ### Custom Handlers
51
+
52
+ Build default handlers or replace with your own:
53
+
54
+ ```typescript
55
+ import { buildDefaultIndexerHandlerRegistry } from '@verana-labs/vs-agent-sdk'
56
+
57
+ const handlerRegistry = buildDefaultIndexerHandlerRegistry()
58
+
59
+ const indexerWs = new IndexerWebSocketService({
60
+ indexerUrl: 'https://indexer.example.com',
61
+ agent,
62
+ handlerRegistry,
63
+ })
64
+ ```
65
+
66
+ **Override a specific handler:**
67
+
68
+ ```typescript
69
+ import { buildDefaultIndexerHandlerRegistry } from '@verana-labs/vs-agent-sdk'
70
+ import type { IndexerActivity, IndexerDispatchContext } from '@verana-labs/vs-agent-sdk'
71
+
72
+ const registry = buildDefaultIndexerHandlerRegistry()
73
+
74
+ // Replace credential schema handler with custom logic
75
+ registry.register('CredentialSchema', async (activity: IndexerActivity, context: IndexerDispatchContext) => {
76
+ const { id, jsonSchema } = activity.changes as any
77
+ console.log(`Schema ${id} updated at block ${context.blockHeight}`)
78
+
79
+ // Sync to your database
80
+ await db.schemas.update(id, { schema: jsonSchema })
81
+ })
82
+
83
+ const indexerWs = new IndexerWebSocketService({
84
+ indexerUrl: 'https://indexer.example.com',
85
+ agent,
86
+ handlerRegistry: registry,
87
+ })
88
+ ```
89
+
90
+ **Custom handlers from scratch:**
91
+
92
+ ```typescript
93
+ import { IndexerHandlerRegistry } from '@verana-labs/vs-agent-sdk'
94
+ import type { IndexerActivity, IndexerDispatchContext } from '@verana-labs/vs-agent-sdk'
95
+
96
+ const registry = new IndexerHandlerRegistry()
97
+
98
+ // Handle trust registry changes
99
+ registry.register('TrustRegistry', async (activity, context) => {
100
+ const { id, did, archived } = activity.changes as any
101
+ await agent.config.logger.info(`[Block ${context.blockHeight}] TR ${id} ${archived ? 'archived' : 'activated'}`)
102
+ })
103
+
104
+ // Handle permission changes with custom messages
105
+ registry.register('Permission', async (activity, context) => {
106
+ const { id, did, revoked } = activity.changes as any
107
+ const status = revoked ? 'revoked' : 'granted'
108
+
109
+ await agent.config.logger.info(`[Block ${context.blockHeight}] Permission ${status}: ${id}`)
110
+
111
+ // Emit to your service
112
+ await sendWebhookEvent('https://your-service.com/perms', {
113
+ type: 'permission_status_changed',
114
+ permissionId: id,
115
+ did,
116
+ status,
117
+ blockHeight: context.blockHeight,
118
+ timestamp: new Date().toISOString(),
119
+ })
120
+ })
121
+
122
+ const indexerWs = new IndexerWebSocketService({
123
+ indexerUrl: 'https://indexer.example.com',
124
+ agent,
125
+ handlerRegistry: registry,
126
+ })
127
+ ```
128
+
129
+ ## Blockchain Integration
130
+
131
+ ```typescript
132
+ import { VeranaChainService } from '@verana-labs/vs-agent-sdk'
133
+
134
+ const chain = new VeranaChainService({
135
+ rpcUrl: 'https://rpc.verana.io',
136
+ chainId: 'verana-mainnet-1',
137
+ mnemonic: 'your wallet seed phrase...',
138
+ logger: agent.config.logger,
139
+ })
140
+
141
+ const agent = createVsAgent({
142
+ plugins: [...],
143
+ veranaChain: chain,
144
+ label: 'My Agent',
145
+ publicApiBaseUrl: 'https://api.example.com',
146
+ dependencies: getNodeHttpServer(),
147
+ })
148
+ ```
149
+
150
+ ## Utilities
151
+
152
+ ```typescript
153
+ // DIDs
154
+ import { createInvitation, getWebDid } from '@verana-labs/vs-agent-sdk'
155
+
156
+ const did = await getWebDid(agent)
157
+ const invitation = await createInvitation(agent)
158
+
159
+ // Webhooks
160
+ import { sendWebhookEvent } from '@verana-labs/vs-agent-sdk'
161
+
162
+ await sendWebhookEvent('https://example.com/webhook', {
163
+ type: 'event_type',
164
+ data: { /* ... */ },
165
+ })
166
+
167
+ // Transports
168
+ import {
169
+ HttpInboundTransport,
170
+ VsAgentWsInboundTransport,
171
+ } from '@verana-labs/vs-agent-sdk'
172
+ ```
@@ -2,7 +2,7 @@ import { AnonCredsDidCommCredentialFormatService, AnonCredsModule, AnonCredsDidC
2
2
  import { AskarModule, AskarModuleConfigStoreOptions } from '@credo-ts/askar';
3
3
  import { Agent, AgentDependencies, DidsModule, InitConfig, W3cCredentialsModule } from '@credo-ts/core';
4
4
  import { DidCommCredentialsModuleConfigOptions, DidCommCredentialV2Protocol, DidCommJsonLdCredentialFormatService, DidCommModule, DidCommModuleConfigOptions, DidCommProofsModuleConfigOptions, DidCommProofV2Protocol } from '@credo-ts/didcomm';
5
- import { VeranaChainService } from '../blockchain';
5
+ import { VeranaChainService } from '../blockchain/VeranaChainService';
6
6
  type VsAgentDidCommModule = DidCommModule<DidCommModuleConfigOptions & {
7
7
  credentials: DidCommCredentialsModuleConfigOptions<[
8
8
  DidCommCredentialV2Protocol<[
@@ -1,6 +1,6 @@
1
1
  import { AskarModuleConfigStoreOptions } from '@credo-ts/askar';
2
2
  import { AgentDependencies, InitConfig, LogLevel } from '@credo-ts/core';
3
- import { VeranaChainService } from '../blockchain';
3
+ import { VeranaChainService } from '../blockchain/VeranaChainService';
4
4
  import { Plugin } from '../types';
5
5
  import { BaseAgentModules, VsAgent } from './VsAgent';
6
6
  type MergePluginModules<T extends Plugin[]> = T extends [infer First, ...infer Rest] ? First extends {
@@ -0,0 +1,33 @@
1
+ import { VsAgent } from '../agent/VsAgent';
2
+ import { IndexerHandlerRegistry } from './handlers/IndexerHandlerRegistry';
3
+ export interface IndexerWebSocketServiceOptions {
4
+ indexerUrl: string;
5
+ agent: VsAgent;
6
+ handlerRegistry?: IndexerHandlerRegistry;
7
+ }
8
+ export declare class IndexerWebSocketService {
9
+ private readonly options;
10
+ private ws;
11
+ private reconnectAttempt;
12
+ private stopped;
13
+ private syncing;
14
+ private pendingEvents;
15
+ private readonly indexer;
16
+ private readonly handlerRegistry;
17
+ constructor(options: IndexerWebSocketServiceOptions);
18
+ start(): Promise<void>;
19
+ stop(): void;
20
+ private get logger();
21
+ /**
22
+ * Connects to the indexer WebSocket, performs an initial sync via REST (use /events endpoint because it returns historical events in a single request)
23
+ * Finally, processes pending events received during the initial sync.
24
+ */
25
+ private connect;
26
+ private openWebSocket;
27
+ private syncRest;
28
+ private drainPendingEvents;
29
+ private processBlock;
30
+ private applyChanges;
31
+ private scheduleReconnect;
32
+ private fetchInitialEvents;
33
+ }
@@ -0,0 +1,181 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.IndexerWebSocketService = void 0;
7
+ const ws_1 = __importDefault(require("ws"));
8
+ const VeranaHelpers_1 = require("./VeranaHelpers");
9
+ const VeranaIndexerService_1 = require("./VeranaIndexerService");
10
+ const handlers_1 = require("./handlers");
11
+ const MAX_RECONNECT_DELAY_MS = 300000;
12
+ const WS_PATHNAME = 'verana/indexer/v1/events';
13
+ class IndexerWebSocketService {
14
+ constructor(options) {
15
+ var _a;
16
+ this.options = options;
17
+ this.ws = null;
18
+ this.reconnectAttempt = 0;
19
+ this.stopped = false;
20
+ this.syncing = false;
21
+ this.pendingEvents = [];
22
+ this.indexer = new VeranaIndexerService_1.VeranaIndexerService({
23
+ baseUrl: options.indexerUrl,
24
+ logger: options.agent.config.logger,
25
+ });
26
+ this.handlerRegistry = (_a = options.handlerRegistry) !== null && _a !== void 0 ? _a : (0, handlers_1.buildDefaultIndexerHandlerRegistry)();
27
+ }
28
+ async start() {
29
+ this.stopped = false;
30
+ await this.connect();
31
+ }
32
+ stop() {
33
+ var _a;
34
+ this.stopped = true;
35
+ (_a = this.ws) === null || _a === void 0 ? void 0 : _a.close();
36
+ this.ws = null;
37
+ }
38
+ get logger() {
39
+ return this.options.agent.config.logger;
40
+ }
41
+ /**
42
+ * Connects to the indexer WebSocket, performs an initial sync via REST (use /events endpoint because it returns historical events in a single request)
43
+ * Finally, processes pending events received during the initial sync.
44
+ */
45
+ async connect() {
46
+ this.syncing = true;
47
+ this.pendingEvents = [];
48
+ this.openWebSocket();
49
+ await this.syncRest();
50
+ this.syncing = false;
51
+ await this.drainPendingEvents();
52
+ }
53
+ openWebSocket() {
54
+ const url = new URL(this.options.indexerUrl);
55
+ const wsProto = url.protocol === 'https:' ? 'wss:' : 'ws:';
56
+ if (!this.options.agent.did)
57
+ throw new Error('Agent does not have any defined public DID');
58
+ const wsUrl = `${wsProto}//${url.host}/${WS_PATHNAME}?did=${encodeURIComponent(this.options.agent.did)}`;
59
+ this.logger.info(`[IndexerWS] Connecting to ${wsUrl}`);
60
+ const ws = new ws_1.default(wsUrl);
61
+ this.ws = ws;
62
+ ws.on('open', () => {
63
+ this.logger.info(`[IndexerWS] Connected to indexer`);
64
+ this.reconnectAttempt = 0;
65
+ });
66
+ ws.on('message', (data) => {
67
+ var _a;
68
+ try {
69
+ const event = JSON.parse(data.toString());
70
+ const blockHeight = (_a = event['block_height']) !== null && _a !== void 0 ? _a : 0;
71
+ if (blockHeight <= 0)
72
+ return;
73
+ const payload = event['payload'];
74
+ if (!(payload === null || payload === void 0 ? void 0 : payload.sender))
75
+ return;
76
+ const sender = payload.sender;
77
+ if (this.syncing) {
78
+ this.pendingEvents.push({ blockHeight, sender, did: event.did });
79
+ }
80
+ else {
81
+ this.processBlock(blockHeight, sender, event.did).catch(err => this.logger.error(`[IndexerWS] Handler error: ${err.message}`));
82
+ }
83
+ }
84
+ catch (_b) {
85
+ this.logger.warn(`[IndexerWS] Failed to parse message: ${data}`);
86
+ }
87
+ });
88
+ ws.on('close', () => {
89
+ if (!this.stopped)
90
+ this.scheduleReconnect();
91
+ });
92
+ ws.on('error', (error) => {
93
+ this.logger.error(`[IndexerWS] Error: ${error.message}`);
94
+ });
95
+ }
96
+ async syncRest() {
97
+ this.logger.info(`[IndexerWS] Starting REST initial sync`);
98
+ try {
99
+ const { lastBlockHeight } = await (0, VeranaHelpers_1.loadSyncState)(this.options.agent);
100
+ const data = await this.fetchInitialEvents(lastBlockHeight);
101
+ for (const event of data.events) {
102
+ const blockHeight = event.block_height;
103
+ const sender = event.payload.sender;
104
+ await this.processBlock(blockHeight, sender, event.did);
105
+ }
106
+ this.logger.info(`[IndexerWS] Initial sync complete: ${data.events.length} event(s)`);
107
+ }
108
+ catch (error) {
109
+ this.logger.error(`[IndexerWS] REST initial sync failed: ${error.message}`);
110
+ }
111
+ }
112
+ async drainPendingEvents() {
113
+ const { lastBlockHeight } = await (0, VeranaHelpers_1.loadSyncState)(this.options.agent);
114
+ const events = this.pendingEvents.splice(0);
115
+ let processed = 0;
116
+ let skipped = 0;
117
+ for (const { blockHeight, sender, did } of events) {
118
+ if (blockHeight <= lastBlockHeight) {
119
+ skipped++;
120
+ continue;
121
+ }
122
+ await this.processBlock(blockHeight, sender, did);
123
+ processed++;
124
+ }
125
+ if (skipped + processed > 0) {
126
+ this.logger.info(`[IndexerWS] Drained: ${processed} processed, ${skipped} skipped`);
127
+ }
128
+ }
129
+ async processBlock(blockHeight, sender, did) {
130
+ try {
131
+ const changes = await this.indexer.getChanges(blockHeight);
132
+ if (changes.activity.length > 0) {
133
+ await this.applyChanges(blockHeight, changes.activity, sender, did);
134
+ }
135
+ }
136
+ catch (error) {
137
+ this.logger.error(`[IndexerWS] Failed to fetch changes for block ${blockHeight}: ${error.message}`);
138
+ }
139
+ }
140
+ async applyChanges(blockHeight, activity, operatorAddress, did) {
141
+ const state = await (0, VeranaHelpers_1.loadSyncState)(this.options.agent);
142
+ const mine = activity.filter(a => a.account === operatorAddress || did === this.options.agent.did);
143
+ if (mine.length === 0)
144
+ return;
145
+ for (const a of mine) {
146
+ try {
147
+ await this.handlerRegistry.dispatch(a, {
148
+ agent: this.options.agent,
149
+ blockHeight,
150
+ operatorAddress,
151
+ state,
152
+ });
153
+ }
154
+ catch (err) {
155
+ this.logger.error(`[IndexerWS] Handler ${a.msg} failed at block ${blockHeight}: ${err.message}`);
156
+ }
157
+ }
158
+ state.lastBlockHeight = Math.max(state.lastBlockHeight, blockHeight);
159
+ await (0, VeranaHelpers_1.saveSyncState)(this.options.agent, state);
160
+ this.logger.debug(`[IndexerWS] Block ${blockHeight}: applied ${mine.length} activity item(s)`);
161
+ }
162
+ scheduleReconnect() {
163
+ const delay = Math.min(1000 * 2 ** this.reconnectAttempt, MAX_RECONNECT_DELAY_MS);
164
+ this.reconnectAttempt++;
165
+ this.logger.info(`[IndexerWS] Reconnecting in ${delay}ms (attempt ${this.reconnectAttempt})`);
166
+ setTimeout(() => {
167
+ if (!this.stopped)
168
+ this.connect();
169
+ }, delay);
170
+ }
171
+ async fetchInitialEvents(afterBlockHeight) {
172
+ this.logger.info(`[IndexerWS] Fetching initial events after block ${afterBlockHeight}`);
173
+ if (!this.options.agent.did)
174
+ throw new Error('Agent does not have any defined public DID');
175
+ const response = await this.indexer.getEvents(this.options.agent.did, afterBlockHeight);
176
+ this.logger.info(`[IndexerWS] Fetched: count=${response.count}, after_block_height=${response.after_block_height}`);
177
+ return response;
178
+ }
179
+ }
180
+ exports.IndexerWebSocketService = IndexerWebSocketService;
181
+ //# sourceMappingURL=IndexerWebSocketService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IndexerWebSocketService.js","sourceRoot":"","sources":["../../src/blockchain/IndexerWebSocketService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { VsAgent } from '../agent/VsAgent';
2
+ import { VeranaSyncState } from './types';
3
+ export declare function loadSyncState(agent: VsAgent): Promise<VeranaSyncState>;
4
+ export declare function saveSyncState(agent: VsAgent, state: VeranaSyncState): Promise<void>;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadSyncState = loadSyncState;
4
+ exports.saveSyncState = saveSyncState;
5
+ const types_1 = require("./types");
6
+ const emptyState = () => ({
7
+ lastBlockHeight: 0,
8
+ trustRegistries: {},
9
+ credentialSchemas: {},
10
+ permissions: {},
11
+ });
12
+ async function loadSyncState(agent) {
13
+ var _a;
14
+ const record = await agent.genericRecords.findById(types_1.RECORD_ID);
15
+ if (!record)
16
+ return emptyState();
17
+ return (_a = record.content) !== null && _a !== void 0 ? _a : emptyState();
18
+ }
19
+ async function saveSyncState(agent, state) {
20
+ const existing = await agent.genericRecords.findById(types_1.RECORD_ID);
21
+ if (existing) {
22
+ existing.content = state;
23
+ await agent.genericRecords.update(existing);
24
+ }
25
+ else {
26
+ await agent.genericRecords.save({ id: types_1.RECORD_ID, content: state });
27
+ }
28
+ }
29
+ //# sourceMappingURL=VeranaHelpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VeranaHelpers.js","sourceRoot":"","sources":["../../src/blockchain/VeranaHelpers.ts"],"names":[],"mappings":";;AAaA,sCAIC;AAED,sCAQC;AAvBD,mCAAoD;AAEpD,MAAM,UAAU,GAAG,GAAoB,EAAE,CAAC,CAAC;IACzC,eAAe,EAAE,CAAC;IAClB,eAAe,EAAE,EAAE;IACnB,iBAAiB,EAAE,EAAE;IACrB,WAAW,EAAE,EAAE;CAChB,CAAC,CAAA;AAEK,KAAK,UAAU,aAAa,CAAC,KAAc;;IAChD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,iBAAS,CAAC,CAAA;IAC7D,IAAI,CAAC,MAAM;QAAE,OAAO,UAAU,EAAE,CAAA;IAChC,OAAO,MAAC,MAAM,CAAC,OAAsC,mCAAI,UAAU,EAAE,CAAA;AACvE,CAAC;AAEM,KAAK,UAAU,aAAa,CAAC,KAAc,EAAE,KAAsB;IACxE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,iBAAS,CAAC,CAAA;IAC/D,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,CAAC,OAAO,GAAG,KAA8B,CAAA;QACjD,MAAM,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC7C,CAAC;SAAM,CAAC;QACN,MAAM,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,iBAAS,EAAE,OAAO,EAAE,KAA8B,EAAE,CAAC,CAAA;IAC7F,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { IndexerChangesResponse, IndexerEventsResponse, VeranaIdxConfig } from './types';
2
+ export declare class VeranaIndexerService {
3
+ private readonly config;
4
+ private readonly baseUrl;
5
+ constructor(config: VeranaIdxConfig);
6
+ getChanges(blockHeight: number): Promise<IndexerChangesResponse>;
7
+ getEvents(agentDid: string, afterBlockHeight?: number, limit?: number): Promise<IndexerEventsResponse>;
8
+ }
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VeranaIndexerService = void 0;
4
+ const util_1 = require("../utils/util");
5
+ class VeranaIndexerService {
6
+ constructor(config) {
7
+ this.config = config;
8
+ this.baseUrl = config.baseUrl.replace(/\/$/, '');
9
+ }
10
+ async getChanges(blockHeight) {
11
+ var _a, _b;
12
+ this.config.logger.debug(`[VeranaIndexer] getChanges block=${blockHeight}`);
13
+ const url = `${this.baseUrl}/verana/indexer/v1/changes/${blockHeight}`;
14
+ const data = await (0, util_1.fetchJson)(url);
15
+ return {
16
+ block_height: Number((_a = data['block_height']) !== null && _a !== void 0 ? _a : blockHeight),
17
+ next_change_at: data['next_change_at'] != null ? Number(data['next_change_at']) : null,
18
+ activity: ((_b = data['activity']) !== null && _b !== void 0 ? _b : []),
19
+ };
20
+ }
21
+ async getEvents(agentDid, afterBlockHeight = 0, limit = 500) {
22
+ this.config.logger.debug(`[VeranaIndexer] getEvents after_block=${afterBlockHeight}`);
23
+ const url = `${this.baseUrl}/verana/indexer/v1/events?did=${encodeURIComponent(agentDid)}&after_block_height=${afterBlockHeight}&limit=${limit}`;
24
+ return (0, util_1.fetchJson)(url);
25
+ }
26
+ }
27
+ exports.VeranaIndexerService = VeranaIndexerService;
28
+ //# sourceMappingURL=VeranaIndexerService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VeranaIndexerService.js","sourceRoot":"","sources":["../../src/blockchain/VeranaIndexerService.ts"],"names":[],"mappings":";;;AAAA,wCAAyC;AAIzC,MAAa,oBAAoB;IAG/B,YAA6B,MAAuB;QAAvB,WAAM,GAAN,MAAM,CAAiB;QAClD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IAClD,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,WAAmB;;QAClC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,WAAW,EAAE,CAAC,CAAA;QAC3E,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,8BAA8B,WAAW,EAAE,CAAA;QACtE,MAAM,IAAI,GAAG,MAAM,IAAA,gBAAS,EAA0B,GAAG,CAAC,CAAA;QAC1D,OAAO;YACL,YAAY,EAAE,MAAM,CAAC,MAAA,IAAI,CAAC,cAAc,CAAC,mCAAI,WAAW,CAAC;YACzD,cAAc,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;YACtF,QAAQ,EAAE,CAAC,MAAA,IAAI,CAAC,UAAU,CAAC,mCAAI,EAAE,CAAsB;SACxD,CAAA;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,QAAgB,EAAE,gBAAgB,GAAG,CAAC,EAAE,KAAK,GAAG,GAAG;QACjE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,yCAAyC,gBAAgB,EAAE,CAAC,CAAA;QACrF,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,iCAAiC,kBAAkB,CAAC,QAAQ,CAAC,uBAAuB,gBAAgB,UAAU,KAAK,EAAE,CAAA;QAChJ,OAAO,IAAA,gBAAS,EAAwB,GAAG,CAAC,CAAA;IAC9C,CAAC;CACF;AAvBD,oDAuBC"}
@@ -0,0 +1,25 @@
1
+ import { VsAgent } from '../../agent';
2
+ import { IndexerActivity, VeranaSyncState } from '../types';
3
+ interface IndexerHandlerContext {
4
+ agent: VsAgent;
5
+ blockHeight: number;
6
+ operatorAddress: string;
7
+ state: VeranaSyncState;
8
+ }
9
+ export interface IndexerEventHandler<TMsg extends string = string> {
10
+ readonly msg: TMsg;
11
+ handle(activity: IndexerActivity, ctx: IndexerHandlerContext): Promise<void>;
12
+ }
13
+ /**
14
+ * Registry for handlers of indexer events. Handlers can be registered/unregistered at runtime
15
+ * and are looked up by the `msg` field of indexer activities.
16
+ */
17
+ export declare class IndexerHandlerRegistry {
18
+ private handlers;
19
+ register(handler: IndexerEventHandler): void;
20
+ unregister(msg: string): void;
21
+ get(msg: string): IndexerEventHandler | undefined;
22
+ has(msg: string): boolean;
23
+ dispatch(activity: IndexerActivity, ctx: IndexerHandlerContext): Promise<void>;
24
+ }
25
+ export {};
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IndexerHandlerRegistry = void 0;
4
+ /**
5
+ * Registry for handlers of indexer events. Handlers can be registered/unregistered at runtime
6
+ * and are looked up by the `msg` field of indexer activities.
7
+ */
8
+ class IndexerHandlerRegistry {
9
+ constructor() {
10
+ this.handlers = new Map();
11
+ }
12
+ register(handler) {
13
+ this.handlers.set(handler.msg, handler);
14
+ }
15
+ unregister(msg) {
16
+ this.handlers.delete(msg);
17
+ }
18
+ get(msg) {
19
+ return this.handlers.get(msg);
20
+ }
21
+ has(msg) {
22
+ return this.handlers.has(msg);
23
+ }
24
+ async dispatch(activity, ctx) {
25
+ const h = this.handlers.get(activity.msg);
26
+ if (!h) {
27
+ ctx.agent.config.logger.debug(`[IndexerWS] No handler for msg=${activity.msg}`);
28
+ return;
29
+ }
30
+ await h.handle(activity, ctx);
31
+ }
32
+ }
33
+ exports.IndexerHandlerRegistry = IndexerHandlerRegistry;
34
+ //# sourceMappingURL=IndexerHandlerRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IndexerHandlerRegistry.js","sourceRoot":"","sources":["../../../src/blockchain/handlers/IndexerHandlerRegistry.ts"],"names":[],"mappings":";;;AAeA;;;GAGG;AACH,MAAa,sBAAsB;IAAnC;QACU,aAAQ,GAAG,IAAI,GAAG,EAA+B,CAAA;IA0B3D,CAAC;IAxBC,QAAQ,CAAC,OAA4B;QACnC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IACzC,CAAC;IAED,UAAU,CAAC,GAAW;QACpB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IAC3B,CAAC;IAED,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC/B,CAAC;IAED,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC/B,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,QAAyB,EAAE,GAA0B;QAClE,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;QACzC,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAA;YAC/E,OAAM;QACR,CAAC;QACD,MAAM,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IAC/B,CAAC;CACF;AA3BD,wDA2BC"}
@@ -0,0 +1,6 @@
1
+ import { IndexerEventHandler, IndexerHandlerRegistry } from './IndexerHandlerRegistry';
2
+ /**
3
+ * Default handlers for indexer events emitted by the Verana blockchain.
4
+ */
5
+ export declare const defaultHandlers: IndexerEventHandler[];
6
+ export declare function buildDefaultIndexerHandlerRegistry(): IndexerHandlerRegistry;
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defaultHandlers = void 0;
4
+ exports.buildDefaultIndexerHandlerRegistry = buildDefaultIndexerHandlerRegistry;
5
+ const IndexerHandlerRegistry_1 = require("./IndexerHandlerRegistry");
6
+ const stateMutations_1 = require("./stateMutations");
7
+ /**
8
+ * Default handlers for indexer events emitted by the Verana blockchain.
9
+ */
10
+ exports.defaultHandlers = [
11
+ {
12
+ msg: 'CreateNewTrustRegistry',
13
+ handle: async (activity, ctx) => {
14
+ (0, stateMutations_1.upsertTrustRegistry)(ctx.state, activity);
15
+ ctx.agent.config.logger.info(`[IndexerWS] CreateNewTrustRegistry entity=${activity.entity_id} block=${ctx.blockHeight}`);
16
+ },
17
+ },
18
+ {
19
+ msg: 'UpdateTrustRegistry',
20
+ handle: async (activity, ctx) => {
21
+ (0, stateMutations_1.upsertTrustRegistry)(ctx.state, activity);
22
+ ctx.agent.config.logger.info(`[IndexerWS] UpdateTrustRegistry entity=${activity.entity_id} block=${ctx.blockHeight}`);
23
+ },
24
+ },
25
+ {
26
+ msg: 'AddGovernanceFrameworkDocument',
27
+ handle: async (activity, ctx) => {
28
+ (0, stateMutations_1.upsertTrustRegistry)(ctx.state, activity);
29
+ ctx.agent.config.logger.info(`[IndexerWS] AddGovernanceFrameworkDocument entity=${activity.entity_id} block=${ctx.blockHeight}`);
30
+ },
31
+ },
32
+ {
33
+ msg: 'IncreaseActiveGFVersion',
34
+ handle: async (activity, ctx) => {
35
+ (0, stateMutations_1.bumpActiveGfVersion)(ctx.state, activity);
36
+ ctx.agent.config.logger.info(`[IndexerWS] IncreaseActiveGFVersion entity=${activity.entity_id} block=${ctx.blockHeight}`);
37
+ },
38
+ },
39
+ {
40
+ msg: 'CreateNewCredentialSchema',
41
+ handle: async (activity, ctx) => {
42
+ (0, stateMutations_1.upsertCredentialSchema)(ctx.state, activity);
43
+ ctx.agent.config.logger.info(`[IndexerWS] CreateNewCredentialSchema entity=${activity.entity_id} block=${ctx.blockHeight} — TODO §6: generate VTJSC + publish Linked VP`);
44
+ },
45
+ },
46
+ {
47
+ msg: 'UpdateCredentialSchema',
48
+ handle: async (activity, ctx) => {
49
+ (0, stateMutations_1.upsertCredentialSchema)(ctx.state, activity);
50
+ ctx.agent.config.logger.info(`[IndexerWS] UpdateCredentialSchema entity=${activity.entity_id} block=${ctx.blockHeight}`);
51
+ },
52
+ },
53
+ {
54
+ msg: 'ArchiveCredentialSchema',
55
+ handle: async (activity, ctx) => {
56
+ (0, stateMutations_1.upsertCredentialSchema)(ctx.state, activity, { toggleArchived: true });
57
+ ctx.agent.config.logger.info(`[IndexerWS] ArchiveCredentialSchema entity=${activity.entity_id} block=${ctx.blockHeight}`);
58
+ },
59
+ },
60
+ {
61
+ msg: 'StartPermissionVP',
62
+ handle: async (activity, ctx) => {
63
+ (0, stateMutations_1.upsertPermission)(ctx.state, activity, { vpState: 'PENDING' });
64
+ ctx.agent.config.logger.info(`[IndexerWS] StartPermissionVP entity=${activity.entity_id} block=${ctx.blockHeight} — TODO §5.1: progress credential acquisition flow (applicant)`);
65
+ },
66
+ },
67
+ {
68
+ msg: 'RenewPermissionVP',
69
+ handle: async (activity, ctx) => {
70
+ (0, stateMutations_1.upsertPermission)(ctx.state, activity, { vpState: 'PENDING' });
71
+ ctx.agent.config.logger.info(`[IndexerWS] RenewPermissionVP entity=${activity.entity_id} block=${ctx.blockHeight} — TODO §5.1: progress credential acquisition flow (applicant renewal)`);
72
+ },
73
+ },
74
+ {
75
+ msg: 'SetPermissionVPToValidated',
76
+ handle: async (activity, ctx) => {
77
+ (0, stateMutations_1.upsertPermission)(ctx.state, activity, { vpState: 'VALIDATED' });
78
+ ctx.agent.config.logger.info(`[IndexerWS] SetPermissionVPToValidated entity=${activity.entity_id} block=${ctx.blockHeight} — TODO §5.1: progress credential acquisition flow (validator)`);
79
+ },
80
+ },
81
+ {
82
+ msg: 'AdjustPermission',
83
+ handle: async (activity, ctx) => {
84
+ var _a;
85
+ (0, stateMutations_1.upsertPermission)(ctx.state, activity, {
86
+ effectiveUntil: String((_a = activity.changes['effective_until']) !== null && _a !== void 0 ? _a : ''),
87
+ });
88
+ ctx.agent.config.logger.info(`[IndexerWS] AdjustPermission entity=${activity.entity_id} block=${ctx.blockHeight}`);
89
+ },
90
+ },
91
+ {
92
+ msg: 'RevokePermission',
93
+ handle: async (activity, ctx) => {
94
+ (0, stateMutations_1.upsertPermission)(ctx.state, activity, { revoked: true });
95
+ ctx.agent.config.logger.info(`[IndexerWS] RevokePermission entity=${activity.entity_id} block=${ctx.blockHeight} — TODO §7.2: remove linked VP from DID doc + delete credential`);
96
+ },
97
+ },
98
+ {
99
+ msg: 'SlashPermissionTrustDeposit',
100
+ handle: async (activity, ctx) => {
101
+ (0, stateMutations_1.upsertPermission)(ctx.state, activity, { slashed: true });
102
+ ctx.agent.config.logger.info(`[IndexerWS] SlashPermissionTrustDeposit entity=${activity.entity_id} block=${ctx.blockHeight} — TODO §7.2: clean up associated flow state`);
103
+ },
104
+ },
105
+ {
106
+ msg: 'RepayPermissionSlashedTrustDeposit',
107
+ handle: async (activity, ctx) => {
108
+ (0, stateMutations_1.upsertPermission)(ctx.state, activity, { slashed: false });
109
+ ctx.agent.config.logger.info(`[IndexerWS] RepayPermissionSlashedTrustDeposit entity=${activity.entity_id} block=${ctx.blockHeight}`);
110
+ },
111
+ },
112
+ {
113
+ msg: 'CancelPermissionVPLastRequest',
114
+ handle: async (activity, ctx) => {
115
+ (0, stateMutations_1.upsertPermission)(ctx.state, activity, {});
116
+ ctx.agent.config.logger.info(`[IndexerWS] CancelPermissionVPLastRequest entity=${activity.entity_id} block=${ctx.blockHeight} — TODO §7.2: clean up associated flow state`);
117
+ },
118
+ },
119
+ ];
120
+ function buildDefaultIndexerHandlerRegistry() {
121
+ const r = new IndexerHandlerRegistry_1.IndexerHandlerRegistry();
122
+ exports.defaultHandlers.forEach(h => r.register(h));
123
+ return r;
124
+ }
125
+ //# sourceMappingURL=defaultHandlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaultHandlers.js","sourceRoot":"","sources":["../../../src/blockchain/handlers/defaultHandlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from './defaultHandlers';
2
+ export * from './IndexerHandlerRegistry';
3
+ export * from './stateMutations';
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./defaultHandlers"), exports);
18
+ __exportStar(require("./IndexerHandlerRegistry"), exports);
19
+ __exportStar(require("./stateMutations"), exports);
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/blockchain/handlers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAiC;AACjC,2DAAwC;AACxC,mDAAgC"}
@@ -0,0 +1,12 @@
1
+ import { IndexerActivity, VeranaSyncState } from '../types';
2
+ export declare function upsertTrustRegistry(state: VeranaSyncState, activity: IndexerActivity): void;
3
+ export declare function bumpActiveGfVersion(state: VeranaSyncState, activity: IndexerActivity): void;
4
+ export declare function upsertCredentialSchema(state: VeranaSyncState, activity: IndexerActivity, opts?: {
5
+ toggleArchived?: boolean;
6
+ }): void;
7
+ export declare function upsertPermission(state: VeranaSyncState, activity: IndexerActivity, overrides?: {
8
+ vpState?: string;
9
+ revoked?: boolean;
10
+ slashed?: boolean;
11
+ effectiveUntil?: string;
12
+ }): void;
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.upsertTrustRegistry = upsertTrustRegistry;
4
+ exports.bumpActiveGfVersion = bumpActiveGfVersion;
5
+ exports.upsertCredentialSchema = upsertCredentialSchema;
6
+ exports.upsertPermission = upsertPermission;
7
+ function upsertTrustRegistry(state, activity) {
8
+ var _a, _b, _c, _d, _e, _f;
9
+ const block = Number(activity.block_height) || 0;
10
+ const id = String(activity.entity_id);
11
+ const c = activity.changes;
12
+ const existing = state.trustRegistries[id];
13
+ state.trustRegistries[id] = {
14
+ id: Number(id),
15
+ did: String((_b = (_a = c['did']) !== null && _a !== void 0 ? _a : existing === null || existing === void 0 ? void 0 : existing.did) !== null && _b !== void 0 ? _b : ''),
16
+ controller: String((_d = (_c = c['controller']) !== null && _c !== void 0 ? _c : existing === null || existing === void 0 ? void 0 : existing.controller) !== null && _d !== void 0 ? _d : ''),
17
+ archived: Boolean((_f = (_e = c['archived']) !== null && _e !== void 0 ? _e : existing === null || existing === void 0 ? void 0 : existing.archived) !== null && _f !== void 0 ? _f : false),
18
+ activeGfVersion: existing === null || existing === void 0 ? void 0 : existing.activeGfVersion,
19
+ lastModifiedBlock: block,
20
+ };
21
+ }
22
+ function bumpActiveGfVersion(state, activity) {
23
+ var _a, _b, _c, _d;
24
+ const block = Number(activity.block_height) || 0;
25
+ const id = String(activity.entity_id);
26
+ const existing = state.trustRegistries[id];
27
+ state.trustRegistries[id] = {
28
+ id: Number(id),
29
+ did: String((_a = existing === null || existing === void 0 ? void 0 : existing.did) !== null && _a !== void 0 ? _a : ''),
30
+ controller: String((_b = existing === null || existing === void 0 ? void 0 : existing.controller) !== null && _b !== void 0 ? _b : ''),
31
+ archived: (_c = existing === null || existing === void 0 ? void 0 : existing.archived) !== null && _c !== void 0 ? _c : false,
32
+ activeGfVersion: ((_d = existing === null || existing === void 0 ? void 0 : existing.activeGfVersion) !== null && _d !== void 0 ? _d : 0) + 1,
33
+ lastModifiedBlock: block,
34
+ };
35
+ }
36
+ function upsertCredentialSchema(state, activity, opts = {}) {
37
+ var _a, _b, _c, _d, _e, _f;
38
+ const block = Number(activity.block_height) || 0;
39
+ const id = String(activity.entity_id);
40
+ const c = activity.changes;
41
+ const existing = state.credentialSchemas[id];
42
+ state.credentialSchemas[id] = {
43
+ id: Number(id),
44
+ trId: Number((_b = (_a = c['tr_id']) !== null && _a !== void 0 ? _a : existing === null || existing === void 0 ? void 0 : existing.trId) !== null && _b !== void 0 ? _b : 0),
45
+ jsonSchema: String((_d = (_c = c['json_schema']) !== null && _c !== void 0 ? _c : existing === null || existing === void 0 ? void 0 : existing.jsonSchema) !== null && _d !== void 0 ? _d : ''),
46
+ issuerMode: c['issuer_perm_management_mode']
47
+ ? String(c['issuer_perm_management_mode'])
48
+ : existing === null || existing === void 0 ? void 0 : existing.issuerMode,
49
+ verifierMode: c['verifier_perm_management_mode']
50
+ ? String(c['verifier_perm_management_mode'])
51
+ : existing === null || existing === void 0 ? void 0 : existing.verifierMode,
52
+ archived: opts.toggleArchived ? !((_e = existing === null || existing === void 0 ? void 0 : existing.archived) !== null && _e !== void 0 ? _e : false) : ((_f = existing === null || existing === void 0 ? void 0 : existing.archived) !== null && _f !== void 0 ? _f : false),
53
+ lastModifiedBlock: block,
54
+ };
55
+ }
56
+ function upsertPermission(state, activity, overrides = {}) {
57
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q;
58
+ const block = Number(activity.block_height) || 0;
59
+ const id = String(activity.entity_id);
60
+ const c = activity.changes;
61
+ const existing = state.permissions[id];
62
+ state.permissions[id] = {
63
+ id: Number(id),
64
+ schemaId: Number((_b = (_a = c['schema_id']) !== null && _a !== void 0 ? _a : existing === null || existing === void 0 ? void 0 : existing.schemaId) !== null && _b !== void 0 ? _b : 0),
65
+ did: String((_d = (_c = c['did']) !== null && _c !== void 0 ? _c : existing === null || existing === void 0 ? void 0 : existing.did) !== null && _d !== void 0 ? _d : ''),
66
+ type: Number((_f = (_e = c['type']) !== null && _e !== void 0 ? _e : existing === null || existing === void 0 ? void 0 : existing.type) !== null && _f !== void 0 ? _f : 0),
67
+ vpState: (_g = overrides.vpState) !== null && _g !== void 0 ? _g : String((_j = (_h = c['vp_state']) !== null && _h !== void 0 ? _h : existing === null || existing === void 0 ? void 0 : existing.vpState) !== null && _j !== void 0 ? _j : ''),
68
+ effectiveUntil: (_l = (_k = overrides.effectiveUntil) !== null && _k !== void 0 ? _k : existing === null || existing === void 0 ? void 0 : existing.effectiveUntil) !== null && _l !== void 0 ? _l : '',
69
+ revoked: (_o = (_m = overrides.revoked) !== null && _m !== void 0 ? _m : existing === null || existing === void 0 ? void 0 : existing.revoked) !== null && _o !== void 0 ? _o : false,
70
+ slashed: (_q = (_p = overrides.slashed) !== null && _p !== void 0 ? _p : existing === null || existing === void 0 ? void 0 : existing.slashed) !== null && _q !== void 0 ? _q : false,
71
+ lastModifiedBlock: block,
72
+ };
73
+ }
74
+ //# sourceMappingURL=stateMutations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stateMutations.js","sourceRoot":"","sources":["../../../src/blockchain/handlers/stateMutations.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,6 @@
1
+ export * from './IndexerWebSocketService';
2
+ export * from './VeranaHelpers';
1
3
  export * from './VeranaChainService';
4
+ export * from './VeranaIndexerService';
2
5
  export * from './types';
6
+ export * from './handlers';
@@ -14,6 +14,10 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./IndexerWebSocketService"), exports);
18
+ __exportStar(require("./VeranaHelpers"), exports);
17
19
  __exportStar(require("./VeranaChainService"), exports);
20
+ __exportStar(require("./VeranaIndexerService"), exports);
18
21
  __exportStar(require("./types"), exports);
22
+ __exportStar(require("./handlers"), exports);
19
23
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/blockchain/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,uDAAoC;AACpC,0CAAuB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/blockchain/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4DAAyC;AACzC,kDAA+B;AAC/B,uDAAoC;AACpC,yDAAsC;AACtC,0CAAuB;AACvB,6CAA0B"}
@@ -1,5 +1,64 @@
1
- import { BaseLogger } from '@credo-ts/core';
1
+ import { BaseLogger, JsonObject } from '@credo-ts/core';
2
2
  export declare const VERANA_BECH32_PREFIX = "verana";
3
+ export declare const RECORD_ID = "verana-blockchain-sync-state";
4
+ export interface IndexerEventsResponse {
5
+ events: JsonObject[];
6
+ count: number;
7
+ after_block_height: number;
8
+ }
9
+ export type IndexerEntityType = 'TrustRegistry' | 'CredentialSchema' | 'Permission' | 'PermissionSession' | 'TrustDeposit';
10
+ export interface IndexerActivity {
11
+ timestamp: string;
12
+ block_height: string | number;
13
+ entity_type: IndexerEntityType | string;
14
+ entity_id: string;
15
+ msg: string;
16
+ changes: Record<string, unknown>;
17
+ account?: string;
18
+ }
19
+ export interface IndexerChangesResponse {
20
+ block_height: number;
21
+ next_change_at: number | null;
22
+ activity: IndexerActivity[];
23
+ }
24
+ export interface VeranaIdxConfig {
25
+ baseUrl: string;
26
+ logger: BaseLogger;
27
+ }
28
+ export interface SyncedTrustRegistry {
29
+ id: number;
30
+ did: string;
31
+ controller: string;
32
+ archived: boolean;
33
+ activeGfVersion?: number;
34
+ lastModifiedBlock: number;
35
+ }
36
+ export interface SyncedCredentialSchema {
37
+ id: number;
38
+ trId: number;
39
+ jsonSchema: string;
40
+ issuerMode?: string;
41
+ verifierMode?: string;
42
+ archived: boolean;
43
+ lastModifiedBlock: number;
44
+ }
45
+ export interface SyncedPermission {
46
+ id: number;
47
+ schemaId: number;
48
+ did: string;
49
+ type: number;
50
+ vpState?: string;
51
+ effectiveUntil?: string;
52
+ revoked: boolean;
53
+ slashed: boolean;
54
+ lastModifiedBlock: number;
55
+ }
56
+ export interface VeranaSyncState {
57
+ lastBlockHeight: number;
58
+ trustRegistries: Record<string, SyncedTrustRegistry>;
59
+ credentialSchemas: Record<string, SyncedCredentialSchema>;
60
+ permissions: Record<string, SyncedPermission>;
61
+ }
3
62
  export interface PermQueryClient {
4
63
  GetPermission(req: {
5
64
  id: Long;
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.VERANA_BECH32_PREFIX = void 0;
3
+ exports.RECORD_ID = exports.VERANA_BECH32_PREFIX = void 0;
4
4
  exports.VERANA_BECH32_PREFIX = 'verana';
5
+ exports.RECORD_ID = 'verana-blockchain-sync-state';
5
6
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/blockchain/types.ts"],"names":[],"mappings":";;;AAEa,QAAA,oBAAoB,GAAG,QAAQ,CAAA"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/blockchain/types.ts"],"names":[],"mappings":";;;AAEa,QAAA,oBAAoB,GAAG,QAAQ,CAAA;AAC/B,QAAA,SAAS,GAAG,8BAA8B,CAAA"}
package/package.json CHANGED
@@ -9,7 +9,7 @@
9
9
  "default": "./build/index.js"
10
10
  }
11
11
  },
12
- "version": "1.11.0-dev.12",
12
+ "version": "1.11.0-dev.14",
13
13
  "repository": {
14
14
  "type": "git",
15
15
  "url": "https://github.com/verana-labs/vs-agent"
@@ -38,7 +38,7 @@
38
38
  "didwebvh-ts": "^2.5.6",
39
39
  "express": "^4.18.1",
40
40
  "tsyringe": "4.8.0",
41
- "@verana-labs/vs-agent-model": "1.11.0-dev.12"
41
+ "@verana-labs/vs-agent-model": "1.11.0-dev.14"
42
42
  },
43
43
  "peerDependencies": {
44
44
  "@credo-ts/core": "0.7.0-alpha-20260410113934",