@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
@@ -11,7 +11,7 @@ import { compileClient } from '../../api/client/client.js';
11
11
  import { defineApi } from '../../api/index.js';
12
12
  import { apiController, configureApiServer } from '../../api/server/index.js';
13
13
  import { Application } from '../../application/application.js';
14
- import { CORE_LOGGER, configureTstdl, getGlobalInjector } from '../../core.js';
14
+ import { provideInitializer, provideModules, provideSignalHandler } from '../../application/index.js';
15
15
  import { configureUndiciHttpClientAdapter } from '../../http/client/adapters/undici.adapter.js';
16
16
  import { configureHttpClient } from '../../http/client/module.js';
17
17
  import { HttpServerResponse } from '../../http/server/index.js';
@@ -24,9 +24,7 @@ import { decodeTextStream, encodeUtf8Stream } from '../../utils/encoding.js';
24
24
  import { getReadableStreamFromIterable, getReadableStreamIterable } from '../../utils/stream/index.js';
25
25
  import { cancelableTimeout, timeout } from '../../utils/timing.js';
26
26
  import { isDefined } from '../../utils/type-guards.js';
27
- configureTstdl();
28
27
  configureDefaultSignalsImplementation();
29
- const logger = getGlobalInjector().resolve(CORE_LOGGER);
30
28
  const streamingApiDefinition = defineApi({
31
29
  resource: 'streams', // /api/:version/users
32
30
  endpoints: {
@@ -66,23 +64,24 @@ let StreamingApi = class StreamingApi {
66
64
  StreamingApi = __decorate([
67
65
  apiController(streamingApiDefinition)
68
66
  ], StreamingApi);
69
- async function* counter() {
67
+ async function* counter(cancellationSignal) {
70
68
  let currentNumber = 0;
71
- while (Application.shutdownSignal.isUnset && (currentNumber < 10)) {
72
- yield (`${++currentNumber}`).toString();
73
- logger.info(`yield: "${currentNumber}"`);
74
- await cancelableTimeout(1000, Application.shutdownSignal);
69
+ while (cancellationSignal.isUnset && (currentNumber < 10)) {
70
+ yield String(++currentNumber);
71
+ console.log(`yield: "${currentNumber}"`);
72
+ await cancelableTimeout(1000, cancellationSignal);
75
73
  }
76
74
  }
77
75
  const StreamingApiClient = compileClient(streamingApiDefinition);
78
76
  async function clientTest() {
77
+ const application = inject(Application);
79
78
  const streamingApiClient = inject(StreamingApiClient);
80
79
  await timeout(250); // allow server to start
81
- const response = await streamingApiClient.echo(undefined, getReadableStreamFromIterable(counter()).pipeThrough(encodeUtf8Stream()));
80
+ const response = await streamingApiClient.echo(undefined, getReadableStreamFromIterable(counter(application.shutdownSignal)).pipeThrough(encodeUtf8Stream()));
82
81
  for await (const responseChunk of getReadableStreamIterable(response.pipeThrough(decodeTextStream()))) {
83
- logger.info(`response: "${responseChunk}"\n`);
82
+ console.log(`response: "${responseChunk}"\n`);
84
83
  }
85
- await Application.shutdown();
84
+ await application.shutdown();
86
85
  }
87
86
  function bootstrap() {
88
87
  configureNodeHttpServer();
@@ -90,7 +89,6 @@ function bootstrap() {
90
89
  configureUndiciHttpClientAdapter({ dispatcher: new Agent({ keepAliveMaxTimeout: 1 }) });
91
90
  configureHttpClient({ baseUrl: 'http://localhost:8000' });
92
91
  }
93
- Application.run({ bootstrap }, WebServerModule, clientTest);
94
92
  function eventsSource() {
95
93
  const events = new ServerSentEventsSource();
96
94
  void (async () => {
@@ -105,3 +103,8 @@ function eventsSource() {
105
103
  })().catch((error) => console.error(error));
106
104
  return events;
107
105
  }
106
+ Application.run('Test', [
107
+ provideInitializer(bootstrap),
108
+ provideModules(WebServerModule, clientTest),
109
+ provideSignalHandler(),
110
+ ]);
@@ -1,12 +1,12 @@
1
1
  import '../../polyfills.js';
2
2
  import { writeFile } from 'node:fs/promises';
3
- import { Application } from '../../application/index.js';
3
+ import { Application, provideModules, provideSignalHandler } from '../../application/index.js';
4
4
  import { BrowserService } from '../../browser/browser.service.js';
5
5
  import { inject, injectAsync } from '../../injector/inject.js';
6
6
  import { Logger } from '../../logger/logger.js';
7
7
  import { timeout } from '../../utils/timing.js';
8
8
  async function main() {
9
- const logger = inject(Logger).subModule('BROWSER');
9
+ const logger = inject(Logger, 'BROWSER');
10
10
  const browserService = await injectAsync(BrowserService);
11
11
  const browser = await browserService.newBrowser({ headless: false });
12
12
  const context = await browser.newContext();
@@ -20,4 +20,7 @@ async function main() {
20
20
  await page.navigate('file:///tmp/pdf.pdf');
21
21
  await page.waitForClose();
22
22
  }
23
- Application.run(main);
23
+ Application.run('Test', [
24
+ provideModules(main),
25
+ provideSignalHandler(),
26
+ ]);
@@ -9,7 +9,7 @@ import { configureAiService } from '../../ai/index.js';
9
9
  import { MockApiRequestTokenProvider } from '../../api/server/api-request-token.provider.js';
10
10
  import { configureApiServer } from '../../api/server/module.js';
11
11
  import { Application } from '../../application/application.js';
12
- import { configureTstdl } from '../../core.js';
12
+ import { provideInitializer, provideModules, provideSignalHandler } from '../../application/index.js';
13
13
  import { DocumentManagementAuthorizationService } from '../../document-management/index.js';
14
14
  import { configureDocumentManagement } from '../../document-management/server/configure.js';
15
15
  import { DocumentCategoryTypeService, DocumentCollectionService, DocumentManagementAncillaryService, DocumentManagementApiController, DocumentRequestService } from '../../document-management/server/index.js';
@@ -83,7 +83,6 @@ AllowAllDocumentManagementAuthorizationService = __decorate([
83
83
  export { AllowAllDocumentManagementAuthorizationService };
84
84
  async function bootstrap() {
85
85
  const injector = inject(Injector);
86
- configureTstdl();
87
86
  configureNodeHttpServer();
88
87
  configurePostgresQueue();
89
88
  configureLocalMessageBus();
@@ -154,4 +153,8 @@ async function main() {
154
153
  }
155
154
  console.log(`Collections: ${collections.map((collection) => collection.id).join(',')}`);
156
155
  }
157
- Application.run({ bootstrap }, main, WebServerModule);
156
+ Application.run('DocumentManagementTest', [
157
+ provideInitializer(bootstrap),
158
+ provideModules(main, WebServerModule),
159
+ provideSignalHandler(),
160
+ ]);
@@ -1,5 +1,6 @@
1
1
  import '../../polyfills.js';
2
2
  import { Application } from '../../application/application.js';
3
+ import { provideModules, provideSignalHandler } from '../../application/index.js';
3
4
  import { configureUndiciHttpClientAdapter } from '../../http/client/adapters/undici.adapter.js';
4
5
  import { HttpClient } from '../../http/client/index.js';
5
6
  import { inject } from '../../injector/inject.js';
@@ -9,10 +10,13 @@ async function main() {
9
10
  const response = await httpClient.get('https://httpbin.org/anything/:whatever', {
10
11
  parameters: {
11
12
  whatever: 'foobar',
12
- anotherParameter: 'hello-world'
13
- }
13
+ anotherParameter: 'hello-world',
14
+ },
14
15
  });
15
16
  const body = await response.body.readAsJson();
16
17
  console.log(response.asObject(), body);
17
18
  }
18
- Application.run(main);
19
+ Application.run('Test', [
20
+ provideModules(main),
21
+ provideSignalHandler(),
22
+ ]);
@@ -1,6 +1,7 @@
1
1
  import { resolve } from 'node:path';
2
2
  import { fileURLToPath } from 'node:url';
3
3
  import { Application } from '../../application/application.js';
4
+ import { provideModules, provideSignalHandler } from '../../application/index.js';
4
5
  import { injectAsync } from '../../injector/inject.js';
5
6
  import { NodemailerMailClient } from '../../mail/clients/nodemailer.mail-client.js';
6
7
  import { MailService, configureMail } from '../../mail/index.js';
@@ -13,7 +14,6 @@ import { StringTemplateRenderer } from '../../templates/renderers/string.templat
13
14
  import { configureFileTemplateResolver } from '../../templates/resolvers/file.template-resolver.js';
14
15
  import { StringTemplateResolver } from '../../templates/resolvers/string.template-resolver.js';
15
16
  import { integer, string } from '../../utils/config-parser.js';
16
- import { configureTstdl } from '../../core.js';
17
17
  let dirname;
18
18
  try {
19
19
  dirname = fileURLToPath(new URL('.', import.meta.url));
@@ -21,22 +21,21 @@ try {
21
21
  catch {
22
22
  dirname = __dirname;
23
23
  }
24
- configureTstdl();
25
24
  configureMail({
26
25
  defaultClientConfig: {
27
26
  host: string('HOST', '127.0.0.01'),
28
27
  port: integer('PORT', 25),
29
28
  auth: {
30
29
  user: string('USER', 'user'),
31
- password: string('PASS', 'password')
32
- }
30
+ password: string('PASS', 'password'),
31
+ },
33
32
  },
34
- client: NodemailerMailClient
33
+ client: NodemailerMailClient,
35
34
  });
36
35
  configureTemplates({
37
36
  templateProvider: FileTemplateProvider,
38
37
  templateRenderers: [MjmlTemplateRenderer, HandlebarsTemplateRenderer, JsxTemplateRenderer, StringTemplateRenderer],
39
- templateResolvers: [StringTemplateResolver]
38
+ templateResolvers: [StringTemplateResolver],
40
39
  });
41
40
  configureFileTemplateProvider({ basePath: resolve(dirname, 'templates') });
42
41
  configureFileTemplateResolver({ basePath: resolve(dirname.replace('/dist', '/source'), 'templates') });
@@ -45,4 +44,7 @@ async function test() {
45
44
  const result = await service.sendTemplate('hello-name', { from: string('FROM', string('USER', 'user@example.com')), to: string('TO', 'user@example.com') }, { name: 'Max Mustermann' });
46
45
  console.log(result);
47
46
  }
48
- Application.run(test);
47
+ Application.run('Test', [
48
+ provideModules(test),
49
+ provideSignalHandler(),
50
+ ]);
@@ -2,8 +2,8 @@ import { writeFileSync } from 'node:fs';
2
2
  import { resolve } from 'node:path';
3
3
  import { fileURLToPath } from 'node:url';
4
4
  import { Application } from '../../application/application.js';
5
+ import { provideModules, provideSignalHandler } from '../../application/index.js';
5
6
  import { BrowserService } from '../../browser/browser.service.js';
6
- import { configureTstdl } from '../../core.js';
7
7
  import { inject } from '../../injector/inject.js';
8
8
  import { Injector } from '../../injector/injector.js';
9
9
  import { PdfService } from '../../pdf/pdf.service.js';
@@ -21,11 +21,10 @@ try {
21
21
  catch {
22
22
  dirname = __dirname;
23
23
  }
24
- configureTstdl();
25
24
  configureTemplates({
26
25
  templateProvider: FileTemplateProvider,
27
26
  templateResolvers: [FileTemplateResolver, StringTemplateResolver],
28
- templateRenderers: [MjmlTemplateRenderer, HandlebarsTemplateRenderer, StringTemplateRenderer]
27
+ templateRenderers: [MjmlTemplateRenderer, HandlebarsTemplateRenderer, StringTemplateRenderer],
29
28
  });
30
29
  configureFileTemplateProvider({ basePath: resolve(dirname, 'templates') });
31
30
  configureFileTemplateResolver({ basePath: resolve(dirname.replace('dist', 'source'), 'templates') });
@@ -35,7 +34,7 @@ async function main() {
35
34
  const pdfService = await injector.resolveAsync(PdfService);
36
35
  const [result1, result2] = await Promise.all([
37
36
  pdfService.renderTemplate('hello-name', { name: 'Max Mustermann' }),
38
- pdfService.renderUrl('https://google.de')
37
+ pdfService.renderUrl('https://google.de'),
39
38
  ]);
40
39
  console.log(`Resulting PDFs have ${result1.length} and ${result2.length} bytes.`);
41
40
  writeFileSync('/tmp/template.pdf', result1);
@@ -46,9 +45,12 @@ async function main() {
46
45
  const page2 = await context.newPage();
47
46
  await Promise.all([
48
47
  page1.navigate('file:///tmp/template.pdf'),
49
- page2.navigate('file:///tmp/page.pdf')
48
+ page2.navigate('file:///tmp/page.pdf'),
50
49
  ]);
51
50
  await page1.waitForClose();
52
51
  await page2.waitForClose();
53
52
  }
54
- Application.run(main);
53
+ Application.run('Test', [
54
+ provideModules(main),
55
+ provideSignalHandler(),
56
+ ]);
@@ -1,7 +1,7 @@
1
1
  import { resolve } from 'node:path';
2
2
  import { fileURLToPath } from 'node:url';
3
3
  import { Application } from '../../application/application.js';
4
- import { configureTstdl } from '../../core.js';
4
+ import { provideModules, provideSignalHandler } from '../../application/index.js';
5
5
  import { inject } from '../../injector/inject.js';
6
6
  import { configureTemplates, TemplateService } from '../../templates/index.js';
7
7
  import { configureFileTemplateProvider, FileTemplateProvider } from '../../templates/providers/file.template-provider.js';
@@ -18,11 +18,10 @@ try {
18
18
  catch {
19
19
  dirname = __dirname;
20
20
  }
21
- configureTstdl();
22
21
  configureTemplates({
23
22
  templateProvider: FileTemplateProvider,
24
23
  templateResolvers: [FileTemplateResolver, JsxTemplateResolver, StringTemplateResolver],
25
- templateRenderers: [HandlebarsTemplateRenderer, JsxTemplateRenderer, StringTemplateRenderer]
24
+ templateRenderers: [HandlebarsTemplateRenderer, JsxTemplateRenderer, StringTemplateRenderer],
26
25
  });
27
26
  configureFileTemplateProvider({ basePath: resolve(dirname, 'templates') });
28
27
  configureFileTemplateResolver({ basePath: resolve(dirname.replace('dist', 'source'), 'templates') });
@@ -32,7 +31,10 @@ async function test() {
32
31
  const jsxResult = await templateService.render('hello-jsx', { name: 'Max Mustermann' });
33
32
  console.log({
34
33
  handlebars: handlebarsResult.fields,
35
- jsx: jsxResult.fields
34
+ jsx: jsxResult.fields,
36
35
  });
37
36
  }
38
- Application.run(test);
37
+ Application.run('Test', [
38
+ provideModules(test),
39
+ provideSignalHandler(),
40
+ ]);
@@ -1,5 +1,4 @@
1
1
  import { type CancellationSignal } from '../../cancellation/index.js';
2
- import { dispose, type Disposable } from '../../disposable/index.js';
3
2
  import type { OneOrMany, Record, TypedOmit, UndefinableJson, UndefinableJsonObject } from '../../types/index.js';
4
3
  import { HttpForm, type HttpFormObject } from '../http-form.js';
5
4
  import { HttpHeaders, type HttpHeadersObject } from '../http-headers.js';
@@ -114,7 +113,7 @@ export declare class HttpClientRequest implements Disposable {
114
113
  get abortSignal(): CancellationSignal;
115
114
  constructor(url: string, method?: HttpMethod, options?: HttpClientRequestOptions);
116
115
  constructor(requestObject: HttpClientRequestObject);
117
- [dispose](): void;
116
+ [Symbol.dispose](): void;
118
117
  /** Abort the request */
119
118
  abort(): void;
120
119
  clone(): HttpClientRequest;
@@ -1,5 +1,4 @@
1
1
  import { CancellationToken } from '../../cancellation/index.js';
2
- import { dispose } from '../../disposable/index.js';
3
2
  import { clone } from '../../utils/clone.js';
4
3
  import { objectEntries } from '../../utils/object/object.js';
5
4
  import { isArray, isBlob, isDefined, isString, isUint8Array, isUndefined } from '../../utils/type-guards.js';
@@ -107,7 +106,7 @@ export class HttpClientRequest {
107
106
  this.context = requestOptions.context ?? {};
108
107
  this.#abortToken = requestOptions.abortSignal?.createChild() ?? new CancellationToken();
109
108
  }
110
- [dispose]() {
109
+ [Symbol.dispose]() {
111
110
  this.#abortToken.set();
112
111
  this.#abortToken.complete();
113
112
  }
@@ -1,5 +1,3 @@
1
- import type { AsyncDisposable } from '../../disposable/index.js';
2
- import { disposeAsync } from '../../disposable/index.js';
3
1
  import type { HttpServerRequest, HttpServerResponse } from '../../http/server/index.js';
4
2
  export type HttpServerRequestContext<Context = unknown> = {
5
3
  request: HttpServerRequest;
@@ -12,5 +10,5 @@ export declare abstract class HttpServer<Context = unknown> implements AsyncIter
12
10
  abstract listen(port: number): Promise<void>;
13
11
  abstract close(timeout: number): Promise<void>;
14
12
  abstract [Symbol.asyncIterator](): AsyncIterator<HttpServerRequestContext<Context>>;
15
- abstract [disposeAsync](): Promise<void>;
13
+ abstract [Symbol.asyncDispose](): Promise<void>;
16
14
  }
@@ -1,3 +1,2 @@
1
- import { disposeAsync } from '../../disposable/index.js';
2
1
  export class HttpServer {
3
2
  }
@@ -1,5 +1,4 @@
1
1
  import * as Http from 'node:http';
2
- import { disposeAsync, type AsyncDisposable } from '../../../disposable/index.js';
3
2
  import { afterResolve } from '../../../injector/index.js';
4
3
  import { HttpServer, type HttpServerRequestContext } from '../http-server.js';
5
4
  export type NodeHttpServerContext = {
@@ -11,7 +10,7 @@ export declare class NodeHttpServer extends HttpServer<NodeHttpServerContext> im
11
10
  private untrackConnectedSockets?;
12
11
  get connectedSocketsCount(): number;
13
12
  [afterResolve](): void;
14
- [disposeAsync](): Promise<void>;
13
+ [Symbol.asyncDispose](): Promise<void>;
15
14
  listen(port: number): Promise<void>;
16
15
  close(timeout: number): Promise<void>;
17
16
  [Symbol.asyncIterator](): AsyncIterator<HttpServerRequestContext<NodeHttpServerContext>>;
@@ -11,7 +11,6 @@ import { Writable } from 'node:stream';
11
11
  import { bindNodeCallback, share } from 'rxjs';
12
12
  import { match, P } from 'ts-pattern';
13
13
  import { CancellationToken } from '../../../cancellation/index.js';
14
- import { disposeAsync } from '../../../disposable/index.js';
15
14
  import { HttpHeaders } from '../../../http/http-headers.js';
16
15
  import { HttpQuery } from '../../../http/http-query.js';
17
16
  import { afterResolve, inject, Singleton } from '../../../injector/index.js';
@@ -38,7 +37,7 @@ let NodeHttpServer = NodeHttpServer_1 = class NodeHttpServer extends HttpServer
38
37
  [afterResolve]() {
39
38
  this.#httpServer.on('request', (request, response) => this.#requestIterable.feed({ request, response }));
40
39
  }
41
- async [disposeAsync]() {
40
+ async [Symbol.asyncDispose]() {
42
41
  if (this.#httpServer.listening) {
43
42
  await this.close(3000);
44
43
  this.#requestIterable.end();
package/import.js CHANGED
@@ -1,3 +1,3 @@
1
1
  export async function dynamicImport(id) {
2
- return import(/* @vite-ignore */ id);
2
+ return await import(/* @vite-ignore */ id);
3
3
  }
@@ -1,10 +1,10 @@
1
- import { type AsyncDisposable } from '../disposable/disposable.js';
2
1
  import type { OneOrMany, Record, TypedOmit } from '../types/index.js';
3
2
  import { type InjectOptions } from './inject.js';
4
3
  import { type ResolveArgument } from './interfaces.js';
5
4
  import { type Provider } from './provider.js';
6
5
  import { type InjectionToken } from './token.js';
7
6
  import type { RegistrationOptions, ResolveOptions } from './types.js';
7
+ export type DisposeHandler = Disposable | AsyncDisposable | (() => PromiseLike<void> | void);
8
8
  export type ProvidersItem<T = any, A = any, D extends Record = Record> = Provider<T, A, D> & {
9
9
  provide: InjectionToken<T, A>;
10
10
  multi?: boolean;
@@ -1,8 +1,7 @@
1
1
  import type { CancellationSignal } from '../cancellation/index.js';
2
- import type { AsyncDisposeHandler } from '../disposable/async-disposer.js';
3
2
  import type { Record } from '../types/index.js';
4
3
  import type { ForwardRefTypeHint } from '../utils/object/forward-ref.js';
5
- import type { Injector, ProvidersItem } from './injector.js';
4
+ import type { DisposeHandler, Injector, ProvidersItem } from './injector.js';
6
5
  import type { ResolveArgument } from './interfaces.js';
7
6
  import type { InjectionToken } from './token.js';
8
7
  /**
@@ -15,12 +14,12 @@ export type Lifecycle = 'transient' | 'resolution' | 'injector' | 'singleton';
15
14
  export type ResolveContext<D extends Record> = Pick<Injector, 'resolve' | 'resolveAll'> & {
16
15
  readonly data: ResolveContextData<D>;
17
16
  readonly cancellationSignal: CancellationSignal;
18
- addDisposeHandler(handler: AsyncDisposeHandler): void;
17
+ addDisposeHandler(handler: DisposeHandler): void;
19
18
  };
20
19
  export type AfterResolveContext<D extends Record> = {
21
20
  readonly data: ResolveContextData<D>;
22
21
  readonly cancellationSignal: CancellationSignal;
23
- addDisposeHandler(handler: AsyncDisposeHandler): void;
22
+ addDisposeHandler(handler: DisposeHandler): void;
24
23
  };
25
24
  export type Mapper<T = any, U = unknown> = (value: T) => U;
26
25
  export type ArgumentProvider<T = unknown, D extends Record = Record> = (context: ResolveContext<D>) => T;
package/lock/lock.d.ts CHANGED
@@ -1,25 +1,24 @@
1
+ import type { CancellationSignal } from '../cancellation/index.js';
1
2
  import type { Resolvable } from '../injector/index.js';
2
3
  import { resolveArgumentType } from '../injector/index.js';
3
- export type LockedFunction<R> = (controller: LockController) => R | Promise<R>;
4
- export type AcquireResult<Throw extends boolean> = Throw extends true ? LockController : (LockController | false);
5
- export type UsingResult<Throw extends boolean, R> = Throw extends true ? ({
4
+ export type LockedFunction<R> = (controller: UseLockController) => R | Promise<R>;
5
+ export type LockTryUseResult<R> = ({
6
6
  success: true;
7
7
  result: R;
8
- }) : ({
9
- success: true;
10
- result: R;
11
- } | {
8
+ }) | ({
12
9
  success: false;
13
- result: undefined;
10
+ result?: undefined;
14
11
  });
15
- export interface LockController {
12
+ export interface UseLockController {
16
13
  /**
17
- * whether the the lock is lost or not. Can happen for example if it couldn't be renewed
14
+ * Whether the the lock is lost or not. Can happen for example if it couldn't be renewed
18
15
  * because the network connection is lost (depending on implementation)
19
16
  */
20
17
  readonly lost: boolean;
18
+ }
19
+ export interface LockController extends UseLockController {
21
20
  /** manually release lock */
22
- release(): void | Promise<void>;
21
+ release(): Promise<void>;
23
22
  }
24
23
  /** resource */
25
24
  export type LockArgument = string | {
@@ -27,22 +26,42 @@ export type LockArgument = string | {
27
26
  resource: string;
28
27
  };
29
28
  export declare abstract class Lock implements Resolvable<LockArgument> {
29
+ protected readonly cancellationSignal: CancellationSignal;
30
30
  readonly resource: string;
31
31
  readonly [resolveArgumentType]: LockArgument;
32
- constructor(resource: string);
32
+ constructor(resource: string, cancellationSignal: CancellationSignal);
33
+ /**
34
+ * Tries to acquire a lock for the resource, it must be manually released.
35
+ * @param timeout How long to try to get a lock in milliseconds. If undefined, it tries only once.
36
+ * @returns A lock controller if successful, otherwise `false`.
37
+ */
38
+ tryAcquire(timeout?: number): Promise<LockController | false>;
39
+ /**
40
+ * Acquires a lock for the resource, it must be manually released.
41
+ * Throws an error if the lock cannot be acquired within the specified timeout.
42
+ * @param timeout How long to try to get a lock in milliseconds. If undefined, it tries forever.
43
+ */
44
+ acquire(timeout?: number): Promise<LockController>;
45
+ /**
46
+ * Tries to acquire a lock for the resource and releases it automatically after the provided function has returned or thrown.
47
+ * @param timeout How long to try to get a lock in milliseconds. If undefined, it tries only once.
48
+ * @param func Function to run when the lock is acquired.
49
+ * @returns A result object indicating success and containing the return value of the function.
50
+ */
51
+ tryUse<R>(timeout: number | undefined, func: LockedFunction<R>): Promise<LockTryUseResult<R>>;
33
52
  /**
34
- * acquire a lock for the resource, it must be manually released
35
- * @param timeout how long to try to get a lock. If undefined it's tries forever
36
- * @param throwOnFail throw if resource is locked and we couldn't acquire it in the specified timeout
53
+ * Acquires a lock for the resource and releases it automatically after the provided function has returned or thrown.
54
+ * Throws an error if the lock cannot be acquired within the specified timeout.
55
+ * @param timeout How long to try to get a lock in milliseconds. If undefined, it tries forever.
56
+ * @param func Function to run when the lock is acquired.
57
+ * @returns The return value of the function.
37
58
  */
38
- abstract acquire<Throw extends boolean>(timeout: number | undefined, throwOnFail: Throw): Promise<AcquireResult<Throw>>;
59
+ use<R>(timeout: number | undefined, func: LockedFunction<R>): Promise<R>;
39
60
  /**
40
- * acquire a lock for the resource and release it automatically after the provided function has returned or thrown
41
- * @param timeout how long to try to get a lock. If undefined it's tries forever
42
- * @param throwOnFail throw if resource is locked and we couldn't acquire it in the specified timeout
43
- * @param func function to run when lock is acquired
61
+ * try to acquire the lock for the resource, returns a controller if successful
62
+ * returns false if the lock is already held by another process
44
63
  */
45
- abstract use<Throw extends boolean, R>(timeout: number | undefined, throwOnFail: Throw, func: LockedFunction<R>): Promise<UsingResult<Throw, R>>;
64
+ abstract tryAcquireOnce(): Promise<LockController | false>;
46
65
  /** check if resource is locked */
47
66
  abstract exists(): Promise<boolean>;
48
67
  }
package/lock/lock.js CHANGED
@@ -1,7 +1,80 @@
1
1
  import { resolveArgumentType } from '../injector/index.js';
2
+ import { Timer } from '../utils/timer.js';
3
+ import { cancelableTimeout } from '../utils/timing.js';
4
+ import { isUndefined } from '../utils/type-guards.js';
2
5
  export class Lock {
6
+ cancellationSignal;
3
7
  resource;
4
- constructor(resource) {
8
+ constructor(resource, cancellationSignal) {
9
+ this.cancellationSignal = cancellationSignal;
5
10
  this.resource = resource;
6
11
  }
12
+ /**
13
+ * Tries to acquire a lock for the resource, it must be manually released.
14
+ * @param timeout How long to try to get a lock in milliseconds. If undefined, it tries only once.
15
+ * @returns A lock controller if successful, otherwise `false`.
16
+ */
17
+ async tryAcquire(timeout) {
18
+ if (isUndefined(timeout) || (timeout <= 0)) {
19
+ return await this.tryAcquireOnce();
20
+ }
21
+ const delay = Math.max(50, Math.min(1000, timeout / 10));
22
+ const timer = new Timer(true);
23
+ do {
24
+ const result = await this.tryAcquireOnce();
25
+ if (result !== false) {
26
+ return result;
27
+ }
28
+ const delayResult = await cancelableTimeout(delay, this.cancellationSignal);
29
+ if (delayResult == 'canceled') {
30
+ break;
31
+ }
32
+ } while (timer.milliseconds < timeout);
33
+ return false;
34
+ }
35
+ /**
36
+ * Acquires a lock for the resource, it must be manually released.
37
+ * Throws an error if the lock cannot be acquired within the specified timeout.
38
+ * @param timeout How long to try to get a lock in milliseconds. If undefined, it tries forever.
39
+ */
40
+ async acquire(timeout) {
41
+ const result = await this.tryAcquire(timeout);
42
+ if (result === false) {
43
+ throw new Error(`Failed to acquire lock for resource '${this.resource}'.`);
44
+ }
45
+ return result;
46
+ }
47
+ /**
48
+ * Tries to acquire a lock for the resource and releases it automatically after the provided function has returned or thrown.
49
+ * @param timeout How long to try to get a lock in milliseconds. If undefined, it tries only once.
50
+ * @param func Function to run when the lock is acquired.
51
+ * @returns A result object indicating success and containing the return value of the function.
52
+ */
53
+ async tryUse(timeout, func) {
54
+ const controller = await this.tryAcquire(timeout);
55
+ if (controller == false) {
56
+ return { success: false, result: undefined };
57
+ }
58
+ try {
59
+ const result = await func(controller);
60
+ return { success: true, result };
61
+ }
62
+ finally {
63
+ await controller.release();
64
+ }
65
+ }
66
+ /**
67
+ * Acquires a lock for the resource and releases it automatically after the provided function has returned or thrown.
68
+ * Throws an error if the lock cannot be acquired within the specified timeout.
69
+ * @param timeout How long to try to get a lock in milliseconds. If undefined, it tries forever.
70
+ * @param func Function to run when the lock is acquired.
71
+ * @returns The return value of the function.
72
+ */
73
+ async use(timeout, func) {
74
+ const result = await this.tryUse(timeout, func);
75
+ if (!result.success) {
76
+ throw new Error(`Failed to acquire lock for resource '${this.resource}'.`);
77
+ }
78
+ return result.result;
79
+ }
7
80
  }
@@ -0,0 +1,7 @@
1
+ CREATE TABLE "lock"."lock" (
2
+ "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
3
+ "resource" text NOT NULL,
4
+ "key" text NOT NULL,
5
+ "expiration" timestamp with time zone NOT NULL,
6
+ CONSTRAINT "lock_resource_unique" UNIQUE("resource")
7
+ );