@credo-ts/node 0.7.1 → 0.7.2-alpha-20260918180656
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/build/transport/DidCommHttpInboundTransport.d.mts +8 -2
- package/build/transport/DidCommHttpInboundTransport.d.mts.map +1 -1
- package/build/transport/DidCommHttpInboundTransport.mjs +26 -9
- package/build/transport/DidCommHttpInboundTransport.mjs.map +1 -1
- package/build/transport/DidCommWsInboundTransport.d.mts.map +1 -1
- package/build/transport/DidCommWsInboundTransport.mjs +2 -0
- package/build/transport/DidCommWsInboundTransport.mjs.map +1 -1
- package/package.json +3 -3
|
@@ -7,7 +7,7 @@ import { Express } from "express";
|
|
|
7
7
|
//#region src/transport/DidCommHttpInboundTransport.d.ts
|
|
8
8
|
declare class DidCommHttpInboundTransport implements DidCommInboundTransport {
|
|
9
9
|
readonly app: Express;
|
|
10
|
-
private port
|
|
10
|
+
private port?;
|
|
11
11
|
private path;
|
|
12
12
|
private _server?;
|
|
13
13
|
private processedMessageListenerTimeoutMs;
|
|
@@ -18,13 +18,19 @@ declare class DidCommHttpInboundTransport implements DidCommInboundTransport {
|
|
|
18
18
|
port,
|
|
19
19
|
processedMessageListenerTimeoutMs
|
|
20
20
|
}: {
|
|
21
|
-
app
|
|
21
|
+
app: Express;
|
|
22
|
+
port?: undefined;
|
|
22
23
|
path?: string;
|
|
24
|
+
processedMessageListenerTimeoutMs?: number;
|
|
25
|
+
} | {
|
|
26
|
+
app?: Express;
|
|
23
27
|
port: number;
|
|
28
|
+
path?: string;
|
|
24
29
|
processedMessageListenerTimeoutMs?: number;
|
|
25
30
|
});
|
|
26
31
|
start(agentContext: AgentContext): Promise<void>;
|
|
27
32
|
stop(): Promise<void>;
|
|
33
|
+
private registerRoute;
|
|
28
34
|
}
|
|
29
35
|
//#endregion
|
|
30
36
|
export { DidCommHttpInboundTransport };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DidCommHttpInboundTransport.d.mts","names":[],"sources":["../../src/transport/DidCommHttpInboundTransport.ts"],"mappings":";;;;;;;cAiBa,2BAAA,YAAuC,uBAAA;EAAA,SAClC,GAAA,EAAK,OAAA;EAAA,QACb,IAAA;EAAA,QACA,IAAA;EAAA,QACA,OAAA;EAAA,QACA,iCAAA;EAAA,IAEG,MAAA,CAAA,GAAM,MAAA,QANW,MAAA,CAMX,eAAA,SAAA,MAAA,CAAA,cAAA;;IAKf,GAAA;IACA,IAAA;IACA,IAAA;IACA;EAAA;
|
|
1
|
+
{"version":3,"file":"DidCommHttpInboundTransport.d.mts","names":[],"sources":["../../src/transport/DidCommHttpInboundTransport.ts"],"mappings":";;;;;;;cAiBa,2BAAA,YAAuC,uBAAA;EAAA,SAClC,GAAA,EAAK,OAAA;EAAA,QACb,IAAA;EAAA,QACA,IAAA;EAAA,QACA,OAAA;EAAA,QACA,iCAAA;EAAA,IAEG,MAAA,CAAA,GAAM,MAAA,QANW,MAAA,CAMX,eAAA,SAAA,MAAA,CAAA,cAAA;;IAKf,GAAA;IACA,IAAA;IACA,IAAA;IACA;EAAA;IAEI,GAAA,EAAK,OAAA;IAAS,IAAA;IAAkB,IAAA;IAAe,iCAAA;EAAA;IAC/C,GAAA,GAAM,OAAA;IAAS,IAAA;IAAc,IAAA;IAAe,iCAAA;EAAA;EASrC,KAAA,CAAM,YAAA,EAAc,YAAA,GAAY,OAAA;EA+BhC,IAAA,CAAA,GAAQ,OAAA;EAAA,QAQb,aAAA;AAAA"}
|
|
@@ -14,15 +14,36 @@ var DidCommHttpInboundTransport = class {
|
|
|
14
14
|
this.processedMessageListenerTimeoutMs = processedMessageListenerTimeoutMs ?? 1e4;
|
|
15
15
|
this.app = app ?? express();
|
|
16
16
|
this.path = path ?? "/";
|
|
17
|
-
this.app.use(text({
|
|
18
|
-
type: supportedContentTypes,
|
|
19
|
-
limit: "5mb"
|
|
20
|
-
}));
|
|
21
17
|
}
|
|
22
18
|
async start(agentContext) {
|
|
23
19
|
const transportService = agentContext.dependencyManager.resolve(DidCommTransportService);
|
|
24
20
|
agentContext.config.logger.debug("Starting HTTP inbound transport", { port: this.port });
|
|
25
|
-
this.
|
|
21
|
+
this.registerRoute(agentContext, transportService);
|
|
22
|
+
if (this.port === void 0) return;
|
|
23
|
+
const server = this.app.listen(this.port);
|
|
24
|
+
this._server = server;
|
|
25
|
+
await new Promise((resolve, reject) => {
|
|
26
|
+
const onError = (error) => {
|
|
27
|
+
server.off("listening", onListening);
|
|
28
|
+
reject(error);
|
|
29
|
+
};
|
|
30
|
+
const onListening = () => {
|
|
31
|
+
server.off("error", onError);
|
|
32
|
+
resolve();
|
|
33
|
+
};
|
|
34
|
+
server.once("error", onError);
|
|
35
|
+
server.once("listening", onListening);
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
async stop() {
|
|
39
|
+
if (!this._server) return;
|
|
40
|
+
return new Promise((resolve, reject) => this._server?.close((err) => err ? reject(err) : resolve()));
|
|
41
|
+
}
|
|
42
|
+
registerRoute(agentContext, transportService) {
|
|
43
|
+
this.app.post(this.path, text({
|
|
44
|
+
type: supportedContentTypes,
|
|
45
|
+
limit: "5mb"
|
|
46
|
+
}), async (req, res) => {
|
|
26
47
|
const contentType = req.headers["content-type"];
|
|
27
48
|
if (!contentType || !supportedContentTypes.includes(contentType)) return res.status(415).send(`Unsupported content-type. Supported content-types are: ${supportedContentTypes.join(", ")}`);
|
|
28
49
|
const session = new HttpTransportSession(utils.uuid(), req, res);
|
|
@@ -53,10 +74,6 @@ var DidCommHttpInboundTransport = class {
|
|
|
53
74
|
transportService.removeSession(session);
|
|
54
75
|
}
|
|
55
76
|
});
|
|
56
|
-
this._server = this.app.listen(this.port);
|
|
57
|
-
}
|
|
58
|
-
async stop() {
|
|
59
|
-
return new Promise((resolve, reject) => this._server?.close((err) => err ? reject(err) : resolve()));
|
|
60
77
|
}
|
|
61
78
|
};
|
|
62
79
|
var HttpTransportSession = class {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DidCommHttpInboundTransport.mjs","names":[],"sources":["../../src/transport/DidCommHttpInboundTransport.ts"],"sourcesContent":["import type { AgentContext } from '@credo-ts/core'\nimport { CredoError, EventEmitter, utils } from '@credo-ts/core'\nimport type {\n DidCommEncryptedMessage,\n DidCommInboundTransport,\n DidCommMessageProcessedEvent,\n DidCommMessageReceivedEvent,\n DidCommTransportSession,\n} from '@credo-ts/didcomm'\nimport { DidCommEventTypes, DidCommMimeType, DidCommModuleConfig, DidCommTransportService } from '@credo-ts/didcomm'\nimport type { Express, Request, Response } from 'express'\nimport express, { text } from 'express'\nimport type { Server } from 'http'\nimport { filter, firstValueFrom, ReplaySubject, take, timeout } from 'rxjs'\n\nconst supportedContentTypes: string[] = [DidCommMimeType.V0, DidCommMimeType.V1]\n\nexport class DidCommHttpInboundTransport implements DidCommInboundTransport {\n public readonly app: Express\n private port
|
|
1
|
+
{"version":3,"file":"DidCommHttpInboundTransport.mjs","names":[],"sources":["../../src/transport/DidCommHttpInboundTransport.ts"],"sourcesContent":["import type { AgentContext } from '@credo-ts/core'\nimport { CredoError, EventEmitter, utils } from '@credo-ts/core'\nimport type {\n DidCommEncryptedMessage,\n DidCommInboundTransport,\n DidCommMessageProcessedEvent,\n DidCommMessageReceivedEvent,\n DidCommTransportSession,\n} from '@credo-ts/didcomm'\nimport { DidCommEventTypes, DidCommMimeType, DidCommModuleConfig, DidCommTransportService } from '@credo-ts/didcomm'\nimport type { Express, Request, Response } from 'express'\nimport express, { text } from 'express'\nimport type { Server } from 'http'\nimport { filter, firstValueFrom, ReplaySubject, take, timeout } from 'rxjs'\n\nconst supportedContentTypes: string[] = [DidCommMimeType.V0, DidCommMimeType.V1]\n\nexport class DidCommHttpInboundTransport implements DidCommInboundTransport {\n public readonly app: Express\n private port?: number\n private path: string\n private _server?: Server\n private processedMessageListenerTimeoutMs: number\n\n public get server() {\n return this._server\n }\n\n public constructor({\n app,\n path,\n port,\n processedMessageListenerTimeoutMs,\n }:\n | { app: Express; port?: undefined; path?: string; processedMessageListenerTimeoutMs?: number }\n | { app?: Express; port: number; path?: string; processedMessageListenerTimeoutMs?: number }) {\n this.port = port\n this.processedMessageListenerTimeoutMs = processedMessageListenerTimeoutMs ?? 10000 // timeout after 10 seconds\n\n // Use the caller-provided Express app, or create one\n this.app = app ?? express()\n this.path = path ?? '/'\n }\n\n public async start(agentContext: AgentContext) {\n const transportService = agentContext.dependencyManager.resolve(DidCommTransportService)\n\n agentContext.config.logger.debug('Starting HTTP inbound transport', {\n port: this.port,\n })\n\n this.registerRoute(agentContext, transportService)\n\n if (this.port === undefined) {\n return\n }\n\n const server = this.app.listen(this.port)\n this._server = server\n\n await new Promise<void>((resolve, reject) => {\n const onError = (error: Error) => {\n server.off('listening', onListening)\n reject(error)\n }\n const onListening = () => {\n server.off('error', onError)\n resolve()\n }\n\n server.once('error', onError)\n server.once('listening', onListening)\n })\n }\n\n public async stop(): Promise<void> {\n if (!this._server) {\n return\n }\n\n return new Promise((resolve, reject) => this._server?.close((err) => (err ? reject(err) : resolve())))\n }\n\n private registerRoute(agentContext: AgentContext, transportService: DidCommTransportService) {\n this.app.post(this.path, text({ type: supportedContentTypes, limit: '5mb' }), async (req, res) => {\n const contentType = req.headers['content-type']\n\n if (!contentType || !supportedContentTypes.includes(contentType)) {\n return res\n .status(415)\n .send(`Unsupported content-type. Supported content-types are: ${supportedContentTypes.join(', ')}`)\n }\n\n const session = new HttpTransportSession(utils.uuid(), req, res)\n // We want to make sure the session is removed if the connection is closed, as it\n // can't be used anymore then. This could happen if the client abruptly closes the connection.\n req.once('close', () => transportService.removeSession(session))\n\n try {\n const message = req.body as string\n const encryptedMessage = JSON.parse(message) as DidCommEncryptedMessage\n\n const eventEmitter = agentContext.dependencyManager.resolve(EventEmitter)\n const observable = eventEmitter.observable<DidCommMessageProcessedEvent>(\n DidCommEventTypes.DidCommMessageProcessed\n )\n const subject = new ReplaySubject(1)\n\n observable\n .pipe(\n filter((e) => e.type === DidCommEventTypes.DidCommMessageProcessed),\n filter((e) => e.payload.encryptedMessage === encryptedMessage),\n timeout({\n first: this.processedMessageListenerTimeoutMs,\n meta: 'DidCommHttpInboundTransport.start',\n }),\n take(1) // automatically unsubscribe after the first matching event\n )\n .subscribe(subject)\n\n eventEmitter.emit<DidCommMessageReceivedEvent>(agentContext, {\n type: DidCommEventTypes.DidCommMessageReceived,\n payload: {\n message: encryptedMessage,\n session: session,\n },\n })\n\n // Wait for message to be processed\n await firstValueFrom(subject)\n\n // If agent did not use session when processing message we need to send response here.\n if (!res.headersSent) {\n res.status(200).end()\n }\n } catch (error) {\n agentContext.config.logger.error(`Error processing inbound message: ${error.message}`, error)\n\n if (!res.headersSent) {\n res.status(500).send('Error processing message')\n }\n } finally {\n transportService.removeSession(session)\n }\n })\n }\n}\n\nexport class HttpTransportSession implements DidCommTransportSession {\n public id: string\n public readonly type = 'http'\n public req: Request\n public res: Response\n\n public constructor(id: string, req: Request, res: Response) {\n this.id = id\n this.req = req\n this.res = res\n }\n\n public async close(): Promise<void> {\n if (!this.res.headersSent) {\n this.res.status(200).end()\n }\n }\n\n public async send(agentContext: AgentContext, encryptedMessage: DidCommEncryptedMessage): Promise<void> {\n if (this.res.headersSent) {\n throw new CredoError(`${this.type} transport session has been closed.`)\n }\n\n // By default we take the agent config's default DIDComm content-type\n const didcommConfig = agentContext.dependencyManager.resolve(DidCommModuleConfig)\n let responseMimeType = didcommConfig.didCommMimeType as string\n\n // However, if the request mime-type is a mime-type that is supported by us, we use that\n // to minimize the chance of interoperability issues\n const requestMimeType = this.req.headers['content-type']\n if (requestMimeType && supportedContentTypes.includes(requestMimeType)) {\n responseMimeType = requestMimeType\n }\n\n this.res.status(200).contentType(responseMimeType).json(encryptedMessage).end()\n }\n}\n"],"mappings":";;;;;;AAeA,MAAM,wBAAkC,CAAC,gBAAgB,IAAI,gBAAgB,GAAG;AAEhF,IAAa,8BAAb,MAA4E;CAO1E,IAAW,SAAS;AAClB,SAAO,KAAK;;CAGd,AAAO,YAAY,EACjB,KACA,MACA,MACA,qCAG8F;AAC9F,OAAK,OAAO;AACZ,OAAK,oCAAoC,qCAAqC;AAG9E,OAAK,MAAM,OAAO,SAAS;AAC3B,OAAK,OAAO,QAAQ;;CAGtB,MAAa,MAAM,cAA4B;EAC7C,MAAM,mBAAmB,aAAa,kBAAkB,QAAQ,wBAAwB;AAExF,eAAa,OAAO,OAAO,MAAM,mCAAmC,EAClE,MAAM,KAAK,MACZ,CAAC;AAEF,OAAK,cAAc,cAAc,iBAAiB;AAElD,MAAI,KAAK,SAAS,OAChB;EAGF,MAAM,SAAS,KAAK,IAAI,OAAO,KAAK,KAAK;AACzC,OAAK,UAAU;AAEf,QAAM,IAAI,SAAe,SAAS,WAAW;GAC3C,MAAM,WAAW,UAAiB;AAChC,WAAO,IAAI,aAAa,YAAY;AACpC,WAAO,MAAM;;GAEf,MAAM,oBAAoB;AACxB,WAAO,IAAI,SAAS,QAAQ;AAC5B,aAAS;;AAGX,UAAO,KAAK,SAAS,QAAQ;AAC7B,UAAO,KAAK,aAAa,YAAY;IACrC;;CAGJ,MAAa,OAAsB;AACjC,MAAI,CAAC,KAAK,QACR;AAGF,SAAO,IAAI,SAAS,SAAS,WAAW,KAAK,SAAS,OAAO,QAAS,MAAM,OAAO,IAAI,GAAG,SAAS,CAAE,CAAC;;CAGxG,AAAQ,cAAc,cAA4B,kBAA2C;AAC3F,OAAK,IAAI,KAAK,KAAK,MAAM,KAAK;GAAE,MAAM;GAAuB,OAAO;GAAO,CAAC,EAAE,OAAO,KAAK,QAAQ;GAChG,MAAM,cAAc,IAAI,QAAQ;AAEhC,OAAI,CAAC,eAAe,CAAC,sBAAsB,SAAS,YAAY,CAC9D,QAAO,IACJ,OAAO,IAAI,CACX,KAAK,0DAA0D,sBAAsB,KAAK,KAAK,GAAG;GAGvG,MAAM,UAAU,IAAI,qBAAqB,MAAM,MAAM,EAAE,KAAK,IAAI;AAGhE,OAAI,KAAK,eAAe,iBAAiB,cAAc,QAAQ,CAAC;AAEhE,OAAI;IACF,MAAM,UAAU,IAAI;IACpB,MAAM,mBAAmB,KAAK,MAAM,QAAQ;IAE5C,MAAM,eAAe,aAAa,kBAAkB,QAAQ,aAAa;IACzE,MAAM,aAAa,aAAa,WAC9B,kBAAkB,wBACnB;IACD,MAAM,UAAU,IAAI,cAAc,EAAE;AAEpC,eACG,KACC,QAAQ,MAAM,EAAE,SAAS,kBAAkB,wBAAwB,EACnE,QAAQ,MAAM,EAAE,QAAQ,qBAAqB,iBAAiB,EAC9D,QAAQ;KACN,OAAO,KAAK;KACZ,MAAM;KACP,CAAC,EACF,KAAK,EAAE,CACR,CACA,UAAU,QAAQ;AAErB,iBAAa,KAAkC,cAAc;KAC3D,MAAM,kBAAkB;KACxB,SAAS;MACP,SAAS;MACA;MACV;KACF,CAAC;AAGF,UAAM,eAAe,QAAQ;AAG7B,QAAI,CAAC,IAAI,YACP,KAAI,OAAO,IAAI,CAAC,KAAK;YAEhB,OAAO;AACd,iBAAa,OAAO,OAAO,MAAM,qCAAqC,MAAM,WAAW,MAAM;AAE7F,QAAI,CAAC,IAAI,YACP,KAAI,OAAO,IAAI,CAAC,KAAK,2BAA2B;aAE1C;AACR,qBAAiB,cAAc,QAAQ;;IAEzC;;;AAIN,IAAa,uBAAb,MAAqE;CAMnE,AAAO,YAAY,IAAY,KAAc,KAAe;OAJ5C,OAAO;AAKrB,OAAK,KAAK;AACV,OAAK,MAAM;AACX,OAAK,MAAM;;CAGb,MAAa,QAAuB;AAClC,MAAI,CAAC,KAAK,IAAI,YACZ,MAAK,IAAI,OAAO,IAAI,CAAC,KAAK;;CAI9B,MAAa,KAAK,cAA4B,kBAA0D;AACtG,MAAI,KAAK,IAAI,YACX,OAAM,IAAI,WAAW,GAAG,KAAK,KAAK,qCAAqC;EAKzE,IAAI,mBADkB,aAAa,kBAAkB,QAAQ,oBAAoB,CAC5C;EAIrC,MAAM,kBAAkB,KAAK,IAAI,QAAQ;AACzC,MAAI,mBAAmB,sBAAsB,SAAS,gBAAgB,CACpE,oBAAmB;AAGrB,OAAK,IAAI,OAAO,IAAI,CAAC,YAAY,iBAAiB,CAAC,KAAK,iBAAiB,CAAC,KAAK"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DidCommWsInboundTransport.d.mts","names":[],"sources":["../../src/transport/DidCommWsInboundTransport.ts"],"mappings":";;;;;cAWa,yBAAA,YAAqC,uBAAA;EAAA,QACxC,YAAA;EAAA,QACA,MAAA;EAAA,QAGA,SAAA;;IAGN,MAAA;IACA;EAAA;IACG,MAAA,EAAQ,eAAA;IAAiB,IAAA;EAAA;IAAuB,MAAA;IAAoB,IAAA;EAAA;EAI5D,KAAA,CAAM,YAAA,EAAc,YAAA,GAAY,OAAA;
|
|
1
|
+
{"version":3,"file":"DidCommWsInboundTransport.d.mts","names":[],"sources":["../../src/transport/DidCommWsInboundTransport.ts"],"mappings":";;;;;cAWa,yBAAA,YAAqC,uBAAA;EAAA,QACxC,YAAA;EAAA,QACA,MAAA;EAAA,QAGA,SAAA;;IAGN,MAAA;IACA;EAAA;IACG,MAAA,EAAQ,eAAA;IAAiB,IAAA;EAAA;IAAuB,MAAA;IAAoB,IAAA;EAAA;EAI5D,KAAA,CAAM,YAAA,EAAc,YAAA,GAAY,OAAA;EA+BhC,IAAA,CAAA,GAAI,OAAA;EAAA,QAiBT,yBAAA;AAAA"}
|
|
@@ -23,6 +23,7 @@ var DidCommWsInboundTransport = class {
|
|
|
23
23
|
this.listenOnWebSocketMessages(agentContext, socket, session);
|
|
24
24
|
socket.on("close", () => {
|
|
25
25
|
this.logger.debug("Socket closed.");
|
|
26
|
+
delete this.socketIds[socketId];
|
|
26
27
|
transportService.removeSession(session);
|
|
27
28
|
});
|
|
28
29
|
} else this.logger.debug(`Socket with id ${socketId} already exists.`);
|
|
@@ -30,6 +31,7 @@ var DidCommWsInboundTransport = class {
|
|
|
30
31
|
}
|
|
31
32
|
async stop() {
|
|
32
33
|
this.logger.debug("Closing WebSocket Server");
|
|
34
|
+
for (const socket of Object.values(this.socketIds)) socket.terminate();
|
|
33
35
|
return new Promise((resolve, reject) => {
|
|
34
36
|
this.socketServer.close((error) => {
|
|
35
37
|
if (error) reject(error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DidCommWsInboundTransport.mjs","names":[],"sources":["../../src/transport/DidCommWsInboundTransport.ts"],"sourcesContent":["import type { AgentContext, Logger } from '@credo-ts/core'\nimport { CredoError, EventEmitter, utils } from '@credo-ts/core'\nimport type {\n DidCommEncryptedMessage,\n DidCommInboundTransport,\n DidCommMessageReceivedEvent,\n DidCommTransportSession,\n} from '@credo-ts/didcomm'\nimport { DidCommEventTypes, DidCommModuleConfig, DidCommTransportService } from '@credo-ts/didcomm'\nimport WebSocket, { WebSocketServer } from 'ws'\n\nexport class DidCommWsInboundTransport implements DidCommInboundTransport {\n private socketServer: WebSocketServer\n private logger!: Logger\n\n // We're using a `socketId` just for the prevention of calling the connection handler twice.\n private socketIds: Record<string,
|
|
1
|
+
{"version":3,"file":"DidCommWsInboundTransport.mjs","names":[],"sources":["../../src/transport/DidCommWsInboundTransport.ts"],"sourcesContent":["import type { AgentContext, Logger } from '@credo-ts/core'\nimport { CredoError, EventEmitter, utils } from '@credo-ts/core'\nimport type {\n DidCommEncryptedMessage,\n DidCommInboundTransport,\n DidCommMessageReceivedEvent,\n DidCommTransportSession,\n} from '@credo-ts/didcomm'\nimport { DidCommEventTypes, DidCommModuleConfig, DidCommTransportService } from '@credo-ts/didcomm'\nimport WebSocket, { WebSocketServer } from 'ws'\n\nexport class DidCommWsInboundTransport implements DidCommInboundTransport {\n private socketServer: WebSocketServer\n private logger!: Logger\n\n // We're using a `socketId` just for the prevention of calling the connection handler twice.\n private socketIds: Record<string, WebSocket> = {}\n\n public constructor({\n server,\n port,\n }: { server: WebSocketServer; port?: undefined } | { server?: undefined; port: number }) {\n this.socketServer = server ?? new WebSocketServer({ port })\n }\n\n public async start(agentContext: AgentContext) {\n const transportService = agentContext.dependencyManager.resolve(DidCommTransportService)\n\n this.logger = agentContext.config.logger\n\n const didcommConfig = agentContext.dependencyManager.resolve(DidCommModuleConfig)\n const wsEndpoint = didcommConfig.endpoints.find((e) => e.startsWith('ws'))\n this.logger.debug('Starting WS inbound transport', {\n endpoint: wsEndpoint,\n })\n\n this.socketServer.on('connection', (socket: WebSocket) => {\n const socketId = utils.uuid()\n this.logger.debug('Socket connected.')\n\n if (!this.socketIds[socketId]) {\n this.logger.debug(`Saving new socket with id ${socketId}.`)\n this.socketIds[socketId] = socket\n const session = new WebSocketTransportSession(socketId, socket, this.logger)\n this.listenOnWebSocketMessages(agentContext, socket, session)\n socket.on('close', () => {\n this.logger.debug('Socket closed.')\n delete this.socketIds[socketId]\n transportService.removeSession(session)\n })\n } else {\n this.logger.debug(`Socket with id ${socketId} already exists.`)\n }\n })\n }\n\n public async stop() {\n this.logger.debug('Closing WebSocket Server')\n\n for (const socket of Object.values(this.socketIds)) {\n socket.terminate()\n }\n\n return new Promise<void>((resolve, reject) => {\n this.socketServer.close((error) => {\n if (error) {\n reject(error)\n }\n resolve()\n })\n })\n }\n\n private listenOnWebSocketMessages(agentContext: AgentContext, socket: WebSocket, session: DidCommTransportSession) {\n // biome-ignore lint/suspicious/noExplicitAny: no explanation\n socket.addEventListener('message', async (event: any) => {\n this.logger.debug('WebSocket message event received.', { url: event.target.url })\n try {\n const encryptedMessage = JSON.parse(event.data) as DidCommEncryptedMessage\n\n const eventEmitter = agentContext.dependencyManager.resolve(EventEmitter)\n eventEmitter.emit<DidCommMessageReceivedEvent>(agentContext, {\n type: DidCommEventTypes.DidCommMessageReceived,\n payload: {\n message: encryptedMessage,\n session: session,\n },\n })\n } catch (error) {\n this.logger.error(`Error processing message: ${error}`)\n }\n })\n }\n}\n\nexport class WebSocketTransportSession implements DidCommTransportSession {\n public id: string\n public readonly type = 'WebSocket'\n public socket: WebSocket\n private logger: Logger\n\n public constructor(id: string, socket: WebSocket, logger: Logger) {\n this.id = id\n this.socket = socket\n this.logger = logger\n }\n\n public async send(_agentContext: AgentContext, encryptedMessage: DidCommEncryptedMessage): Promise<void> {\n if (this.socket.readyState !== WebSocket.OPEN) {\n throw new CredoError(`${this.type} transport session has been closed.`)\n }\n this.socket.send(JSON.stringify(encryptedMessage), (error?) => {\n // biome-ignore lint/suspicious/noDoubleEquals: If error check is added as '!==' it fails the check\n if (error != undefined) {\n this.logger.debug(`Error sending message: ${error}`)\n throw new CredoError(`${this.type} send message failed.`, { cause: error })\n }\n this.logger.debug(`${this.type} sent message successfully.`)\n })\n }\n\n public async close(): Promise<void> {\n if (this.socket.readyState === WebSocket.OPEN) {\n this.socket.close()\n }\n }\n}\n"],"mappings":";;;;;AAWA,IAAa,4BAAb,MAA0E;CAOxE,AAAO,YAAY,EACjB,QACA,QACuF;OALjF,YAAuC,EAAE;AAM/C,OAAK,eAAe,UAAU,IAAI,gBAAgB,EAAE,MAAM,CAAC;;CAG7D,MAAa,MAAM,cAA4B;EAC7C,MAAM,mBAAmB,aAAa,kBAAkB,QAAQ,wBAAwB;AAExF,OAAK,SAAS,aAAa,OAAO;EAGlC,MAAM,aADgB,aAAa,kBAAkB,QAAQ,oBAAoB,CAChD,UAAU,MAAM,MAAM,EAAE,WAAW,KAAK,CAAC;AAC1E,OAAK,OAAO,MAAM,iCAAiC,EACjD,UAAU,YACX,CAAC;AAEF,OAAK,aAAa,GAAG,eAAe,WAAsB;GACxD,MAAM,WAAW,MAAM,MAAM;AAC7B,QAAK,OAAO,MAAM,oBAAoB;AAEtC,OAAI,CAAC,KAAK,UAAU,WAAW;AAC7B,SAAK,OAAO,MAAM,6BAA6B,SAAS,GAAG;AAC3D,SAAK,UAAU,YAAY;IAC3B,MAAM,UAAU,IAAI,0BAA0B,UAAU,QAAQ,KAAK,OAAO;AAC5E,SAAK,0BAA0B,cAAc,QAAQ,QAAQ;AAC7D,WAAO,GAAG,eAAe;AACvB,UAAK,OAAO,MAAM,iBAAiB;AACnC,YAAO,KAAK,UAAU;AACtB,sBAAiB,cAAc,QAAQ;MACvC;SAEF,MAAK,OAAO,MAAM,kBAAkB,SAAS,kBAAkB;IAEjE;;CAGJ,MAAa,OAAO;AAClB,OAAK,OAAO,MAAM,2BAA2B;AAE7C,OAAK,MAAM,UAAU,OAAO,OAAO,KAAK,UAAU,CAChD,QAAO,WAAW;AAGpB,SAAO,IAAI,SAAe,SAAS,WAAW;AAC5C,QAAK,aAAa,OAAO,UAAU;AACjC,QAAI,MACF,QAAO,MAAM;AAEf,aAAS;KACT;IACF;;CAGJ,AAAQ,0BAA0B,cAA4B,QAAmB,SAAkC;AAEjH,SAAO,iBAAiB,WAAW,OAAO,UAAe;AACvD,QAAK,OAAO,MAAM,qCAAqC,EAAE,KAAK,MAAM,OAAO,KAAK,CAAC;AACjF,OAAI;IACF,MAAM,mBAAmB,KAAK,MAAM,MAAM,KAAK;AAG/C,IADqB,aAAa,kBAAkB,QAAQ,aAAa,CAC5D,KAAkC,cAAc;KAC3D,MAAM,kBAAkB;KACxB,SAAS;MACP,SAAS;MACA;MACV;KACF,CAAC;YACK,OAAO;AACd,SAAK,OAAO,MAAM,6BAA6B,QAAQ;;IAEzD;;;AAIN,IAAa,4BAAb,MAA0E;CAMxE,AAAO,YAAY,IAAY,QAAmB,QAAgB;OAJlD,OAAO;AAKrB,OAAK,KAAK;AACV,OAAK,SAAS;AACd,OAAK,SAAS;;CAGhB,MAAa,KAAK,eAA6B,kBAA0D;AACvG,MAAI,KAAK,OAAO,eAAe,UAAU,KACvC,OAAM,IAAI,WAAW,GAAG,KAAK,KAAK,qCAAqC;AAEzE,OAAK,OAAO,KAAK,KAAK,UAAU,iBAAiB,GAAG,UAAW;AAE7D,OAAI,SAAS,QAAW;AACtB,SAAK,OAAO,MAAM,0BAA0B,QAAQ;AACpD,UAAM,IAAI,WAAW,GAAG,KAAK,KAAK,wBAAwB,EAAE,OAAO,OAAO,CAAC;;AAE7E,QAAK,OAAO,MAAM,GAAG,KAAK,KAAK,6BAA6B;IAC5D;;CAGJ,MAAa,QAAuB;AAClC,MAAI,KAAK,OAAO,eAAe,UAAU,KACvC,MAAK,OAAO,OAAO"}
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
".": "./build/index.mjs",
|
|
5
5
|
"./package.json": "./package.json"
|
|
6
6
|
},
|
|
7
|
-
"version": "0.7.
|
|
7
|
+
"version": "0.7.2-alpha-20260918180656",
|
|
8
8
|
"files": [
|
|
9
9
|
"build"
|
|
10
10
|
],
|
|
@@ -27,8 +27,8 @@
|
|
|
27
27
|
"hpke": "^1.1.4",
|
|
28
28
|
"rxjs": "^7.8.2",
|
|
29
29
|
"ws": "^8.19.0",
|
|
30
|
-
"@credo-ts/core": "0.7.
|
|
31
|
-
"@credo-ts/didcomm": "0.7.
|
|
30
|
+
"@credo-ts/core": "0.7.2-alpha-20260918180656",
|
|
31
|
+
"@credo-ts/didcomm": "0.7.2-alpha-20260918180656"
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|
|
34
34
|
"@types/node": "^20.19.31",
|