@tstdl/base 0.92.167 → 0.93.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (317) hide show
  1. package/application/application.d.ts +12 -18
  2. package/application/application.js +48 -69
  3. package/application/index.d.ts +1 -5
  4. package/application/index.js +1 -5
  5. package/application/providers.d.ts +10 -0
  6. package/application/providers.js +54 -0
  7. package/audit/audit.model.d.ts +15 -0
  8. package/audit/audit.model.js +73 -0
  9. package/audit/auditor.d.ts +42 -0
  10. package/audit/auditor.js +111 -0
  11. package/audit/index.d.ts +3 -0
  12. package/audit/index.js +3 -0
  13. package/audit/types.d.ts +22 -0
  14. package/audit/types.js +19 -0
  15. package/authentication/client/authentication.service.d.ts +1 -3
  16. package/authentication/client/authentication.service.js +4 -5
  17. package/browser/browser-context-controller.d.ts +2 -4
  18. package/browser/browser-context-controller.js +5 -6
  19. package/browser/browser-controller.d.ts +2 -4
  20. package/browser/browser-controller.js +3 -4
  21. package/browser/browser.service.d.ts +1 -3
  22. package/browser/browser.service.js +1 -2
  23. package/browser/page-controller.d.ts +2 -4
  24. package/browser/page-controller.js +7 -8
  25. package/browser/utils.js +3 -3
  26. package/cancellation/token.d.ts +104 -41
  27. package/cancellation/token.js +125 -54
  28. package/core.d.ts +1 -13
  29. package/core.js +1 -46
  30. package/disposable/disposable.d.ts +0 -8
  31. package/disposable/disposable.js +1 -3
  32. package/disposable/index.d.ts +0 -6
  33. package/disposable/index.js +0 -6
  34. package/disposable/using.d.ts +0 -1
  35. package/disposable/using.js +2 -3
  36. package/distributed-loop/distributed-loop.js +2 -2
  37. package/errors/utils.js +4 -1
  38. package/examples/api/authentication.js +11 -5
  39. package/examples/api/basic-overview.js +17 -12
  40. package/examples/api/custom-authentication.js +13 -7
  41. package/examples/api/streaming.js +15 -12
  42. package/examples/browser/basic.js +6 -3
  43. package/examples/document-management/main.js +6 -3
  44. package/examples/http/client.js +7 -3
  45. package/examples/mail/basic.js +9 -7
  46. package/examples/pdf/basic.js +8 -6
  47. package/examples/template/basic.js +7 -5
  48. package/http/client/http-client-request.d.ts +1 -2
  49. package/http/client/http-client-request.js +1 -2
  50. package/http/server/http-server.d.ts +1 -3
  51. package/http/server/http-server.js +0 -1
  52. package/http/server/node/node-http-server.d.ts +1 -2
  53. package/http/server/node/node-http-server.js +1 -2
  54. package/import.js +1 -1
  55. package/injector/injector.d.ts +1 -1
  56. package/injector/types.d.ts +3 -4
  57. package/lock/lock.d.ts +40 -21
  58. package/lock/lock.js +74 -1
  59. package/lock/postgres/drizzle/0000_busy_tattoo.sql +7 -0
  60. package/lock/postgres/drizzle/meta/0000_snapshot.json +65 -0
  61. package/lock/postgres/drizzle/meta/_journal.json +13 -0
  62. package/lock/postgres/drizzle.config.js +11 -0
  63. package/lock/postgres/index.d.ts +2 -0
  64. package/lock/postgres/index.js +2 -0
  65. package/lock/postgres/lock.d.ts +14 -0
  66. package/lock/postgres/lock.js +127 -0
  67. package/lock/postgres/models/index.d.ts +2 -0
  68. package/lock/postgres/models/index.js +2 -0
  69. package/lock/postgres/models/lock.model.d.ts +7 -0
  70. package/{examples/orm/user.model.js → lock/postgres/models/lock.model.js} +22 -30
  71. package/lock/postgres/models/schemas.d.ts +3 -0
  72. package/lock/postgres/models/schemas.js +4 -0
  73. package/lock/postgres/module.d.ts +6 -0
  74. package/lock/postgres/module.js +26 -0
  75. package/lock/postgres/provider.d.ts +6 -0
  76. package/lock/postgres/provider.js +29 -0
  77. package/lock/provider.d.ts +12 -2
  78. package/lock/provider.js +24 -1
  79. package/lock/web/web-lock.d.ts +4 -3
  80. package/lock/web/web-lock.js +49 -42
  81. package/lock/web/web-lock.provider.d.ts +0 -3
  82. package/lock/web/web-lock.provider.js +5 -22
  83. package/logger/formatter.d.ts +13 -0
  84. package/logger/formatter.js +3 -0
  85. package/logger/formatters/index.d.ts +2 -0
  86. package/logger/formatters/index.js +2 -0
  87. package/logger/formatters/json.d.ts +5 -0
  88. package/logger/formatters/json.js +33 -0
  89. package/logger/formatters/pretty-print.d.ts +5 -0
  90. package/logger/formatters/pretty-print.js +55 -0
  91. package/logger/index.d.ts +5 -2
  92. package/logger/index.js +5 -2
  93. package/logger/level.d.ts +10 -8
  94. package/logger/level.js +9 -9
  95. package/logger/logger.d.ts +21 -30
  96. package/logger/logger.js +98 -26
  97. package/logger/manager.d.ts +20 -0
  98. package/logger/manager.js +86 -0
  99. package/logger/tokens.d.ts +1 -1
  100. package/logger/tokens.js +1 -1
  101. package/logger/transport.d.ts +14 -0
  102. package/logger/transport.js +16 -0
  103. package/logger/transports/console.d.ts +14 -0
  104. package/logger/transports/console.js +36 -0
  105. package/logger/transports/index.d.ts +1 -0
  106. package/logger/transports/index.js +1 -0
  107. package/mail/clients/nodemailer.mail-client.d.ts +0 -1
  108. package/mail/clients/nodemailer.mail-client.js +9 -7
  109. package/message-bus/local/local-message-bus.js +2 -2
  110. package/message-bus/message-bus-base.d.ts +2 -3
  111. package/message-bus/message-bus-base.js +5 -6
  112. package/message-bus/message-bus.d.ts +1 -2
  113. package/message-bus/message-bus.js +1 -2
  114. package/module/index.d.ts +0 -2
  115. package/module/index.js +0 -2
  116. package/module/module.d.ts +17 -18
  117. package/module/module.js +47 -12
  118. package/module/modules/function.module.d.ts +6 -6
  119. package/module/modules/function.module.js +25 -9
  120. package/module/modules/web-server.module.d.ts +2 -10
  121. package/module/modules/web-server.module.js +3 -11
  122. package/openid-connect/index.d.ts +0 -2
  123. package/openid-connect/index.js +0 -2
  124. package/openid-connect/oidc-state.model.d.ts +4 -5
  125. package/openid-connect/oidc-state.model.js +51 -1
  126. package/openid-connect/oidc.service-model.d.ts +1 -1
  127. package/openid-connect/oidc.service.d.ts +2 -6
  128. package/openid-connect/oidc.service.js +24 -37
  129. package/orm/decorators.d.ts +10 -1
  130. package/orm/decorators.js +8 -0
  131. package/orm/server/repository.d.ts +3 -1
  132. package/orm/server/repository.js +32 -3
  133. package/package.json +19 -29
  134. package/pdf/pdf.service.js +9 -9
  135. package/pool/pool.d.ts +1 -3
  136. package/pool/pool.js +3 -4
  137. package/queue/postgres/job.model.d.ts +1 -2
  138. package/queue/postgres/job.model.js +1 -2
  139. package/queue/postgres/module.js +1 -1
  140. package/threading/thread-pool.d.ts +1 -3
  141. package/threading/thread-pool.js +7 -8
  142. package/utils/format-error.d.ts +7 -0
  143. package/utils/format-error.js +59 -17
  144. package/utils/function/memoize.d.ts +22 -7
  145. package/utils/function/memoize.js +82 -23
  146. package/utils/index.d.ts +1 -0
  147. package/utils/index.js +1 -0
  148. package/utils/object/dereference.d.ts +51 -19
  149. package/utils/object/dereference.js +52 -43
  150. package/utils/timing.js +2 -2
  151. package/utils/try-chain.d.ts +22 -0
  152. package/utils/try-chain.js +46 -0
  153. package/database/entity-repository.d.ts +0 -50
  154. package/database/entity-repository.js +0 -3
  155. package/database/entity.d.ts +0 -7
  156. package/database/entity.js +0 -1
  157. package/database/id.d.ts +0 -1
  158. package/database/id.js +0 -9
  159. package/database/index.d.ts +0 -11
  160. package/database/index.js +0 -11
  161. package/database/module.d.ts +0 -8
  162. package/database/module.js +0 -11
  163. package/database/mongo/classes.d.ts +0 -21
  164. package/database/mongo/classes.js +0 -26
  165. package/database/mongo/index.d.ts +0 -15
  166. package/database/mongo/index.js +0 -15
  167. package/database/mongo/model/document.d.ts +0 -29
  168. package/database/mongo/model/document.js +0 -63
  169. package/database/mongo/model/index.d.ts +0 -1
  170. package/database/mongo/model/index.js +0 -1
  171. package/database/mongo/module.d.ts +0 -8
  172. package/database/mongo/module.js +0 -68
  173. package/database/mongo/mongo-base.repository.d.ts +0 -103
  174. package/database/mongo/mongo-base.repository.js +0 -263
  175. package/database/mongo/mongo-bulk.d.ts +0 -35
  176. package/database/mongo/mongo-bulk.js +0 -90
  177. package/database/mongo/mongo-entity-repository.d.ts +0 -98
  178. package/database/mongo/mongo-entity-repository.js +0 -278
  179. package/database/mongo/operations.d.ts +0 -10
  180. package/database/mongo/operations.js +0 -54
  181. package/database/mongo/query-converter.d.ts +0 -6
  182. package/database/mongo/query-converter.js +0 -83
  183. package/database/mongo/simple-entity-repository.d.ts +0 -7
  184. package/database/mongo/simple-entity-repository.js +0 -6
  185. package/database/mongo/types.d.ts +0 -50
  186. package/database/mongo/types.js +0 -3
  187. package/database/query.d.ts +0 -121
  188. package/database/query.js +0 -7
  189. package/database/utils.d.ts +0 -2
  190. package/database/utils.js +0 -3
  191. package/disposable/async-disposer.d.ts +0 -35
  192. package/disposable/async-disposer.js +0 -125
  193. package/examples/orm/drizzle.config.js +0 -6
  194. package/examples/orm/schemas.d.ts +0 -3
  195. package/examples/orm/schemas.js +0 -4
  196. package/examples/orm/test.d.ts +0 -1
  197. package/examples/orm/test.js +0 -11
  198. package/examples/orm/user.model.d.ts +0 -13
  199. package/key-value-store/mongo/index.d.ts +0 -6
  200. package/key-value-store/mongo/index.js +0 -6
  201. package/key-value-store/mongo/module.d.ts +0 -8
  202. package/key-value-store/mongo/module.js +0 -18
  203. package/key-value-store/mongo/mongo-key-value-store.provider.d.ts +0 -8
  204. package/key-value-store/mongo/mongo-key-value-store.provider.js +0 -26
  205. package/key-value-store/mongo/mongo-key-value.model.d.ts +0 -7
  206. package/key-value-store/mongo/mongo-key-value.model.js +0 -1
  207. package/key-value-store/mongo/mongo-key-value.repository.d.ts +0 -10
  208. package/key-value-store/mongo/mongo-key-value.repository.js +0 -31
  209. package/key-value-store/mongo/mongo-key-value.store.d.ts +0 -15
  210. package/key-value-store/mongo/mongo-key-value.store.js +0 -82
  211. package/key-value-store/mongo/tokens.d.ts +0 -3
  212. package/key-value-store/mongo/tokens.js +0 -2
  213. package/lock/mongo/index.d.ts +0 -5
  214. package/lock/mongo/index.js +0 -5
  215. package/lock/mongo/lock.d.ts +0 -14
  216. package/lock/mongo/lock.js +0 -125
  217. package/lock/mongo/model.d.ts +0 -6
  218. package/lock/mongo/model.js +0 -1
  219. package/lock/mongo/module.d.ts +0 -12
  220. package/lock/mongo/module.js +0 -20
  221. package/lock/mongo/mongo-lock-repository.d.ts +0 -14
  222. package/lock/mongo/mongo-lock-repository.js +0 -67
  223. package/lock/mongo/provider.d.ts +0 -8
  224. package/lock/mongo/provider.js +0 -36
  225. package/logger/console/index.d.ts +0 -1
  226. package/logger/console/index.js +0 -1
  227. package/logger/console/logger.d.ts +0 -11
  228. package/logger/console/logger.js +0 -64
  229. package/logger/noop/index.d.ts +0 -1
  230. package/logger/noop/index.js +0 -1
  231. package/logger/noop/logger.d.ts +0 -9
  232. package/logger/noop/logger.js +0 -21
  233. package/migration/index.d.ts +0 -9
  234. package/migration/index.js +0 -9
  235. package/migration/migration-state-repository.d.ts +0 -4
  236. package/migration/migration-state-repository.js +0 -3
  237. package/migration/migration-state.d.ts +0 -6
  238. package/migration/migration-state.js +0 -1
  239. package/migration/migrator.d.ts +0 -23
  240. package/migration/migrator.js +0 -76
  241. package/migration/mongo/index.d.ts +0 -2
  242. package/migration/mongo/index.js +0 -2
  243. package/migration/mongo/migration-state-repository.d.ts +0 -11
  244. package/migration/mongo/migration-state-repository.js +0 -32
  245. package/migration/mongo/module.d.ts +0 -12
  246. package/migration/mongo/module.js +0 -17
  247. package/module/module-base.d.ts +0 -18
  248. package/module/module-base.js +0 -40
  249. package/module/module-metric-reporter.d.ts +0 -29
  250. package/module/module-metric-reporter.js +0 -62
  251. package/openid-connect/mongo-oidc-state.repository.d.ts +0 -21
  252. package/openid-connect/mongo-oidc-state.repository.js +0 -52
  253. package/openid-connect/oidc-state.repository.d.ts +0 -4
  254. package/openid-connect/oidc-state.repository.js +0 -3
  255. package/process-shutdown.d.ts +0 -9
  256. package/process-shutdown.js +0 -65
  257. package/queue/mongo/index.d.ts +0 -4
  258. package/queue/mongo/index.js +0 -4
  259. package/queue/mongo/job.d.ts +0 -12
  260. package/queue/mongo/job.js +0 -1
  261. package/queue/mongo/mongo-job.repository.d.ts +0 -13
  262. package/queue/mongo/mongo-job.repository.js +0 -54
  263. package/queue/mongo/queue.d.ts +0 -38
  264. package/queue/mongo/queue.js +0 -266
  265. package/queue/mongo/queue.provider.d.ts +0 -18
  266. package/queue/mongo/queue.provider.js +0 -38
  267. package/search-index/elastic/config.d.ts +0 -8
  268. package/search-index/elastic/config.js +0 -26
  269. package/search-index/elastic/index.d.ts +0 -8
  270. package/search-index/elastic/index.js +0 -8
  271. package/search-index/elastic/keyword-rewriter.d.ts +0 -8
  272. package/search-index/elastic/keyword-rewriter.js +0 -18
  273. package/search-index/elastic/model/elastic-query.d.ts +0 -16
  274. package/search-index/elastic/model/elastic-query.js +0 -1
  275. package/search-index/elastic/model/index-mapping.d.ts +0 -26
  276. package/search-index/elastic/model/index-mapping.js +0 -4
  277. package/search-index/elastic/model/index.d.ts +0 -3
  278. package/search-index/elastic/model/index.js +0 -3
  279. package/search-index/elastic/model/sort.d.ts +0 -8
  280. package/search-index/elastic/model/sort.js +0 -1
  281. package/search-index/elastic/module.d.ts +0 -10
  282. package/search-index/elastic/module.js +0 -49
  283. package/search-index/elastic/query-builder/boolean-query-builder.d.ts +0 -11
  284. package/search-index/elastic/query-builder/boolean-query-builder.js +0 -52
  285. package/search-index/elastic/query-builder/index.d.ts +0 -1
  286. package/search-index/elastic/query-builder/index.js +0 -1
  287. package/search-index/elastic/query-converter.d.ts +0 -9
  288. package/search-index/elastic/query-converter.js +0 -183
  289. package/search-index/elastic/search-index.d.ts +0 -30
  290. package/search-index/elastic/search-index.js +0 -144
  291. package/search-index/elastic/sort-converter.d.ts +0 -4
  292. package/search-index/elastic/sort-converter.js +0 -14
  293. package/search-index/elastic/types.d.ts +0 -5
  294. package/search-index/elastic/types.js +0 -1
  295. package/search-index/error.d.ts +0 -10
  296. package/search-index/error.js +0 -14
  297. package/search-index/index.d.ts +0 -3
  298. package/search-index/index.js +0 -3
  299. package/search-index/memory/index.d.ts +0 -1
  300. package/search-index/memory/index.js +0 -1
  301. package/search-index/memory/memory-search-index.d.ts +0 -19
  302. package/search-index/memory/memory-search-index.js +0 -144
  303. package/search-index/search-index.d.ts +0 -46
  304. package/search-index/search-index.js +0 -31
  305. package/search-index/search-result.d.ts +0 -12
  306. package/search-index/search-result.js +0 -1
  307. package/theme/adapters/css-adapter.d.ts +0 -5
  308. package/theme/adapters/css-adapter.js +0 -29
  309. package/theme/adapters/index.d.ts +0 -2
  310. package/theme/adapters/index.js +0 -2
  311. package/theme/adapters/tailwind-adapter.d.ts +0 -18
  312. package/theme/adapters/tailwind-adapter.js +0 -32
  313. package/theme/index.d.ts +0 -1
  314. package/theme/index.js +0 -1
  315. package/theme/theme-service.d.ts +0 -43
  316. package/theme/theme-service.js +0 -128
  317. /package/{examples/orm → lock/postgres}/drizzle.config.d.ts +0 -0
