@credo-ts/tenants 0.6.1-pr-2091-20241119140918 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/build/TenantAgent.d.mts +12 -0
  2. package/build/TenantAgent.d.mts.map +1 -0
  3. package/build/TenantAgent.mjs +23 -0
  4. package/build/TenantAgent.mjs.map +1 -0
  5. package/build/TenantsApi.d.mts +37 -0
  6. package/build/TenantsApi.d.mts.map +1 -0
  7. package/build/TenantsApi.mjs +107 -0
  8. package/build/TenantsApi.mjs.map +1 -0
  9. package/build/TenantsApiOptions.d.mts +19 -0
  10. package/build/TenantsApiOptions.d.mts.map +1 -0
  11. package/build/TenantsModule.d.mts +23 -0
  12. package/build/TenantsModule.d.mts.map +1 -0
  13. package/build/TenantsModule.mjs +40 -0
  14. package/build/TenantsModule.mjs.map +1 -0
  15. package/build/TenantsModuleConfig.d.mts +35 -0
  16. package/build/TenantsModuleConfig.d.mts.map +1 -0
  17. package/build/TenantsModuleConfig.mjs +18 -0
  18. package/build/TenantsModuleConfig.mjs.map +1 -0
  19. package/build/_virtual/_@oxc-project_runtime@0.99.0/helpers/decorate.mjs +10 -0
  20. package/build/_virtual/_@oxc-project_runtime@0.99.0/helpers/decorateMetadata.mjs +7 -0
  21. package/build/_virtual/_@oxc-project_runtime@0.99.0/helpers/decorateParam.mjs +9 -0
  22. package/build/context/TenantAgentContextProvider.d.mts +52 -0
  23. package/build/context/TenantAgentContextProvider.d.mts.map +1 -0
  24. package/build/context/TenantAgentContextProvider.mjs +149 -0
  25. package/build/context/TenantAgentContextProvider.mjs.map +1 -0
  26. package/build/context/TenantSessionCoordinator.d.mts +71 -0
  27. package/build/context/TenantSessionCoordinator.d.mts.map +1 -0
  28. package/build/context/TenantSessionCoordinator.mjs +186 -0
  29. package/build/context/TenantSessionCoordinator.mjs.map +1 -0
  30. package/build/context/TenantSessionMutex.mjs +66 -0
  31. package/build/context/TenantSessionMutex.mjs.map +1 -0
  32. package/build/index.d.mts +10 -0
  33. package/build/index.mjs +9 -0
  34. package/build/models/TenantConfig.d.mts +7 -0
  35. package/build/models/TenantConfig.d.mts.map +1 -0
  36. package/build/repository/TenantRecord.d.mts +36 -0
  37. package/build/repository/TenantRecord.d.mts.map +1 -0
  38. package/build/repository/TenantRecord.mjs +29 -0
  39. package/build/repository/TenantRecord.mjs.map +1 -0
  40. package/build/repository/TenantRepository.d.mts +11 -0
  41. package/build/repository/TenantRepository.d.mts.map +1 -0
  42. package/build/repository/TenantRepository.mjs +25 -0
  43. package/build/repository/TenantRepository.mjs.map +1 -0
  44. package/build/repository/TenantRoutingRecord.d.mts +28 -0
  45. package/build/repository/TenantRoutingRecord.d.mts.map +1 -0
  46. package/build/repository/TenantRoutingRecord.mjs +28 -0
  47. package/build/repository/TenantRoutingRecord.mjs.map +1 -0
  48. package/build/repository/TenantRoutingRepository.d.mts +11 -0
  49. package/build/repository/TenantRoutingRepository.d.mts.map +1 -0
  50. package/build/repository/TenantRoutingRepository.mjs +25 -0
  51. package/build/repository/TenantRoutingRepository.mjs.map +1 -0
  52. package/build/repository/index.d.mts +4 -0
  53. package/build/repository/index.mjs +4 -0
  54. package/build/services/TenantRecordService.d.mts +26 -0
  55. package/build/services/TenantRecordService.d.mts.map +1 -0
  56. package/build/services/TenantRecordService.mjs +63 -0
  57. package/build/services/TenantRecordService.mjs.map +1 -0
  58. package/build/services/index.d.mts +1 -0
  59. package/build/services/index.mjs +1 -0
  60. package/build/updates/0.4-0.5/index.d.mts +7 -0
  61. package/build/updates/0.4-0.5/index.d.mts.map +1 -0
  62. package/build/updates/0.4-0.5/index.mjs +10 -0
  63. package/build/updates/0.4-0.5/index.mjs.map +1 -0
  64. package/build/updates/0.4-0.5/tenantRecord.mjs +28 -0
  65. package/build/updates/0.4-0.5/tenantRecord.mjs.map +1 -0
  66. package/package.json +15 -14
  67. package/build/TenantAgent.d.ts +0 -8
  68. package/build/TenantAgent.js +0 -25
  69. package/build/TenantAgent.js.map +0 -1
  70. package/build/TenantsApi.d.ts +0 -25
  71. package/build/TenantsApi.js +0 -117
  72. package/build/TenantsApi.js.map +0 -1
  73. package/build/TenantsApiOptions.d.ts +0 -14
  74. package/build/TenantsApiOptions.js +0 -3
  75. package/build/TenantsApiOptions.js.map +0 -1
  76. package/build/TenantsModule.d.ts +0 -19
  77. package/build/TenantsModule.js +0 -47
  78. package/build/TenantsModule.js.map +0 -1
  79. package/build/TenantsModuleConfig.d.ts +0 -31
  80. package/build/TenantsModuleConfig.js +0 -20
  81. package/build/TenantsModuleConfig.js.map +0 -1
  82. package/build/context/TenantAgentContextProvider.d.ts +0 -40
  83. package/build/context/TenantAgentContextProvider.js +0 -175
  84. package/build/context/TenantAgentContextProvider.js.map +0 -1
  85. package/build/context/TenantSessionCoordinator.d.ts +0 -54
  86. package/build/context/TenantSessionCoordinator.js +0 -195
  87. package/build/context/TenantSessionCoordinator.js.map +0 -1
  88. package/build/context/TenantSessionMutex.d.ts +0 -29
  89. package/build/context/TenantSessionMutex.js +0 -84
  90. package/build/context/TenantSessionMutex.js.map +0 -1
  91. package/build/context/types.d.ts +0 -0
  92. package/build/context/types.js +0 -2
  93. package/build/context/types.js.map +0 -1
  94. package/build/index.d.ts +0 -5
  95. package/build/index.js +0 -24
  96. package/build/index.js.map +0 -1
  97. package/build/models/TenantConfig.d.ts +0 -4
  98. package/build/models/TenantConfig.js +0 -3
  99. package/build/models/TenantConfig.js.map +0 -1
  100. package/build/repository/TenantRecord.d.ts +0 -33
  101. package/build/repository/TenantRecord.js +0 -32
  102. package/build/repository/TenantRecord.js.map +0 -1
  103. package/build/repository/TenantRepository.d.ts +0 -7
  104. package/build/repository/TenantRepository.js +0 -32
  105. package/build/repository/TenantRepository.js.map +0 -1
  106. package/build/repository/TenantRoutingRecord.d.ts +0 -26
  107. package/build/repository/TenantRoutingRecord.js +0 -24
  108. package/build/repository/TenantRoutingRecord.js.map +0 -1
  109. package/build/repository/TenantRoutingRepository.d.ts +0 -7
  110. package/build/repository/TenantRoutingRepository.js +0 -34
  111. package/build/repository/TenantRoutingRepository.js.map +0 -1
  112. package/build/repository/index.d.ts +0 -4
  113. package/build/repository/index.js +0 -21
  114. package/build/repository/index.js.map +0 -1
  115. package/build/services/TenantRecordService.d.ts +0 -17
  116. package/build/services/TenantRecordService.js +0 -78
  117. package/build/services/TenantRecordService.js.map +0 -1
  118. package/build/services/index.d.ts +0 -1
  119. package/build/services/index.js +0 -18
  120. package/build/services/index.js.map +0 -1
  121. package/build/updates/0.4-0.5/index.d.ts +0 -2
  122. package/build/updates/0.4-0.5/index.js +0 -8
  123. package/build/updates/0.4-0.5/index.js.map +0 -1
  124. package/build/updates/0.4-0.5/tenantRecord.d.ts +0 -10
  125. package/build/updates/0.4-0.5/tenantRecord.js +0 -26
  126. package/build/updates/0.4-0.5/tenantRecord.js.map +0 -1
@@ -0,0 +1,12 @@
1
+ import { AgentContext, BaseAgent, DefaultAgentModules, ModulesMap } from "@credo-ts/core";
2
+
3
+ //#region src/TenantAgent.d.ts
4
+ declare class TenantAgent<AgentModules extends ModulesMap = DefaultAgentModules> extends BaseAgent<AgentModules> {
5
+ private sessionHasEnded;
6
+ constructor(agentContext: AgentContext);
7
+ initialize(): Promise<void>;
8
+ endSession(): Promise<void>;
9
+ }
10
+ //#endregion
11
+ export { TenantAgent };
12
+ //# sourceMappingURL=TenantAgent.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TenantAgent.d.mts","names":[],"sources":["../src/TenantAgent.ts"],"sourcesContent":[],"mappings":";;;cAIa,iCAAiC,aAAa,6BAA6B,UAAU;EAArF,QAAA,eAAW;EAAsB,WAAA,CAAA,YAAA,EAGX,YAHW;EAAa,UAAA,CAAA,CAAA,EAOlC,OAPkC,CAAA,IAAA,CAAA;EAAuC,UAAA,CAAA,CAAA,EAezE,OAfyE,CAAA,IAAA,CAAA"}
@@ -0,0 +1,23 @@
1
+ import { BaseAgent, CredoError } from "@credo-ts/core";
2
+
3
+ //#region src/TenantAgent.ts
4
+ var TenantAgent = class extends BaseAgent {
5
+ constructor(agentContext) {
6
+ super(agentContext.config, agentContext.dependencyManager);
7
+ this.sessionHasEnded = false;
8
+ }
9
+ async initialize() {
10
+ if (this.sessionHasEnded) throw new CredoError("Can't initialize agent after tenant sessions has been ended.");
11
+ this._isInitialized = true;
12
+ }
13
+ async endSession() {
14
+ this.logger.trace(`Ending session for agent context with contextCorrelationId '${this.agentContext.contextCorrelationId}'`);
15
+ await this.agentContext.endSession();
16
+ this._isInitialized = false;
17
+ this.sessionHasEnded = true;
18
+ }
19
+ };
20
+
21
+ //#endregion
22
+ export { TenantAgent };
23
+ //# sourceMappingURL=TenantAgent.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TenantAgent.mjs","names":[],"sources":["../src/TenantAgent.ts"],"sourcesContent":["import type { AgentContext, DefaultAgentModules, ModulesMap } from '@credo-ts/core'\n\nimport { BaseAgent, CredoError } from '@credo-ts/core'\n\nexport class TenantAgent<AgentModules extends ModulesMap = DefaultAgentModules> extends BaseAgent<AgentModules> {\n private sessionHasEnded = false\n\n public constructor(agentContext: AgentContext) {\n super(agentContext.config, agentContext.dependencyManager)\n }\n\n public async initialize() {\n if (this.sessionHasEnded) {\n throw new CredoError(\"Can't initialize agent after tenant sessions has been ended.\")\n }\n\n this._isInitialized = true\n }\n\n public async endSession() {\n this.logger.trace(\n `Ending session for agent context with contextCorrelationId '${this.agentContext.contextCorrelationId}'`\n )\n await this.agentContext.endSession()\n this._isInitialized = false\n this.sessionHasEnded = true\n }\n}\n"],"mappings":";;;AAIA,IAAa,cAAb,cAAwF,UAAwB;CAG9G,AAAO,YAAY,cAA4B;AAC7C,QAAM,aAAa,QAAQ,aAAa,kBAAkB;OAHpD,kBAAkB;;CAM1B,MAAa,aAAa;AACxB,MAAI,KAAK,gBACP,OAAM,IAAI,WAAW,+DAA+D;AAGtF,OAAK,iBAAiB;;CAGxB,MAAa,aAAa;AACxB,OAAK,OAAO,MACV,+DAA+D,KAAK,aAAa,qBAAqB,GACvG;AACD,QAAM,KAAK,aAAa,YAAY;AACpC,OAAK,iBAAiB;AACtB,OAAK,kBAAkB"}
@@ -0,0 +1,37 @@
1
+ import { TenantRecord } from "./repository/TenantRecord.mjs";
2
+ import { TenantAgent } from "./TenantAgent.mjs";
3
+ import "./repository/index.mjs";
4
+ import { TenantRecordService } from "./services/TenantRecordService.mjs";
5
+ import "./services/index.mjs";
6
+ import { TenantAgentContextProvider } from "./context/TenantAgentContextProvider.mjs";
7
+ import { CreateTenantOptions, GetTenantAgentOptions, UpdateTenantStorageOptions, WithTenantAgentCallback } from "./TenantsApiOptions.mjs";
8
+ import { AgentContext, DefaultAgentModules, Logger, ModulesMap, Query, QueryOptions } from "@credo-ts/core";
9
+
10
+ //#region src/TenantsApi.d.ts
11
+ declare class TenantsApi<AgentModules extends ModulesMap = DefaultAgentModules> {
12
+ readonly rootAgentContext: AgentContext;
13
+ private tenantRecordService;
14
+ private agentContextProvider;
15
+ private logger;
16
+ constructor(tenantRecordService: TenantRecordService, rootAgentContext: AgentContext, agentContextProvider: TenantAgentContextProvider, logger: Logger);
17
+ getTenantAgent({
18
+ tenantId
19
+ }: GetTenantAgentOptions): Promise<TenantAgent<AgentModules>>;
20
+ withTenantAgent<ReturnValue>(options: GetTenantAgentOptions, withTenantAgentCallback: WithTenantAgentCallback<AgentModules, ReturnValue>): Promise<ReturnValue>;
21
+ createTenant(options: CreateTenantOptions): Promise<TenantRecord>;
22
+ getTenantById(tenantId: string): Promise<TenantRecord>;
23
+ findTenantsByLabel(label: string): Promise<TenantRecord[]>;
24
+ deleteTenantById(tenantId: string): Promise<void>;
25
+ updateTenant(tenant: TenantRecord): Promise<void>;
26
+ findTenantsByQuery(query: Query<TenantRecord>, queryOptions?: QueryOptions): Promise<TenantRecord[]>;
27
+ getAllTenants(): Promise<TenantRecord[]>;
28
+ updateTenantStorage({
29
+ tenantId,
30
+ updateOptions
31
+ }: UpdateTenantStorageOptions): Promise<void>;
32
+ getTenantsWithOutdatedStorage(): Promise<TenantRecord[]>;
33
+ private _getTenantAgent;
34
+ }
35
+ //#endregion
36
+ export { TenantsApi };
37
+ //# sourceMappingURL=TenantsApi.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TenantsApi.d.mts","names":[],"sources":["../src/TenantsApi.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;cAsBa,gCAAgC,aAAa;6BACtB;;EADvB,QAAA,oBAAU;EAAsB,QAAA,MAAA;EAAa,WAAA,CAAA,mBAAA,EAOjC,mBAPiC,EAAA,gBAAA,EAQpC,YARoC,EAAA,oBAAA,EASe,0BATf,EAAA,MAAA,EAUb,MAVa;EACtB,cAAA,CAAA;IAAA;EAAA,CAAA,EAiBQ,qBAjBR,CAAA,EAiBgC,OAjBhC,CAiBwC,WAjBxC,CAiBoD,YAjBpD,CAAA,CAAA;EAMX,eAAA,CAAA,WAAA,CAAA,CAAA,OAAA,EAgBZ,qBAhBY,EAAA,uBAAA,EAiBI,uBAjBJ,CAiB4B,YAjB5B,EAiB0C,WAjB1C,CAAA,CAAA,EAkBpB,OAlBoB,CAkBZ,WAlBY,CAAA;EACH,YAAA,CAAA,OAAA,EAkCe,mBAlCf,CAAA,EAkCkC,OAlClC,CAkCkC,YAlClC,CAAA;EACmD,aAAA,CAAA,QAAA,EAAA,MAAA,CAAA,EAmD5B,OAnD4B,CAmD5B,YAnD4B,CAAA;EAC5B,kBAAA,CAAA,KAAA,EAAA,MAAA,CAAA,EAuDE,OAvDF,CAuDE,YAvDF,EAAA,CAAA;EAQb,gBAAA,CAAA,QAAA,EAAA,MAAA,CAAA,EAoDgB,OApDhB,CAAA,IAAA,CAAA;EAAY,YAAA,CAAA,MAAA,EAgER,YAhEQ,CAAA,EAgEI,OAhEJ,CAAA,IAAA,CAAA;EAA4C,kBAAA,CAAA,KAAA,EAoE/C,KApE+C,CAoEzC,YApEyC,CAAA,EAAA,YAAA,CAAA,EAoEX,YApEW,CAAA,EAoEC,OApED,CAoEC,YApED,EAAA,CAAA;EAAZ,aAAA,CAAA,CAAA,EAwEhD,OAxEgD,CAwEhD,YAxEgD,EAAA,CAAA;EAAR,mBAAA,CAAA;IAAA,QAAA;IAAA;EAAA,CAAA,EA6EJ,0BA7EI,CAAA,EA6EsB,OA7EtB,CAAA,IAAA,CAAA;EAKvD,6BAAA,CAAA,CAAA,EAoF+B,OApF/B,CAoF+B,YApF/B,EAAA,CAAA;EACwC,QAAA,eAAA"}
@@ -0,0 +1,107 @@
1
+ import { __decorateMetadata } from "./_virtual/_@oxc-project_runtime@0.99.0/helpers/decorateMetadata.mjs";
2
+ import { __decorateParam } from "./_virtual/_@oxc-project_runtime@0.99.0/helpers/decorateParam.mjs";
3
+ import { __decorate } from "./_virtual/_@oxc-project_runtime@0.99.0/helpers/decorate.mjs";
4
+ import { TenantAgent } from "./TenantAgent.mjs";
5
+ import { TenantRecordService } from "./services/TenantRecordService.mjs";
6
+ import "./services/index.mjs";
7
+ import { TenantAgentContextProvider } from "./context/TenantAgentContextProvider.mjs";
8
+ import { AgentContext, InjectionSymbols, UpdateAssistant, inject, injectable, isStorageUpToDate } from "@credo-ts/core";
9
+
10
+ //#region src/TenantsApi.ts
11
+ var _ref, _ref2, _ref3;
12
+ let TenantsApi = class TenantsApi$1 {
13
+ constructor(tenantRecordService, rootAgentContext, agentContextProvider, logger) {
14
+ this.tenantRecordService = tenantRecordService;
15
+ this.rootAgentContext = rootAgentContext;
16
+ this.agentContextProvider = agentContextProvider;
17
+ this.logger = logger;
18
+ }
19
+ async getTenantAgent({ tenantId }) {
20
+ return this._getTenantAgent({ tenantId });
21
+ }
22
+ async withTenantAgent(options, withTenantAgentCallback) {
23
+ this.logger.debug(`Getting tenant agent for tenant '${options.tenantId}' in with tenant agent callback`);
24
+ const tenantAgent = await this.getTenantAgent(options);
25
+ try {
26
+ this.logger.debug(`Calling tenant agent callback for tenant '${options.tenantId}'`);
27
+ return await withTenantAgentCallback(tenantAgent);
28
+ } catch (error) {
29
+ this.logger.error(`Error in tenant agent callback for tenant '${options.tenantId}'`, { error });
30
+ throw error;
31
+ } finally {
32
+ this.logger.debug(`Ending tenant agent session for tenant '${options.tenantId}'`);
33
+ await tenantAgent.endSession();
34
+ }
35
+ }
36
+ async createTenant(options) {
37
+ this.logger.debug("Creating tenant");
38
+ const tenantRecord = await this.tenantRecordService.createTenant(this.rootAgentContext, options.config);
39
+ await (await this._getTenantAgent({
40
+ tenantId: tenantRecord.id,
41
+ provisionContext: true
42
+ })).endSession();
43
+ this.logger.info(`Successfully created tenant '${tenantRecord.id}'`);
44
+ return tenantRecord;
45
+ }
46
+ async getTenantById(tenantId) {
47
+ this.logger.debug(`Getting tenant by id '${tenantId}'`);
48
+ return this.tenantRecordService.getTenantById(this.rootAgentContext, tenantId);
49
+ }
50
+ async findTenantsByLabel(label) {
51
+ this.logger.debug(`Finding tenants by label '${label}'`);
52
+ return this.tenantRecordService.findTenantsByLabel(this.rootAgentContext, label);
53
+ }
54
+ async deleteTenantById(tenantId) {
55
+ this.logger.debug(`Deleting tenant by id '${tenantId}'`);
56
+ const tenantAgent = await this.getTenantAgent({ tenantId });
57
+ this.logger.trace(`Deleting wallet for tenant '${tenantId}'`);
58
+ await this.agentContextProvider.deleteAgentContext(tenantAgent.context);
59
+ return this.tenantRecordService.deleteTenantById(this.rootAgentContext, tenantId);
60
+ }
61
+ async updateTenant(tenant) {
62
+ await this.tenantRecordService.updateTenant(this.rootAgentContext, tenant);
63
+ }
64
+ async findTenantsByQuery(query, queryOptions) {
65
+ return this.tenantRecordService.findTenantsByQuery(this.rootAgentContext, query, queryOptions);
66
+ }
67
+ async getAllTenants() {
68
+ this.logger.debug("Getting all tenants");
69
+ return this.tenantRecordService.getAllTenants(this.rootAgentContext);
70
+ }
71
+ async updateTenantStorage({ tenantId, updateOptions }) {
72
+ this.logger.debug(`Updating tenant storage for tenant '${tenantId}'`);
73
+ const tenantRecord = await this.tenantRecordService.getTenantById(this.rootAgentContext, tenantId);
74
+ if (isStorageUpToDate(tenantRecord.storageVersion)) {
75
+ this.logger.debug(`Tenant storage for tenant '${tenantId}' is already up to date. Skipping update`);
76
+ return;
77
+ }
78
+ await this.agentContextProvider.updateTenantStorage(tenantRecord, updateOptions);
79
+ }
80
+ async getTenantsWithOutdatedStorage() {
81
+ return await this.tenantRecordService.findTenantsByQuery(this.rootAgentContext, { $not: { storageVersion: UpdateAssistant.frameworkStorageVersion } });
82
+ }
83
+ async _getTenantAgent({ tenantId, provisionContext = false }) {
84
+ this.logger.debug(`Getting tenant agent for tenant '${tenantId}'`);
85
+ const tenantContext = await this.agentContextProvider.getAgentContextForContextCorrelationId(this.agentContextProvider.getContextCorrelationIdForTenantId(tenantId), { provisionContext });
86
+ this.logger.trace(`Got tenant context for tenant '${tenantId}'`);
87
+ const tenantAgent = new TenantAgent(tenantContext);
88
+ await tenantAgent.initialize();
89
+ this.logger.trace(`Initializing tenant agent for tenant '${tenantId}'`);
90
+ return tenantAgent;
91
+ }
92
+ };
93
+ TenantsApi = __decorate([
94
+ injectable(),
95
+ __decorateParam(2, inject(InjectionSymbols.AgentContextProvider)),
96
+ __decorateParam(3, inject(InjectionSymbols.Logger)),
97
+ __decorateMetadata("design:paramtypes", [
98
+ typeof (_ref = typeof TenantRecordService !== "undefined" && TenantRecordService) === "function" ? _ref : Object,
99
+ typeof (_ref2 = typeof AgentContext !== "undefined" && AgentContext) === "function" ? _ref2 : Object,
100
+ typeof (_ref3 = typeof TenantAgentContextProvider !== "undefined" && TenantAgentContextProvider) === "function" ? _ref3 : Object,
101
+ Object
102
+ ])
103
+ ], TenantsApi);
104
+
105
+ //#endregion
106
+ export { TenantsApi };
107
+ //# sourceMappingURL=TenantsApi.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TenantsApi.mjs","names":["TenantsApi","agentContextProvider: TenantAgentContextProvider","logger: Logger"],"sources":["../src/TenantsApi.ts"],"sourcesContent":["import type { DefaultAgentModules, ModulesMap, Query, QueryOptions } from '@credo-ts/core'\nimport {\n AgentContext,\n InjectionSymbols,\n inject,\n injectable,\n isStorageUpToDate,\n type Logger,\n UpdateAssistant,\n} from '@credo-ts/core'\nimport { TenantAgentContextProvider } from './context/TenantAgentContextProvider'\nimport type { TenantRecord } from './repository'\nimport { TenantRecordService } from './services'\nimport { TenantAgent } from './TenantAgent'\nimport type {\n CreateTenantOptions,\n GetTenantAgentOptions,\n UpdateTenantStorageOptions,\n WithTenantAgentCallback,\n} from './TenantsApiOptions'\n\n@injectable()\nexport class TenantsApi<AgentModules extends ModulesMap = DefaultAgentModules> {\n public readonly rootAgentContext: AgentContext\n private tenantRecordService: TenantRecordService\n private agentContextProvider: TenantAgentContextProvider\n private logger: Logger\n\n public constructor(\n tenantRecordService: TenantRecordService,\n rootAgentContext: AgentContext,\n @inject(InjectionSymbols.AgentContextProvider) agentContextProvider: TenantAgentContextProvider,\n @inject(InjectionSymbols.Logger) logger: Logger\n ) {\n this.tenantRecordService = tenantRecordService\n this.rootAgentContext = rootAgentContext\n this.agentContextProvider = agentContextProvider\n this.logger = logger\n }\n\n public async getTenantAgent({ tenantId }: GetTenantAgentOptions): Promise<TenantAgent<AgentModules>> {\n return this._getTenantAgent({ tenantId })\n }\n\n public async withTenantAgent<ReturnValue>(\n options: GetTenantAgentOptions,\n withTenantAgentCallback: WithTenantAgentCallback<AgentModules, ReturnValue>\n ): Promise<ReturnValue> {\n this.logger.debug(`Getting tenant agent for tenant '${options.tenantId}' in with tenant agent callback`)\n const tenantAgent = await this.getTenantAgent(options)\n\n try {\n this.logger.debug(`Calling tenant agent callback for tenant '${options.tenantId}'`)\n const result = await withTenantAgentCallback(tenantAgent)\n return result\n } catch (error) {\n this.logger.error(`Error in tenant agent callback for tenant '${options.tenantId}'`, { error })\n throw error\n } finally {\n this.logger.debug(`Ending tenant agent session for tenant '${options.tenantId}'`)\n await tenantAgent.endSession()\n }\n }\n\n public async createTenant(options: CreateTenantOptions) {\n this.logger.debug('Creating tenant')\n\n const tenantRecord = await this.tenantRecordService.createTenant(this.rootAgentContext, options.config)\n\n // This initializes the tenant agent, creates the wallet etc...\n const tenantAgent = await this._getTenantAgent({\n tenantId: tenantRecord.id,\n // When creating a tenant we need to provision the context\n provisionContext: true,\n })\n await tenantAgent.endSession()\n\n this.logger.info(`Successfully created tenant '${tenantRecord.id}'`)\n\n return tenantRecord\n }\n\n public async getTenantById(tenantId: string) {\n this.logger.debug(`Getting tenant by id '${tenantId}'`)\n return this.tenantRecordService.getTenantById(this.rootAgentContext, tenantId)\n }\n\n public async findTenantsByLabel(label: string) {\n this.logger.debug(`Finding tenants by label '${label}'`)\n return this.tenantRecordService.findTenantsByLabel(this.rootAgentContext, label)\n }\n\n public async deleteTenantById(tenantId: string) {\n this.logger.debug(`Deleting tenant by id '${tenantId}'`)\n const tenantAgent = await this.getTenantAgent({ tenantId })\n\n this.logger.trace(`Deleting wallet for tenant '${tenantId}'`)\n\n // Deleting agent context will also end the session since there is no session anymore if the agent context is deleted\n await this.agentContextProvider.deleteAgentContext(tenantAgent.context)\n\n return this.tenantRecordService.deleteTenantById(this.rootAgentContext, tenantId)\n }\n\n public async updateTenant(tenant: TenantRecord) {\n await this.tenantRecordService.updateTenant(this.rootAgentContext, tenant)\n }\n\n public async findTenantsByQuery(query: Query<TenantRecord>, queryOptions?: QueryOptions) {\n return this.tenantRecordService.findTenantsByQuery(this.rootAgentContext, query, queryOptions)\n }\n\n public async getAllTenants() {\n this.logger.debug('Getting all tenants')\n return this.tenantRecordService.getAllTenants(this.rootAgentContext)\n }\n\n public async updateTenantStorage({ tenantId, updateOptions }: UpdateTenantStorageOptions) {\n this.logger.debug(`Updating tenant storage for tenant '${tenantId}'`)\n const tenantRecord = await this.tenantRecordService.getTenantById(this.rootAgentContext, tenantId)\n\n if (isStorageUpToDate(tenantRecord.storageVersion)) {\n this.logger.debug(`Tenant storage for tenant '${tenantId}' is already up to date. Skipping update`)\n return\n }\n\n await this.agentContextProvider.updateTenantStorage(tenantRecord, updateOptions)\n }\n\n public async getTenantsWithOutdatedStorage() {\n const outdatedTenants = await this.tenantRecordService.findTenantsByQuery(this.rootAgentContext, {\n $not: {\n storageVersion: UpdateAssistant.frameworkStorageVersion,\n },\n })\n\n return outdatedTenants\n }\n\n private async _getTenantAgent({\n tenantId,\n provisionContext = false,\n }: GetTenantAgentOptions & { provisionContext?: boolean }): Promise<TenantAgent<AgentModules>> {\n this.logger.debug(`Getting tenant agent for tenant '${tenantId}'`)\n const tenantContext = await this.agentContextProvider.getAgentContextForContextCorrelationId(\n this.agentContextProvider.getContextCorrelationIdForTenantId(tenantId),\n { provisionContext }\n )\n\n this.logger.trace(`Got tenant context for tenant '${tenantId}'`)\n const tenantAgent = new TenantAgent<AgentModules>(tenantContext)\n\n await tenantAgent.initialize()\n this.logger.trace(`Initializing tenant agent for tenant '${tenantId}'`)\n\n return tenantAgent\n }\n}\n"],"mappings":";;;;;;;;;;;AAsBO,uBAAMA,aAAkE;CAM7E,AAAO,YACL,qBACA,kBACA,AAA+CC,sBAC/C,AAAiCC,QACjC;AACA,OAAK,sBAAsB;AAC3B,OAAK,mBAAmB;AACxB,OAAK,uBAAuB;AAC5B,OAAK,SAAS;;CAGhB,MAAa,eAAe,EAAE,YAAuE;AACnG,SAAO,KAAK,gBAAgB,EAAE,UAAU,CAAC;;CAG3C,MAAa,gBACX,SACA,yBACsB;AACtB,OAAK,OAAO,MAAM,oCAAoC,QAAQ,SAAS,iCAAiC;EACxG,MAAM,cAAc,MAAM,KAAK,eAAe,QAAQ;AAEtD,MAAI;AACF,QAAK,OAAO,MAAM,6CAA6C,QAAQ,SAAS,GAAG;AAEnF,UADe,MAAM,wBAAwB,YAAY;WAElD,OAAO;AACd,QAAK,OAAO,MAAM,8CAA8C,QAAQ,SAAS,IAAI,EAAE,OAAO,CAAC;AAC/F,SAAM;YACE;AACR,QAAK,OAAO,MAAM,2CAA2C,QAAQ,SAAS,GAAG;AACjF,SAAM,YAAY,YAAY;;;CAIlC,MAAa,aAAa,SAA8B;AACtD,OAAK,OAAO,MAAM,kBAAkB;EAEpC,MAAM,eAAe,MAAM,KAAK,oBAAoB,aAAa,KAAK,kBAAkB,QAAQ,OAAO;AAQvG,SALoB,MAAM,KAAK,gBAAgB;GAC7C,UAAU,aAAa;GAEvB,kBAAkB;GACnB,CAAC,EACgB,YAAY;AAE9B,OAAK,OAAO,KAAK,gCAAgC,aAAa,GAAG,GAAG;AAEpE,SAAO;;CAGT,MAAa,cAAc,UAAkB;AAC3C,OAAK,OAAO,MAAM,yBAAyB,SAAS,GAAG;AACvD,SAAO,KAAK,oBAAoB,cAAc,KAAK,kBAAkB,SAAS;;CAGhF,MAAa,mBAAmB,OAAe;AAC7C,OAAK,OAAO,MAAM,6BAA6B,MAAM,GAAG;AACxD,SAAO,KAAK,oBAAoB,mBAAmB,KAAK,kBAAkB,MAAM;;CAGlF,MAAa,iBAAiB,UAAkB;AAC9C,OAAK,OAAO,MAAM,0BAA0B,SAAS,GAAG;EACxD,MAAM,cAAc,MAAM,KAAK,eAAe,EAAE,UAAU,CAAC;AAE3D,OAAK,OAAO,MAAM,+BAA+B,SAAS,GAAG;AAG7D,QAAM,KAAK,qBAAqB,mBAAmB,YAAY,QAAQ;AAEvE,SAAO,KAAK,oBAAoB,iBAAiB,KAAK,kBAAkB,SAAS;;CAGnF,MAAa,aAAa,QAAsB;AAC9C,QAAM,KAAK,oBAAoB,aAAa,KAAK,kBAAkB,OAAO;;CAG5E,MAAa,mBAAmB,OAA4B,cAA6B;AACvF,SAAO,KAAK,oBAAoB,mBAAmB,KAAK,kBAAkB,OAAO,aAAa;;CAGhG,MAAa,gBAAgB;AAC3B,OAAK,OAAO,MAAM,sBAAsB;AACxC,SAAO,KAAK,oBAAoB,cAAc,KAAK,iBAAiB;;CAGtE,MAAa,oBAAoB,EAAE,UAAU,iBAA6C;AACxF,OAAK,OAAO,MAAM,uCAAuC,SAAS,GAAG;EACrE,MAAM,eAAe,MAAM,KAAK,oBAAoB,cAAc,KAAK,kBAAkB,SAAS;AAElG,MAAI,kBAAkB,aAAa,eAAe,EAAE;AAClD,QAAK,OAAO,MAAM,8BAA8B,SAAS,0CAA0C;AACnG;;AAGF,QAAM,KAAK,qBAAqB,oBAAoB,cAAc,cAAc;;CAGlF,MAAa,gCAAgC;AAO3C,SANwB,MAAM,KAAK,oBAAoB,mBAAmB,KAAK,kBAAkB,EAC/F,MAAM,EACJ,gBAAgB,gBAAgB,yBACjC,EACF,CAAC;;CAKJ,MAAc,gBAAgB,EAC5B,UACA,mBAAmB,SAC0E;AAC7F,OAAK,OAAO,MAAM,oCAAoC,SAAS,GAAG;EAClE,MAAM,gBAAgB,MAAM,KAAK,qBAAqB,uCACpD,KAAK,qBAAqB,mCAAmC,SAAS,EACtE,EAAE,kBAAkB,CACrB;AAED,OAAK,OAAO,MAAM,kCAAkC,SAAS,GAAG;EAChE,MAAM,cAAc,IAAI,YAA0B,cAAc;AAEhE,QAAM,YAAY,YAAY;AAC9B,OAAK,OAAO,MAAM,yCAAyC,SAAS,GAAG;AAEvE,SAAO;;;;CAtIV,YAAY;oBAUR,OAAO,iBAAiB,qBAAqB;oBAC7C,OAAO,iBAAiB,OAAO"}
@@ -0,0 +1,19 @@
1
+ import { TenantConfig } from "./models/TenantConfig.mjs";
2
+ import { TenantAgent } from "./TenantAgent.mjs";
3
+ import { ModulesMap, UpdateAssistantUpdateOptions } from "@credo-ts/core";
4
+
5
+ //#region src/TenantsApiOptions.d.ts
6
+ interface GetTenantAgentOptions {
7
+ tenantId: string;
8
+ }
9
+ type WithTenantAgentCallback<AgentModules extends ModulesMap, Return> = (tenantAgent: TenantAgent<AgentModules>) => Promise<Return>;
10
+ interface CreateTenantOptions {
11
+ config: TenantConfig;
12
+ }
13
+ interface UpdateTenantStorageOptions {
14
+ tenantId: string;
15
+ updateOptions?: UpdateAssistantUpdateOptions;
16
+ }
17
+ //#endregion
18
+ export { CreateTenantOptions, GetTenantAgentOptions, UpdateTenantStorageOptions, WithTenantAgentCallback };
19
+ //# sourceMappingURL=TenantsApiOptions.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TenantsApiOptions.d.mts","names":[],"sources":["../src/TenantsApiOptions.ts"],"sourcesContent":[],"mappings":";;;;;UAIiB,qBAAA;;AAAjB;AAIY,KAAA,uBAAuB,CAAA,qBAAsB,UAAtB,EAAA,MAAA,CAAA,GAAA,CAAA,WAAA,EACpB,WADoB,CACR,YADQ,CAAA,EAAA,GAE9B,OAF8B,CAEtB,MAFsB,CAAA;AAAsB,UAIxC,mBAAA,CAJwC;EAC9B,MAAA,EAIjB,YAJiB;;AACd,UAMI,0BAAA,CANJ;EAAR,QAAA,EAAA,MAAA;EAAO,aAAA,CAAA,EAQM,4BARN;AAEZ"}
@@ -0,0 +1,23 @@
1
+ import { TenantsModuleConfig, TenantsModuleConfigOptions } from "./TenantsModuleConfig.mjs";
2
+ import { TenantsApi } from "./TenantsApi.mjs";
3
+ import { updateTenantsModuleV0_4ToV0_5 } from "./updates/0.4-0.5/index.mjs";
4
+ import { Constructor, DependencyManager, EmptyModuleMap, Module, ModulesMap } from "@credo-ts/core";
5
+
6
+ //#region src/TenantsModule.d.ts
7
+ declare class TenantsModule<AgentModules extends ModulesMap = EmptyModuleMap> implements Module {
8
+ readonly config: TenantsModuleConfig;
9
+ readonly api: Constructor<TenantsApi<AgentModules>>;
10
+ constructor(config?: TenantsModuleConfigOptions);
11
+ /**
12
+ * Registers the dependencies of the tenants module on the dependency manager.
13
+ */
14
+ register(dependencyManager: DependencyManager): void;
15
+ updates: {
16
+ fromVersion: "0.4";
17
+ toVersion: "0.5";
18
+ doUpdate: typeof updateTenantsModuleV0_4ToV0_5;
19
+ }[];
20
+ }
21
+ //#endregion
22
+ export { TenantsModule };
23
+ //# sourceMappingURL=TenantsModule.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TenantsModule.d.mts","names":[],"sources":["../src/TenantsModule.ts"],"sourcesContent":[],"mappings":";;;;;;cAWa,mCAAmC,aAAa,2BAA2B;EAA3E,SAAA,MAAA,EACa,mBADA;EAAsB,SAAA,GAAA,EAGzB,WAHyB,CAGb,UAHa,CAGF,YAHE,CAAA,CAAA;EAAa,WAAA,CAAA,MAAA,CAAA,EAK/B,0BAL+B;EACnC;;;EAEH,QAAA,CAAA,iBAAA,EASc,iBATd,CAAA,EAAA,IAAA;EAEO,OAAA,EAAA;IAOO,WAAA,EAAA,KAAA;;IAZmD,QAAA,EAAA,oCAAA;EAAM,CAAA,EAAA"}
@@ -0,0 +1,40 @@
1
+ import { TenantRepository } from "./repository/TenantRepository.mjs";
2
+ import { TenantRoutingRepository } from "./repository/TenantRoutingRepository.mjs";
3
+ import "./repository/index.mjs";
4
+ import { TenantRecordService } from "./services/TenantRecordService.mjs";
5
+ import "./services/index.mjs";
6
+ import { TenantsModuleConfig } from "./TenantsModuleConfig.mjs";
7
+ import { TenantSessionCoordinator } from "./context/TenantSessionCoordinator.mjs";
8
+ import { TenantAgentContextProvider } from "./context/TenantAgentContextProvider.mjs";
9
+ import { TenantsApi } from "./TenantsApi.mjs";
10
+ import { updateTenantsModuleV0_4ToV0_5 } from "./updates/0.4-0.5/index.mjs";
11
+ import { InjectionSymbols } from "@credo-ts/core";
12
+
13
+ //#region src/TenantsModule.ts
14
+ var TenantsModule = class {
15
+ constructor(config) {
16
+ this.api = TenantsApi;
17
+ this.updates = [{
18
+ fromVersion: "0.4",
19
+ toVersion: "0.5",
20
+ doUpdate: updateTenantsModuleV0_4ToV0_5
21
+ }];
22
+ this.config = new TenantsModuleConfig(config);
23
+ }
24
+ /**
25
+ * Registers the dependencies of the tenants module on the dependency manager.
26
+ */
27
+ register(dependencyManager) {
28
+ dependencyManager.registerSingleton(TenantsApi);
29
+ dependencyManager.registerInstance(TenantsModuleConfig, this.config);
30
+ dependencyManager.registerSingleton(TenantRecordService);
31
+ dependencyManager.registerSingleton(TenantRepository);
32
+ dependencyManager.registerSingleton(TenantRoutingRepository);
33
+ dependencyManager.registerSingleton(InjectionSymbols.AgentContextProvider, TenantAgentContextProvider);
34
+ dependencyManager.registerSingleton(TenantSessionCoordinator);
35
+ }
36
+ };
37
+
38
+ //#endregion
39
+ export { TenantsModule };
40
+ //# sourceMappingURL=TenantsModule.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TenantsModule.mjs","names":[],"sources":["../src/TenantsModule.ts"],"sourcesContent":["import type { Constructor, DependencyManager, EmptyModuleMap, Module, ModulesMap, Update } from '@credo-ts/core'\nimport { InjectionSymbols } from '@credo-ts/core'\nimport { TenantAgentContextProvider } from './context/TenantAgentContextProvider'\nimport { TenantSessionCoordinator } from './context/TenantSessionCoordinator'\nimport { TenantRepository, TenantRoutingRepository } from './repository'\nimport { TenantRecordService } from './services'\nimport { TenantsApi } from './TenantsApi'\nimport type { TenantsModuleConfigOptions } from './TenantsModuleConfig'\nimport { TenantsModuleConfig } from './TenantsModuleConfig'\nimport { updateTenantsModuleV0_4ToV0_5 } from './updates/0.4-0.5'\n\nexport class TenantsModule<AgentModules extends ModulesMap = EmptyModuleMap> implements Module {\n public readonly config: TenantsModuleConfig\n\n public readonly api: Constructor<TenantsApi<AgentModules>> = TenantsApi\n\n public constructor(config?: TenantsModuleConfigOptions) {\n this.config = new TenantsModuleConfig(config)\n }\n\n /**\n * Registers the dependencies of the tenants module on the dependency manager.\n */\n public register(dependencyManager: DependencyManager) {\n // Api\n // NOTE: this is a singleton because tenants can't have their own tenants. This makes sure the tenants api is always used in the root agent context.\n dependencyManager.registerSingleton(TenantsApi)\n\n // Config\n dependencyManager.registerInstance(TenantsModuleConfig, this.config)\n\n // Services\n dependencyManager.registerSingleton(TenantRecordService)\n\n // Repositories\n dependencyManager.registerSingleton(TenantRepository)\n dependencyManager.registerSingleton(TenantRoutingRepository)\n\n dependencyManager.registerSingleton(InjectionSymbols.AgentContextProvider, TenantAgentContextProvider)\n dependencyManager.registerSingleton(TenantSessionCoordinator)\n }\n\n public updates = [\n {\n fromVersion: '0.4',\n toVersion: '0.5',\n doUpdate: updateTenantsModuleV0_4ToV0_5,\n },\n ] satisfies Update[]\n}\n"],"mappings":";;;;;;;;;;;;;AAWA,IAAa,gBAAb,MAA+F;CAK7F,AAAO,YAAY,QAAqC;OAFxC,MAA6C;OA4BtD,UAAU,CACf;GACE,aAAa;GACb,WAAW;GACX,UAAU;GACX,CACF;AA/BC,OAAK,SAAS,IAAI,oBAAoB,OAAO;;;;;CAM/C,AAAO,SAAS,mBAAsC;AAGpD,oBAAkB,kBAAkB,WAAW;AAG/C,oBAAkB,iBAAiB,qBAAqB,KAAK,OAAO;AAGpE,oBAAkB,kBAAkB,oBAAoB;AAGxD,oBAAkB,kBAAkB,iBAAiB;AACrD,oBAAkB,kBAAkB,wBAAwB;AAE5D,oBAAkB,kBAAkB,iBAAiB,sBAAsB,2BAA2B;AACtG,oBAAkB,kBAAkB,yBAAyB"}
@@ -0,0 +1,35 @@
1
+ //#region src/TenantsModuleConfig.d.ts
2
+ /**
3
+ * TenantsModuleConfigOptions defines the interface for the options of the TenantsModuleConfig class.
4
+ * This can contain optional parameters that have default values in the config class itself.
5
+ */
6
+ interface TenantsModuleConfigOptions {
7
+ /**
8
+ * Maximum number of concurrent tenant sessions that can be active at the same time. Defaults to
9
+ * 100 concurrent sessions. The default is low on purpose, to make sure deployments determine their own
10
+ * session limit based on the hardware and usage of the tenants module. Use `Infinity` to allow unlimited
11
+ * concurrent sessions.
12
+ *
13
+ * @default 100
14
+ */
15
+ sessionLimit?: number;
16
+ /**
17
+ * Timeout in milliseconds for acquiring a tenant session. If the {@link TenantsModuleConfigOptions.maxNumberOfSessions} is reached and
18
+ * a tenant sessions couldn't be acquired within the specified timeout, an error will be thrown and the session creation will be aborted.
19
+ * Use `Infinity` to disable the timeout.
20
+ *
21
+ * @default 1000
22
+ */
23
+ sessionAcquireTimeout?: number;
24
+ }
25
+ declare class TenantsModuleConfig {
26
+ private options;
27
+ constructor(options?: TenantsModuleConfigOptions);
28
+ /** See {@link TenantsModuleConfigOptions.sessionLimit} */
29
+ get sessionLimit(): number;
30
+ /** See {@link TenantsModuleConfigOptions.sessionAcquireTimeout} */
31
+ get sessionAcquireTimeout(): number;
32
+ }
33
+ //#endregion
34
+ export { TenantsModuleConfig, TenantsModuleConfigOptions };
35
+ //# sourceMappingURL=TenantsModuleConfig.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TenantsModuleConfig.d.mts","names":[],"sources":["../src/TenantsModuleConfig.ts"],"sourcesContent":[],"mappings":";;AAIA;AAqBA;;UArBiB,0BAAA;;;;;;;;;;;;;;;;;;;cAqBJ,mBAAA;;wBAGkB"}
@@ -0,0 +1,18 @@
1
+ //#region src/TenantsModuleConfig.ts
2
+ var TenantsModuleConfig = class {
3
+ constructor(options) {
4
+ this.options = options ?? {};
5
+ }
6
+ /** See {@link TenantsModuleConfigOptions.sessionLimit} */
7
+ get sessionLimit() {
8
+ return this.options.sessionLimit ?? 100;
9
+ }
10
+ /** See {@link TenantsModuleConfigOptions.sessionAcquireTimeout} */
11
+ get sessionAcquireTimeout() {
12
+ return this.options.sessionAcquireTimeout ?? 1e3;
13
+ }
14
+ };
15
+
16
+ //#endregion
17
+ export { TenantsModuleConfig };
18
+ //# sourceMappingURL=TenantsModuleConfig.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TenantsModuleConfig.mjs","names":[],"sources":["../src/TenantsModuleConfig.ts"],"sourcesContent":["/**\n * TenantsModuleConfigOptions defines the interface for the options of the TenantsModuleConfig class.\n * This can contain optional parameters that have default values in the config class itself.\n */\nexport interface TenantsModuleConfigOptions {\n /**\n * Maximum number of concurrent tenant sessions that can be active at the same time. Defaults to\n * 100 concurrent sessions. The default is low on purpose, to make sure deployments determine their own\n * session limit based on the hardware and usage of the tenants module. Use `Infinity` to allow unlimited\n * concurrent sessions.\n *\n * @default 100\n */\n sessionLimit?: number\n\n /**\n * Timeout in milliseconds for acquiring a tenant session. If the {@link TenantsModuleConfigOptions.maxNumberOfSessions} is reached and\n * a tenant sessions couldn't be acquired within the specified timeout, an error will be thrown and the session creation will be aborted.\n * Use `Infinity` to disable the timeout.\n *\n * @default 1000\n */\n sessionAcquireTimeout?: number\n}\n\nexport class TenantsModuleConfig {\n private options: TenantsModuleConfigOptions\n\n public constructor(options?: TenantsModuleConfigOptions) {\n this.options = options ?? {}\n }\n\n /** See {@link TenantsModuleConfigOptions.sessionLimit} */\n public get sessionLimit(): number {\n return this.options.sessionLimit ?? 100\n }\n\n /** See {@link TenantsModuleConfigOptions.sessionAcquireTimeout} */\n public get sessionAcquireTimeout(): number {\n return this.options.sessionAcquireTimeout ?? 1000\n }\n}\n"],"mappings":";AAyBA,IAAa,sBAAb,MAAiC;CAG/B,AAAO,YAAY,SAAsC;AACvD,OAAK,UAAU,WAAW,EAAE;;;CAI9B,IAAW,eAAuB;AAChC,SAAO,KAAK,QAAQ,gBAAgB;;;CAItC,IAAW,wBAAgC;AACzC,SAAO,KAAK,QAAQ,yBAAyB"}
@@ -0,0 +1,10 @@
1
+ //#region \0@oxc-project+runtime@0.99.0/helpers/decorate.js
2
+ function __decorate(decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ }
8
+
9
+ //#endregion
10
+ export { __decorate };
@@ -0,0 +1,7 @@
1
+ //#region \0@oxc-project+runtime@0.99.0/helpers/decorateMetadata.js
2
+ function __decorateMetadata(k, v) {
3
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
4
+ }
5
+
6
+ //#endregion
7
+ export { __decorateMetadata };
@@ -0,0 +1,9 @@
1
+ //#region \0@oxc-project+runtime@0.99.0/helpers/decorateParam.js
2
+ function __decorateParam(paramIndex, decorator) {
3
+ return function(target, key) {
4
+ decorator(target, key, paramIndex);
5
+ };
6
+ }
7
+
8
+ //#endregion
9
+ export { __decorateParam };
@@ -0,0 +1,52 @@
1
+ import { TenantRecord } from "../repository/TenantRecord.mjs";
2
+ import "../repository/index.mjs";
3
+ import { TenantRecordService } from "../services/TenantRecordService.mjs";
4
+ import "../services/index.mjs";
5
+ import { TenantSessionCoordinator } from "./TenantSessionCoordinator.mjs";
6
+ import { AgentContext, AgentContextProvider, EventEmitter, Logger, UpdateAssistantUpdateOptions } from "@credo-ts/core";
7
+
8
+ //#region src/context/TenantAgentContextProvider.d.ts
9
+ declare class TenantAgentContextProvider implements AgentContextProvider {
10
+ private tenantRecordService;
11
+ private rootAgentContext;
12
+ private eventEmitter;
13
+ private logger;
14
+ private tenantSessionCoordinator;
15
+ constructor(tenantRecordService: TenantRecordService, rootAgentContext: AgentContext, eventEmitter: EventEmitter, tenantSessionCoordinator: TenantSessionCoordinator, logger: Logger);
16
+ getContextCorrelationIdForTenantId(tenantId: string): `tenant-${string}`;
17
+ getAgentContextForContextCorrelationId(contextCorrelationId: string, {
18
+ provisionContext
19
+ }?: {
20
+ provisionContext?: boolean;
21
+ }): Promise<AgentContext>;
22
+ getContextForInboundMessage(inboundMessage: unknown, options?: {
23
+ contextCorrelationId?: string;
24
+ }): Promise<AgentContext>;
25
+ endSessionForAgentContext(agentContext: AgentContext): Promise<void>;
26
+ deleteAgentContext(agentContext: AgentContext): Promise<void>;
27
+ private getRecipientKeysFromEncryptedMessage;
28
+ private registerRecipientKeyForTenant;
29
+ private listenForRoutingKeyCreatedEvents;
30
+ /**
31
+ * Method to allow updating the tenant storage, this method can be called from the TenantsApi
32
+ * to update the storage for a tenant manually
33
+ */
34
+ updateTenantStorage(tenantRecord: TenantRecord, updateOptions?: UpdateAssistantUpdateOptions): Promise<void>;
35
+ /**
36
+ * Handle the case where the tenant storage is outdated. If auto-update is disabled we will throw an error
37
+ * and not update the storage. If auto-update is enabled we will update the storage.
38
+ *
39
+ * When this method is called we can be sure that we are in the mutex runExclusive lock and thus other sessions
40
+ * will not be able to open a session for this tenant until we're done.
41
+ *
42
+ * NOTE: We don't support multi-instance locking for now. That means you can only have a single instance open and
43
+ * it will prevent multiple processes from updating the tenant storage at the same time. However if multi-instances
44
+ * are used, we can't prevent multiple instances from updating the tenant storage at the same time.
45
+ * In the future we can make the tenantSessionCoordinator an interface and allowing a instance-tenant-lock as well
46
+ * as an tenant-lock (across all instances)
47
+ */
48
+ private _updateTenantStorage;
49
+ }
50
+ //#endregion
51
+ export { TenantAgentContextProvider };
52
+ //# sourceMappingURL=TenantAgentContextProvider.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TenantAgentContextProvider.d.mts","names":[],"sources":["../../src/context/TenantAgentContextProvider.ts"],"sourcesContent":[],"mappings":";;;;;;;;cA0Ba,0BAAA,YAAsC;;;;EAAtC,QAAA,MAAA;EAQY,QAAA,wBAAA;EACH,WAAA,CAAA,mBAAA,EADG,mBACH,EAAA,gBAAA,EAAA,YAAA,EAAA,YAAA,EACJ,YADI,EAAA,wBAAA,EAEQ,wBAFR,EAAA,MAAA,EAGuB,MAHvB;EACJ,kCAAA,CAAA,QAAA,EAAA,MAAA,CAAA,EAAA,UAAA,MAAA,EAAA;EACY,sCAAA,CAAA,oBAAA,EAAA,MAAA,EAAA;IAAA;EAmBxB,CAAA,CAnBwB,EAAA;IACe,gBAAA,CAAA,EAAA,OAAA;EAkBvC,CAAA,CAAA,EAA+D,OAA/D,CAA+D,YAA/D,CAAA;EAA+D,2BAAA,CAAA,cAAA,EAAA,OAAA,EAAA,OAgC0C,CAhC1C,EAAA;IAAA,oBAAA,CAAA,EAAA,MAAA;EAgC0C,CAAA,CAAA,EAAA,OAAA,CAAA,YAAA,CAAA;EAAA,yBAAA,CAAA,YAAA,EAoDxD,YApDwD,CAAA,EAoD5C,OApD4C,CAAA,IAAA,CAAA;EAoDxD,kBAAA,CAAA,YAAA,EAIP,YAJO,CAAA,EAIQ,OAJR,CAAA,IAAA,CAAA;EAAY,QAAA,oCAAA;EAInB,QAAA,6BAAA;EAAe,QAAA,gCAAA;EA2Dd;;;;EAjLsB,mBAAA,CAAA,YAAA,EAiLtB,YAjLsB,EAAA,aAAA,CAAA,EAiLQ,4BAjLR,CAAA,EAiLoC,OAjLpC,CAAA,IAAA,CAAA"}
@@ -0,0 +1,149 @@
1
+ import { __decorateMetadata } from "../_virtual/_@oxc-project_runtime@0.99.0/helpers/decorateMetadata.mjs";
2
+ import { __decorateParam } from "../_virtual/_@oxc-project_runtime@0.99.0/helpers/decorateParam.mjs";
3
+ import { __decorate } from "../_virtual/_@oxc-project_runtime@0.99.0/helpers/decorate.mjs";
4
+ import { TenantAgent } from "../TenantAgent.mjs";
5
+ import { TenantRecordService } from "../services/TenantRecordService.mjs";
6
+ import "../services/index.mjs";
7
+ import { TenantSessionCoordinator } from "./TenantSessionCoordinator.mjs";
8
+ import { AgentContext, CredoError, EventEmitter, InjectionSymbols, JsonEncoder, Kms, TypedArrayEncoder, UpdateAssistant, inject, injectable, isJsonObject, isStorageUpToDate } from "@credo-ts/core";
9
+ import { DidCommRoutingEventTypes, isValidJweStructure } from "@credo-ts/didcomm";
10
+
11
+ //#region src/context/TenantAgentContextProvider.ts
12
+ var _ref, _ref2, _ref3, _ref4;
13
+ let TenantAgentContextProvider = class TenantAgentContextProvider$1 {
14
+ constructor(tenantRecordService, rootAgentContext, eventEmitter, tenantSessionCoordinator, logger) {
15
+ this.tenantRecordService = tenantRecordService;
16
+ this.rootAgentContext = rootAgentContext;
17
+ this.eventEmitter = eventEmitter;
18
+ this.tenantSessionCoordinator = tenantSessionCoordinator;
19
+ this.logger = logger;
20
+ this.listenForRoutingKeyCreatedEvents();
21
+ }
22
+ getContextCorrelationIdForTenantId(tenantId) {
23
+ return this.tenantSessionCoordinator.getContextCorrelationIdForTenantId(tenantId);
24
+ }
25
+ async getAgentContextForContextCorrelationId(contextCorrelationId, { provisionContext = false } = {}) {
26
+ if (contextCorrelationId === this.rootAgentContext.contextCorrelationId) return this.rootAgentContext;
27
+ this.tenantSessionCoordinator.assertTenantContextCorrelationId(contextCorrelationId);
28
+ const tenantId = this.tenantSessionCoordinator.getTenantIdForContextCorrelationId(contextCorrelationId);
29
+ const tenantRecord = await this.tenantRecordService.getTenantById(this.rootAgentContext, tenantId);
30
+ const shouldUpdate = !isStorageUpToDate(tenantRecord.storageVersion);
31
+ if (shouldUpdate && !this.rootAgentContext.config.autoUpdateStorageOnStartup) throw new CredoError(`Current agent storage for tenant ${tenantRecord.id} is not up to date. To prevent the tenant state from getting corrupted the tenant initialization is aborted. Make sure to update the tenant storage (currently at ${tenantRecord.storageVersion}) to the latest version (${UpdateAssistant.frameworkStorageVersion}). You can also downgrade your version of Credo.`);
32
+ const agentContext = await this.tenantSessionCoordinator.getContextForSession(tenantRecord, {
33
+ provisionContext,
34
+ runInMutex: shouldUpdate ? (agentContext$1) => this._updateTenantStorage(tenantRecord, agentContext$1) : void 0
35
+ });
36
+ this.logger.debug(`Created tenant agent context for context correlation id '${contextCorrelationId}'`);
37
+ return agentContext;
38
+ }
39
+ async getContextForInboundMessage(inboundMessage, options) {
40
+ this.logger.debug("Getting context for inbound message in tenant agent context provider", { contextCorrelationId: options?.contextCorrelationId });
41
+ let tenantId = options?.contextCorrelationId && this.tenantSessionCoordinator.isTenantContextCorrelationId(options.contextCorrelationId) ? this.tenantSessionCoordinator.getTenantIdForContextCorrelationId(options.contextCorrelationId) : void 0;
42
+ let recipientKeys = [];
43
+ if (!tenantId && isValidJweStructure(inboundMessage)) {
44
+ this.logger.trace("Inbound message is a JWE, extracting tenant id from JWE's protected header");
45
+ recipientKeys = this.getRecipientKeysFromEncryptedMessage(inboundMessage);
46
+ this.logger.trace(`Found ${recipientKeys.length} recipient keys in JWE's protected header`);
47
+ for (const recipientKey of recipientKeys) {
48
+ const tenantRoutingRecord = await this.tenantRecordService.findTenantRoutingRecordByRecipientKey(this.rootAgentContext, recipientKey);
49
+ if (tenantRoutingRecord) {
50
+ this.logger.debug(`Found tenant routing record for recipient key ${recipientKeys[0].fingerprint}`, { tenantId: tenantRoutingRecord.tenantId });
51
+ tenantId = tenantRoutingRecord.tenantId;
52
+ break;
53
+ }
54
+ }
55
+ }
56
+ if (!tenantId) {
57
+ this.logger.error("Couldn't determine tenant id for inbound message. Unable to create context", {
58
+ inboundMessage,
59
+ recipientKeys: recipientKeys.map((key) => key.fingerprint)
60
+ });
61
+ throw new CredoError("Couldn't determine tenant id for inbound message. Unable to create context");
62
+ }
63
+ const contextCorrelationId = this.tenantSessionCoordinator.getContextCorrelationIdForTenantId(tenantId);
64
+ return await this.getAgentContextForContextCorrelationId(contextCorrelationId);
65
+ }
66
+ async endSessionForAgentContext(agentContext) {
67
+ await this.tenantSessionCoordinator.endAgentContextSession(agentContext);
68
+ }
69
+ async deleteAgentContext(agentContext) {
70
+ await this.tenantSessionCoordinator.deleteAgentContext(agentContext);
71
+ }
72
+ getRecipientKeysFromEncryptedMessage(jwe) {
73
+ const jweProtected = JsonEncoder.fromBase64(jwe.protected);
74
+ if (!Array.isArray(jweProtected.recipients)) return [];
75
+ const recipientKeys = [];
76
+ for (const recipient of jweProtected.recipients) if (isJsonObject(recipient) && isJsonObject(recipient.header) && typeof recipient.header.kid === "string") {
77
+ const publicJwk = Kms.PublicJwk.fromPublicKey({
78
+ crv: "Ed25519",
79
+ kty: "OKP",
80
+ publicKey: TypedArrayEncoder.fromBase58(recipient.header.kid)
81
+ });
82
+ recipientKeys.push(publicJwk);
83
+ }
84
+ return recipientKeys;
85
+ }
86
+ async registerRecipientKeyForTenant(tenantId, recipientKey) {
87
+ this.logger.debug(`Registering recipient key ${recipientKey.fingerprint} for tenant ${tenantId}`);
88
+ const tenantRecord = await this.tenantRecordService.getTenantById(this.rootAgentContext, tenantId);
89
+ await this.tenantRecordService.addTenantRoutingRecord(this.rootAgentContext, tenantRecord.id, recipientKey);
90
+ }
91
+ listenForRoutingKeyCreatedEvents() {
92
+ this.logger.debug("Listening for routing key created events in tenant agent context provider");
93
+ this.eventEmitter.on(DidCommRoutingEventTypes.RoutingCreatedEvent, async (event) => {
94
+ const contextCorrelationId = event.metadata.contextCorrelationId;
95
+ const recipientKey = event.payload.routing.recipientKey;
96
+ if (contextCorrelationId === this.rootAgentContext.contextCorrelationId) return;
97
+ this.tenantSessionCoordinator.assertTenantContextCorrelationId(contextCorrelationId);
98
+ this.logger.debug(`Received routing key created event for tenant context ${contextCorrelationId}, registering recipient key ${recipientKey.fingerprint} in base wallet`);
99
+ await this.registerRecipientKeyForTenant(this.tenantSessionCoordinator.getTenantIdForContextCorrelationId(contextCorrelationId), recipientKey);
100
+ });
101
+ }
102
+ /**
103
+ * Method to allow updating the tenant storage, this method can be called from the TenantsApi
104
+ * to update the storage for a tenant manually
105
+ */
106
+ async updateTenantStorage(tenantRecord, updateOptions) {
107
+ await (await this.tenantSessionCoordinator.getContextForSession(tenantRecord, { runInMutex: (agentContext) => this._updateTenantStorage(tenantRecord, agentContext, updateOptions) })).endSession();
108
+ }
109
+ /**
110
+ * Handle the case where the tenant storage is outdated. If auto-update is disabled we will throw an error
111
+ * and not update the storage. If auto-update is enabled we will update the storage.
112
+ *
113
+ * When this method is called we can be sure that we are in the mutex runExclusive lock and thus other sessions
114
+ * will not be able to open a session for this tenant until we're done.
115
+ *
116
+ * NOTE: We don't support multi-instance locking for now. That means you can only have a single instance open and
117
+ * it will prevent multiple processes from updating the tenant storage at the same time. However if multi-instances
118
+ * are used, we can't prevent multiple instances from updating the tenant storage at the same time.
119
+ * In the future we can make the tenantSessionCoordinator an interface and allowing a instance-tenant-lock as well
120
+ * as an tenant-lock (across all instances)
121
+ */
122
+ async _updateTenantStorage(tenantRecord, agentContext, updateOptions) {
123
+ try {
124
+ const updateAssistant = new UpdateAssistant(new TenantAgent(agentContext));
125
+ await updateAssistant.initialize();
126
+ await updateAssistant.update(updateOptions);
127
+ tenantRecord.storageVersion = await updateAssistant.getCurrentAgentStorageVersion();
128
+ await this.rootAgentContext.dependencyManager.resolve(TenantRecordService).updateTenant(this.rootAgentContext, tenantRecord);
129
+ } catch (error) {
130
+ this.logger.error(`Error occurred while updating tenant storage for tenant ${tenantRecord.id}`, error);
131
+ throw error;
132
+ }
133
+ }
134
+ };
135
+ TenantAgentContextProvider = __decorate([
136
+ injectable(),
137
+ __decorateParam(4, inject(InjectionSymbols.Logger)),
138
+ __decorateMetadata("design:paramtypes", [
139
+ typeof (_ref = typeof TenantRecordService !== "undefined" && TenantRecordService) === "function" ? _ref : Object,
140
+ typeof (_ref2 = typeof AgentContext !== "undefined" && AgentContext) === "function" ? _ref2 : Object,
141
+ typeof (_ref3 = typeof EventEmitter !== "undefined" && EventEmitter) === "function" ? _ref3 : Object,
142
+ typeof (_ref4 = typeof TenantSessionCoordinator !== "undefined" && TenantSessionCoordinator) === "function" ? _ref4 : Object,
143
+ Object
144
+ ])
145
+ ], TenantAgentContextProvider);
146
+
147
+ //#endregion
148
+ export { TenantAgentContextProvider };
149
+ //# sourceMappingURL=TenantAgentContextProvider.mjs.map