@@ -1,5 +0,0 @@
1
- export * from './lock.js';
2
- export * from './model.js';
3
- export * from './module.js';
4
- export * from './mongo-lock-repository.js';
5
- export * from './provider.js';
@@ -1,5 +0,0 @@
1
- export * from './lock.js';
2
- export * from './model.js';
3
- export * from './module.js';
4
- export * from './mongo-lock-repository.js';
5
- export * from './provider.js';
@@ -1,14 +0,0 @@
1
- import type { AcquireResult, LockedFunction, UsingResult } from '../../lock/index.js';
2
- import { Lock } from '../../lock/index.js';
3
- import { Logger } from '../../logger/index.js';
4
- import { MongoLockRepository } from './mongo-lock-repository.js';
5
- export declare class MongoLock extends Lock {
6
- #private;
7
- constructor(lockRepository: MongoLockRepository, resource: string, logger: Logger);
8
- acquire<Throw extends boolean>(timeout: number | undefined, throwOnFail: Throw): Promise<AcquireResult<Throw>>;
9
- use<Throw extends boolean, R>(timeout: number | undefined, throwOnFail: Throw, func: LockedFunction<R>): Promise<UsingResult<Throw, R>>;
10
- exists(): Promise<boolean>;
11
- private tryAcquireOrRefresh;
12
- private tryRefresh;
13
- private release;
14
- }
@@ -1,125 +0,0 @@
1
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
- 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;
5
- return c > 3 && r && Object.defineProperty(target, key, r), r;
6
- };
7
- var __metadata = (this && this.__metadata) || function (k, v) {
8
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
- };
10
- import { CancellationToken } from '../../cancellation/index.js';
11
- import { Injectable } from '../../injector/decorators.js';
12
- import { Lock } from '../../lock/index.js';
13
- import { Logger } from '../../logger/index.js';
14
- import { Alphabet } from '../../utils/alphabet.js';
15
- import { currentTimestamp } from '../../utils/date-time.js';
16
- import { getRandomString } from '../../utils/random.js';
17
- import { Timer } from '../../utils/timer.js';
18
- import { cancelableTimeoutUntil, timeout as utilsTimeout } from '../../utils/timing.js';
19
- import { assertStringPass, isObject, isUndefined } from '../../utils/type-guards.js';
20
- import { MongoLockRepository } from './mongo-lock-repository.js';
21
- import { MongoLockProvider } from './provider.js';
22
- const expirationTime = 10000;
23
- const renewBuffer = expirationTime / 2;
24
- let MongoLock = class MongoLock extends Lock {
25
- #lockRepository;
26
- #logger;
27
- constructor(lockRepository, resource, logger) {
28
- super(resource);
29
- this.#lockRepository = lockRepository;
30
- this.#logger = logger;
31
- }
32
- async acquire(timeout, throwOnFail) {
33
- const key = getRandomString(15, Alphabet.LowerUpperCaseNumbers);
34
- const timeoutDuration = Math.max(50, Math.min(1000, (timeout ?? 0) / 10));
35
- let result = false;
36
- const timer = new Timer(true);
37
- while ((result == false) && (isUndefined(timeout) || (timer.milliseconds < timeout))) {
38
- result = await this.tryAcquireOrRefresh(this.resource, key);
39
- if ((result == false) && isUndefined(timeout)) {
40
- break;
41
- }
42
- if (result == false) {
43
- await utilsTimeout(timeoutDuration);
44
- }
45
- }
46
- if (result == false) {
47
- if (throwOnFail) {
48
- throw new Error('Failed to acquire lock.');
49
- }
50
- return false;
51
- }
52
- let expiration = result;
53
- const releaseToken = new CancellationToken();
54
- const controller = {
55
- get lost() {
56
- return currentTimestamp() >= expiration.valueOf();
57
- },
58
- release: async () => {
59
- releaseToken.set();
60
- await this.release(this.resource, key);
61
- }
62
- };
63
- void (async () => {
64
- await cancelableTimeoutUntil(expiration.valueOf() - renewBuffer, releaseToken);
65
- while (!releaseToken.isSet && !controller.lost) {
66
- try {
67
- const refreshResult = await this.tryRefresh(this.resource, key);
68
- expiration = (refreshResult == false) ? new Date(0) : refreshResult;
69
- }
70
- catch (error) {
71
- this.#logger.error(error);
72
- }
73
- finally {
74
- await cancelableTimeoutUntil(Math.max(currentTimestamp() + 1000, expiration.valueOf() - renewBuffer), releaseToken);
75
- }
76
- }
77
- })();
78
- return controller;
79
- }
80
- async use(timeout, throwOnFail, func) {
81
- const controller = await this.acquire(timeout, throwOnFail);
82
- if (controller == false) {
83
- return { success: false, result: undefined };
84
- }
85
- try {
86
- const result = await func(controller);
87
- return { success: true, result };
88
- }
89
- finally {
90
- await controller.release();
91
- }
92
- }
93
- async exists() {
94
- return this.#lockRepository.exists(this.resource);
95
- }
96
- async tryAcquireOrRefresh(resource, key) {
97
- const expirationDate = getExpirationDate();
98
- return this.#lockRepository.tryInsertOrRefresh(resource, key, expirationDate);
99
- }
100
- async tryRefresh(resource, key) {
101
- const expiration = getExpirationDate();
102
- return this.#lockRepository.tryUpdateExpiration(resource, key, expiration);
103
- }
104
- async release(resource, key) {
105
- return this.#lockRepository.deleteByResource(resource, key);
106
- }
107
- };
108
- MongoLock = __decorate([
109
- Injectable({
110
- provider: {
111
- useFactory: (argument, context) => {
112
- const arg = argument;
113
- const prefix = isObject(arg) ? assertStringPass(arg.prefix, 'invalid lock argument') : undefined;
114
- const resource = assertStringPass(isObject(arg) ? arg.resource : arg, 'invalid lock argument');
115
- const provider = context.resolve(MongoLockProvider, prefix);
116
- return provider.get(resource);
117
- }
118
- }
119
- }),
120
- __metadata("design:paramtypes", [MongoLockRepository, String, Logger])
121
- ], MongoLock);
122
- export { MongoLock };
123
- function getExpirationDate() {
124
- return new Date(currentTimestamp() + expirationTime);
125
- }
@@ -1,6 +0,0 @@
1
- import type { Entity } from '../../database/index.js';
2
- export type MongoLockEntity = Entity & {
3
- resource: string;
4
- key: string;
5
- expiration: Date;
6
- };
@@ -1 +0,0 @@
1
- export {};
@@ -1,12 +0,0 @@
1
- import type { MongoRepositoryConfig } from '../../database/mongo/index.js';
2
- import type { MongoLockEntity } from './model.js';
3
- export type MongoLockModuleConfig = {
4
- lockEntityRepositoryConfig: MongoRepositoryConfig<MongoLockEntity> | undefined;
5
- };
6
- export declare const mongoLockModuleConfig: MongoLockModuleConfig;
7
- /**
8
- * configure mongo lock module
9
- * @param lockRepositoryConfig repository configuration for locks
10
- * @param register whether to register for {@link Lock} and {@link LockProvider}
11
- */
12
- export declare function configureMongoLock(lockRepositoryConfig: MongoRepositoryConfig<MongoLockEntity>, register?: boolean): void;
@@ -1,20 +0,0 @@
1
- import { Injector } from '../../injector/injector.js';
2
- import { Lock } from '../lock.js';
3
- import { LockProvider } from '../provider.js';
4
- import { MongoLock } from './lock.js';
5
- import { MongoLockProvider } from './provider.js';
6
- export const mongoLockModuleConfig = {
7
- lockEntityRepositoryConfig: undefined
8
- };
9
- /**
10
- * configure mongo lock module
11
- * @param lockRepositoryConfig repository configuration for locks
12
- * @param register whether to register for {@link Lock} and {@link LockProvider}
13
- */
14
- export function configureMongoLock(lockRepositoryConfig, register = true) {
15
- mongoLockModuleConfig.lockEntityRepositoryConfig = lockRepositoryConfig;
16
- if (register) {
17
- Injector.registerSingleton(LockProvider, { useToken: MongoLockProvider });
18
- Injector.register(Lock, { useToken: MongoLock });
19
- }
20
- }
@@ -1,14 +0,0 @@
1
- import type { CollectionArgument } from '../../database/mongo/index.js';
2
- import { Collection, MongoEntityRepository } from '../../database/mongo/index.js';
3
- import { resolveArgumentType } from '../../injector/index.js';
4
- import type { Resolvable } from '../../injector/interfaces.js';
5
- import { Logger } from '../../logger/index.js';
6
- import type { MongoLockEntity } from './model.js';
7
- export declare class MongoLockRepository extends MongoEntityRepository<MongoLockEntity> implements Resolvable<CollectionArgument<MongoLockEntity>> {
8
- readonly [resolveArgumentType]: CollectionArgument<MongoLockEntity>;
9
- constructor(collection: Collection<MongoLockEntity>, logger: Logger);
10
- tryInsertOrRefresh(resource: string, key: string, newExpirationDate: Date): Promise<false | Date>;
11
- exists(resource: string): Promise<boolean>;
12
- tryUpdateExpiration(resource: string, key: string, expirationDate: Date): Promise<false | Date>;
13
- deleteByResource(resource: string, key: string): Promise<boolean>;
14
- }
@@ -1,67 +0,0 @@
1
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
- 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;
5
- return c > 3 && r && Object.defineProperty(target, key, r), r;
6
- };
7
- var __metadata = (this && this.__metadata) || function (k, v) {
8
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
- };
10
- var __param = (this && this.__param) || function (paramIndex, decorator) {
11
- return function (target, key) { decorator(target, key, paramIndex); }
12
- };
13
- import { getNewId } from '../../database/index.js';
14
- import { Collection, MongoEntityRepository, noopTransformer } from '../../database/mongo/index.js';
15
- import { ForwardArg, Singleton, resolveArgumentType } from '../../injector/index.js';
16
- import { Logger } from '../../logger/index.js';
17
- import { now } from '../../utils/date-time.js';
18
- import { MongoError } from 'mongodb';
19
- const indexes = [
20
- { key: { resource: 1 }, unique: true },
21
- { key: { expiration: 1 }, expireAfterSeconds: 1 }
22
- ];
23
- let MongoLockRepository = class MongoLockRepository extends MongoEntityRepository {
24
- constructor(collection, logger) {
25
- super(collection, noopTransformer, { logger, indexes });
26
- }
27
- async tryInsertOrRefresh(resource, key, newExpirationDate) {
28
- const filter = {
29
- $and: [
30
- { resource },
31
- {
32
- $or: [
33
- { key },
34
- { expiration: { $lte: now() } }
35
- ]
36
- }
37
- ]
38
- };
39
- try {
40
- const { upsertedCount, modifiedCount } = await this.baseRepository.collection.updateOne(filter, { $set: { expiration: newExpirationDate }, $setOnInsert: { _id: getNewId(), key } }, { upsert: true });
41
- return ((upsertedCount > 0) || (modifiedCount > 0)) ? newExpirationDate : false;
42
- }
43
- catch (error) {
44
- if (error instanceof MongoError && error.code == 11000) {
45
- return false;
46
- }
47
- throw error;
48
- }
49
- }
50
- async exists(resource) {
51
- return this.baseRepository.hasByFilter({ resource, expiration: { $gt: now() } });
52
- }
53
- async tryUpdateExpiration(resource, key, expirationDate) {
54
- const filter = { resource, key };
55
- const result = await this.baseRepository.update(filter, { $set: { expiration: expirationDate } });
56
- return (result.modifiedCount > 0) ? expirationDate : false;
57
- }
58
- async deleteByResource(resource, key) {
59
- return this.baseRepository.deleteByFilter({ resource, key });
60
- }
61
- };
62
- MongoLockRepository = __decorate([
63
- Singleton(),
64
- __param(0, ForwardArg()),
65
- __metadata("design:paramtypes", [Collection, Logger])
66
- ], MongoLockRepository);
67
- export { MongoLockRepository };
@@ -1,8 +0,0 @@
1
- import type { Lock } from '../../lock/index.js';
2
- import { LockProvider } from '../../lock/index.js';
3
- export declare class MongoLockProvider extends LockProvider {
4
- #private;
5
- prefix(prefix: string): MongoLockProvider;
6
- get(resource: string): Lock;
7
- private getResourceString;
8
- }
@@ -1,36 +0,0 @@
1
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
- 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;
5
- return c > 3 && r && Object.defineProperty(target, key, r), r;
6
- };
7
- var MongoLockProvider_1;
8
- import { Singleton } from '../../injector/decorators.js';
9
- import { inject, injectArgument } from '../../injector/inject.js';
10
- import { Injector } from '../../injector/injector.js';
11
- import { LockProvider } from '../../lock/index.js';
12
- import { Logger } from '../../logger/index.js';
13
- import { assertDefinedPass, isDefined } from '../../utils/type-guards.js';
14
- import { MongoLock } from './lock.js';
15
- import { mongoLockModuleConfig } from './module.js';
16
- import { MongoLockRepository } from './mongo-lock-repository.js';
17
- let MongoLockProvider = MongoLockProvider_1 = class MongoLockProvider extends LockProvider {
18
- #injector = inject(Injector);
19
- #lockRepository = inject(MongoLockRepository, assertDefinedPass(mongoLockModuleConfig.lockEntityRepositoryConfig, 'mongo lock module not configured'));
20
- #logger = inject(Logger, 'MongoLock');
21
- #prefix = injectArgument(this, { optional: true });
22
- prefix(prefix) {
23
- return this.#injector.resolve(MongoLockProvider_1, this.getResourceString(prefix));
24
- }
25
- get(resource) {
26
- return new MongoLock(this.#lockRepository, this.getResourceString(resource), this.#logger);
27
- }
28
- getResourceString(resource) {
29
- const prefixDivider = (isDefined(this.#prefix) && (this.#prefix.length > 0)) ? ':' : '';
30
- return `${this.#prefix}${prefixDivider}${resource}`;
31
- }
32
- };
33
- MongoLockProvider = MongoLockProvider_1 = __decorate([
34
- Singleton()
35
- ], MongoLockProvider);
36
- export { MongoLockProvider };
@@ -1 +0,0 @@
1
- export * from './logger.js';
@@ -1 +0,0 @@
1
- export * from './logger.js';
@@ -1,11 +0,0 @@
1
- import { LogLevel } from '../level.js';
2
- import type { LogErrorOptions, LoggerForkOptions } from '../logger.js';
3
- import { Logger } from '../logger.js';
4
- export declare class ConsoleLogger extends Logger {
5
- private readonly entryPrefix;
6
- constructor(level: LogLevel, module?: string | string[], prefix?: string);
7
- fork(options: LoggerForkOptions): ConsoleLogger;
8
- subModule(subModule: string): ConsoleLogger;
9
- prefix(prefix: string): ConsoleLogger;
10
- protected log(level: LogLevel, entryOrError: string | unknown, errorOptions?: LogErrorOptions): void;
11
- }
@@ -1,64 +0,0 @@
1
- /* eslint-disable no-console */
2
- var __decorate = (this && this.__decorate) || function (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
- var __metadata = (this && this.__metadata) || function (k, v) {
9
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
- };
11
- var ConsoleLogger_1;
12
- import { Singleton } from '../../injector/decorators.js';
13
- import { now } from '../../utils/date-time.js';
14
- import { formatError } from '../../utils/format-error.js';
15
- import { isDefined, isObject, isString } from '../../utils/type-guards.js';
16
- import { LogLevel } from '../level.js';
17
- import { Logger } from '../logger.js';
18
- import { LOG_LEVEL } from '../tokens.js';
19
- const consoleLevelFuncMap = {
20
- [LogLevel.Error]: 'error',
21
- [LogLevel.Warn]: 'warn',
22
- [LogLevel.Info]: 'info',
23
- [LogLevel.Verbose]: 'info',
24
- [LogLevel.Debug]: 'debug',
25
- [LogLevel.Trace]: 'debug'
26
- };
27
- let ConsoleLogger = ConsoleLogger_1 = class ConsoleLogger extends Logger {
28
- entryPrefix;
29
- constructor(level, module, prefix) {
30
- super(level, module, prefix);
31
- const modulePrefix = isDefined(this.module) ? this.module.map((m) => `[${m}]`).join(' ') : '';
32
- this.entryPrefix = `${modulePrefix}${modulePrefix.length > 0 ? ' ' : ''}${this.logPrefix}`;
33
- }
34
- fork(options) {
35
- const level = options.level ?? this.level;
36
- const module = isDefined(options.subModule) ? [...(this.module ?? []), options.subModule] : this.module;
37
- return new ConsoleLogger_1(level, module, isDefined(options.subModule) ? options.prefix : (options.prefix ?? this.logPrefix));
38
- }
39
- subModule(subModule) {
40
- return new ConsoleLogger_1(this.level, [...(this.module ?? []), subModule]);
41
- }
42
- prefix(prefix) {
43
- return new ConsoleLogger_1(this.level, this.module, `${prefix}${this.logPrefix}`);
44
- }
45
- log(level, entryOrError, errorOptions) {
46
- const entry = isString(entryOrError) ? entryOrError : formatError(entryOrError, errorOptions);
47
- const dateString = now().toISOString();
48
- console[consoleLevelFuncMap[level]](`${dateString} - ${this.entryPrefix}${entry}`);
49
- }
50
- };
51
- ConsoleLogger = ConsoleLogger_1 = __decorate([
52
- Singleton({
53
- provider: {
54
- useFactory: (argument, context) => {
55
- if (isObject(argument)) {
56
- return new ConsoleLogger(argument.level ?? context.resolve(LOG_LEVEL), argument.module, argument.prefix);
57
- }
58
- return new ConsoleLogger(context.resolve(LOG_LEVEL), argument, undefined);
59
- }
60
- }
61
- }),
62
- __metadata("design:paramtypes", [Number, Object, String])
63
- ], ConsoleLogger);
64
- export { ConsoleLogger };
@@ -1 +0,0 @@
1
- export * from './logger.js';
@@ -1 +0,0 @@
1
- export * from './logger.js';
@@ -1,9 +0,0 @@
1
- import { Logger } from '../logger.js';
2
- export declare class NoopLogger extends Logger {
3
- constructor();
4
- fork(): Logger;
5
- subModule(): Logger;
6
- prefix(): Logger;
7
- protected log(): void;
8
- }
9
- export declare const noopLogger: NoopLogger;
@@ -1,21 +0,0 @@
1
- /* eslint-disable class-methods-use-this, @typescript-eslint/no-empty-function */
2
- import { LogLevel } from '../level.js';
3
- import { Logger } from '../logger.js';
4
- export class NoopLogger extends Logger {
5
- constructor() {
6
- super(LogLevel.Trace, '', '');
7
- }
8
- fork() {
9
- return this;
10
- }
11
- subModule() {
12
- return this;
13
- }
14
- prefix() {
15
- return this;
16
- }
17
- log() {
18
- // noop
19
- }
20
- }
21
- export const noopLogger = new NoopLogger();
@@ -1,9 +0,0 @@
1
- /**
2
- * Application database migration
3
- *
4
- * @module Migration
5
- */
6
- export * from './migration-state-repository.js';
7
- export * from './migration-state.js';
8
- export * from './migrator.js';
9
- export * from './mongo/index.js';
@@ -1,9 +0,0 @@
1
- /**
2
- * Application database migration
3
- *
4
- * @module Migration
5
- */
6
- export * from './migration-state-repository.js';
7
- export * from './migration-state.js';
8
- export * from './migrator.js';
9
- export * from './mongo/index.js';
@@ -1,4 +0,0 @@
1
- import { EntityRepository } from '../database/index.js';
2
- import type { MigrationState } from './migration-state.js';
3
- export declare abstract class MigrationStateRepository extends EntityRepository<MigrationState> {
4
- }
@@ -1,3 +0,0 @@
1
- import { EntityRepository } from '../database/index.js';
2
- export class MigrationStateRepository extends EntityRepository {
3
- }
@@ -1,6 +0,0 @@
1
- import type { Entity, NewEntity } from '../database/index.js';
2
- export type MigrationState = Entity & {
3
- name: string;
4
- revision: number;
5
- };
6
- export type NewMigrationState = NewEntity<MigrationState>;
@@ -1 +0,0 @@
1
- export {};
@@ -1,23 +0,0 @@
1
- export type MigrationDefinition<T = void> = {
2
- name: string;
3
- migrations: Migration<T>[];
4
- };
5
- export type Migration<T = void> = {
6
- from: 'init' | number | number[];
7
- to: number;
8
- migrator: (control: MigrationControl) => Promise<T> | T;
9
- };
10
- export type MigrationControl = {
11
- restart: () => void;
12
- };
13
- export type MigrationResult<T> = {
14
- from: 'init' | number;
15
- to: number;
16
- time: number;
17
- result: T;
18
- restartRequested: boolean;
19
- };
20
- export declare class Migrator {
21
- #private;
22
- migrate<T>({ name, migrations }: MigrationDefinition<T>): Promise<MigrationResult<T>[]>;
23
- }
@@ -1,76 +0,0 @@
1
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
- 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;
5
- return c > 3 && r && Object.defineProperty(target, key, r), r;
6
- };
7
- import { CancellationToken } from '../cancellation/index.js';
8
- import { Injector, Singleton, inject, runInInjectionContext } from '../injector/index.js';
9
- import { LockProvider } from '../lock/index.js';
10
- import { Logger } from '../logger/index.js';
11
- import { toArray } from '../utils/array/array.js';
12
- import { compareByValueSelectionDescending } from '../utils/comparison.js';
13
- import { round } from '../utils/math.js';
14
- import { Timer } from '../utils/timer.js';
15
- import { isDefined } from '../utils/type-guards.js';
16
- import { MigrationStateRepository } from './migration-state-repository.js';
17
- let Migrator = class Migrator {
18
- #injector = inject(Injector);
19
- #migrationStateRepository = inject(MigrationStateRepository);
20
- #lockProvider = inject(LockProvider, 'migrator:');
21
- #logger = inject(Logger, 'Migrator');
22
- // eslint-disable-next-line max-statements, max-lines-per-function
23
- async migrate({ name, migrations }) {
24
- if (migrations.length == 0) {
25
- throw new Error('No migrations provided.');
26
- }
27
- const lock = this.#lockProvider.get(`${name}`);
28
- // eslint-disable-next-line max-statements, max-lines-per-function
29
- const { result } = await lock.use(30000, true, async () => {
30
- const results = [];
31
- while (true) {
32
- const restartToken = new CancellationToken();
33
- const control = {
34
- restart: () => restartToken.set()
35
- };
36
- const currentState = await this.#migrationStateRepository.tryLoadByFilter({ name });
37
- const currentRevision = currentState?.revision ?? 'init';
38
- const latestRevision = migrations.sort(compareByValueSelectionDescending((migration) => migration.to))[0].to;
39
- if (currentRevision == latestRevision) {
40
- break;
41
- }
42
- const suitableMigrations = migrations.filter((migration) => toArray(migration.from).includes(currentRevision));
43
- if (suitableMigrations.length == 0) {
44
- throw new Error(`No suitable migration path from current revision ${currentRevision} to latest revision ${latestRevision} found.`);
45
- }
46
- const migration = suitableMigrations.sort(compareByValueSelectionDescending((m) => m.to))[0];
47
- this.#logger.warn(`Starting migration for "${name}" from revision ${currentRevision} to ${migration.to}.`);
48
- let migratorResult;
49
- const time = await Timer.measureAsync(async () => (migratorResult = await runInInjectionContext(this.#injector, async () => migration.migrator(control))));
50
- results.push({ from: currentRevision, to: migration.to, time, result: migratorResult, restartRequested: restartToken.isSet });
51
- if (restartToken.isSet) {
52
- this.#logger.warn(`Finished migration in ${round(time / 1000, 2)} seconds.`);
53
- this.#logger.warn('Migration-restart requested.');
54
- continue;
55
- }
56
- if (isDefined(currentState)) {
57
- await this.#migrationStateRepository.patchByFilter({ name }, { revision: migration.to });
58
- }
59
- else {
60
- const newState = {
61
- name,
62
- revision: migration.to
63
- };
64
- await this.#migrationStateRepository.insert(newState);
65
- }
66
- this.#logger.warn(`Finished migration in ${round(time / 1000, 2)} seconds.`);
67
- }
68
- return results;
69
- });
70
- return result;
71
- }
72
- };
73
- Migrator = __decorate([
74
- Singleton()
75
- ], Migrator);
76
- export { Migrator };
@@ -1,2 +0,0 @@
1
- export * from './migration-state-repository.js';
2
- export * from './module.js';
@@ -1,2 +0,0 @@
1
- export * from './migration-state-repository.js';
2
- export * from './module.js';
@@ -1,11 +0,0 @@
1
- import type { Resolvable } from '../../injector/index.js';
2
- import { resolveArgumentType } from '../../injector/index.js';
3
- import { Logger } from '../../logger/index.js';
4
- import type { MigrationState, MigrationStateRepository } from '../../migration/index.js';
5
- import type { CollectionArgument } from '../../database/mongo/classes.js';
6
- import { Collection } from '../../database/mongo/classes.js';
7
- import { MongoEntityRepository } from '../../database/mongo/mongo-entity-repository.js';
8
- export declare class MongoMigrationStateRepository extends MongoEntityRepository<MigrationState> implements MigrationStateRepository, Resolvable<CollectionArgument<MigrationState>> {
9
- readonly [resolveArgumentType]: CollectionArgument<MigrationState>;
10
- constructor(collection: Collection<MigrationState>, logger: Logger);
11
- }