@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
@@ -0,0 +1,65 @@
1
+ {
2
+ "id": "2d26f59a-2c92-4d3c-aea3-93aa48a91d5f",
3
+ "prevId": "00000000-0000-0000-0000-000000000000",
4
+ "version": "7",
5
+ "dialect": "postgresql",
6
+ "tables": {
7
+ "lock.lock": {
8
+ "name": "lock",
9
+ "schema": "lock",
10
+ "columns": {
11
+ "id": {
12
+ "name": "id",
13
+ "type": "uuid",
14
+ "primaryKey": true,
15
+ "notNull": true,
16
+ "default": "gen_random_uuid()"
17
+ },
18
+ "resource": {
19
+ "name": "resource",
20
+ "type": "text",
21
+ "primaryKey": false,
22
+ "notNull": true
23
+ },
24
+ "key": {
25
+ "name": "key",
26
+ "type": "text",
27
+ "primaryKey": false,
28
+ "notNull": true
29
+ },
30
+ "expiration": {
31
+ "name": "expiration",
32
+ "type": "timestamp with time zone",
33
+ "primaryKey": false,
34
+ "notNull": true
35
+ }
36
+ },
37
+ "indexes": {},
38
+ "foreignKeys": {},
39
+ "compositePrimaryKeys": {},
40
+ "uniqueConstraints": {
41
+ "lock_resource_unique": {
42
+ "name": "lock_resource_unique",
43
+ "nullsNotDistinct": false,
44
+ "columns": [
45
+ "resource"
46
+ ]
47
+ }
48
+ },
49
+ "policies": {},
50
+ "checkConstraints": {},
51
+ "isRLSEnabled": false
52
+ }
53
+ },
54
+ "enums": {},
55
+ "schemas": {},
56
+ "sequences": {},
57
+ "roles": {},
58
+ "policies": {},
59
+ "views": {},
60
+ "_meta": {
61
+ "columns": {},
62
+ "schemas": {},
63
+ "tables": {}
64
+ }
65
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "version": "7",
3
+ "dialect": "postgresql",
4
+ "entries": [
5
+ {
6
+ "idx": 0,
7
+ "version": "7",
8
+ "when": 1756898177209,
9
+ "tag": "0000_busy_tattoo",
10
+ "breakpoints": true
11
+ }
12
+ ]
13
+ }
@@ -0,0 +1,11 @@
1
+ import { relative, resolve } from 'node:path';
2
+ import { defineConfig } from 'drizzle-kit';
3
+ export default defineConfig({
4
+ dialect: 'postgresql',
5
+ out: relative('./', resolve(__dirname, './drizzle/').replace('dist', 'source')),
6
+ schema: resolve(__dirname, './models/schemas.js'),
7
+ migrations: {
8
+ schema: 'lock',
9
+ table: '_migrations',
10
+ },
11
+ });
@@ -0,0 +1,2 @@
1
+ export * from './provider.js';
2
+ export * from './module.js';
@@ -0,0 +1,2 @@
1
+ export * from './provider.js';
2
+ export * from './module.js';
@@ -0,0 +1,14 @@
1
+ import { type CancellationSignal } from '../../cancellation/index.js';
2
+ import type { Logger } from '../../logger/logger.js';
3
+ import type { EntityRepository } from '../../orm/server/index.js';
4
+ import { Lock, type LockController } from '../lock.js';
5
+ import type { PostgresLock } from './models/lock.model.js';
6
+ export declare class PostgresLockAdapter extends Lock {
7
+ #private;
8
+ constructor(repository: EntityRepository<PostgresLock>, resource: string, logger: Logger, cancellationSignal: CancellationSignal);
9
+ tryAcquireOnce(): Promise<LockController | false>;
10
+ exists(): Promise<boolean>;
11
+ private executeTryAcquire;
12
+ private tryRefresh;
13
+ private release;
14
+ }
@@ -0,0 +1,127 @@
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 { and, eq, lte, sql } from 'drizzle-orm';
11
+ import { CancellationToken } from '../../cancellation/index.js';
12
+ import { Injectable } from '../../injector/decorators.js';
13
+ import { TRANSACTION_TIMESTAMP } from '../../orm/sqls.js';
14
+ import { currentTimestamp } from '../../utils/date-time.js';
15
+ import { cancelableTimeoutUntil } from '../../utils/timing.js';
16
+ import { assertDefined, isDefined, isString, isUndefined } from '../../utils/type-guards.js';
17
+ import { Lock } from '../lock.js';
18
+ import { lock } from './models/schemas.js';
19
+ import { PostgresLockProvider } from './provider.js';
20
+ const expirationTime = 10000;
21
+ const renewBuffer = expirationTime / 2;
22
+ let PostgresLockAdapter = class PostgresLockAdapter extends Lock {
23
+ #lockRepository;
24
+ #logger;
25
+ constructor(repository, resource, logger, cancellationSignal) {
26
+ super(resource, cancellationSignal);
27
+ this.#lockRepository = repository;
28
+ this.#logger = logger;
29
+ }
30
+ async tryAcquireOnce() {
31
+ const key = crypto.randomUUID();
32
+ let result = await this.executeTryAcquire(this.resource, key);
33
+ if (result === false) {
34
+ return false;
35
+ }
36
+ const releaseToken = new CancellationToken();
37
+ let expiration = result;
38
+ const controller = {
39
+ get lost() {
40
+ return currentTimestamp() >= expiration;
41
+ },
42
+ release: async () => {
43
+ releaseToken.set();
44
+ await this.release(this.resource, key);
45
+ },
46
+ };
47
+ void (async () => {
48
+ await cancelableTimeoutUntil(expiration - renewBuffer, releaseToken);
49
+ while (!releaseToken.isSet && !controller.lost) {
50
+ try {
51
+ const refreshResult = await this.tryRefresh(this.resource, key);
52
+ expiration = (refreshResult === false) ? 0 : refreshResult;
53
+ }
54
+ catch (error) {
55
+ this.#logger.error(error);
56
+ }
57
+ finally {
58
+ await cancelableTimeoutUntil(Math.max(currentTimestamp() + 1000, expiration - renewBuffer), releaseToken);
59
+ }
60
+ }
61
+ })();
62
+ return controller;
63
+ }
64
+ async exists() {
65
+ return await this.#lockRepository.hasByQuery({
66
+ resource: this.resource,
67
+ expiration: { $gt: TRANSACTION_TIMESTAMP },
68
+ });
69
+ }
70
+ async executeTryAcquire(resource, key) {
71
+ const upsertQuery = this.#lockRepository.session
72
+ .insert(lock)
73
+ .values({
74
+ resource,
75
+ key,
76
+ expiration: sql `${TRANSACTION_TIMESTAMP} + INTERVAL '${sql.raw(expirationTime.toString())} milliseconds'`,
77
+ })
78
+ .onConflictDoUpdate({
79
+ target: this.#lockRepository.getColumn('resource'),
80
+ set: {
81
+ key: sql.raw(`excluded.${lock.key.name}`),
82
+ expiration: sql.raw(`excluded.${lock.expiration.name}`),
83
+ },
84
+ setWhere: lte(lock.expiration, TRANSACTION_TIMESTAMP),
85
+ })
86
+ .returning({ expiration: lock.expiration });
87
+ console.log(upsertQuery.toSQL());
88
+ const [result] = await upsertQuery;
89
+ if (isUndefined(result)) {
90
+ return false;
91
+ }
92
+ return result.expiration;
93
+ }
94
+ async tryRefresh(resource, key) {
95
+ const [result] = await this.#lockRepository.session
96
+ .update(lock)
97
+ .set({
98
+ expiration: sql `${TRANSACTION_TIMESTAMP} + INTERVAL '${sql.raw(expirationTime.toString())} milliseconds'`,
99
+ })
100
+ .where(and(eq(lock.resource, resource), eq(lock.key, key)))
101
+ .returning({ expiration: lock.expiration });
102
+ if (isUndefined(result)) {
103
+ return false;
104
+ }
105
+ return result.expiration;
106
+ }
107
+ async release(resource, key) {
108
+ const result = await this.#lockRepository.tryDeleteByQuery({ resource, key });
109
+ return isDefined(result);
110
+ }
111
+ };
112
+ PostgresLockAdapter = __decorate([
113
+ Injectable({
114
+ lifecycle: 'transient', provider: {
115
+ useFactory: (argument, context) => {
116
+ assertDefined(argument, 'Missing argument for lock.');
117
+ const argumentIsString = isString(argument);
118
+ const prefix = argumentIsString ? undefined : argument.prefix;
119
+ const resource = argumentIsString ? argument : argument.resource;
120
+ const provider = context.resolve(PostgresLockProvider, prefix);
121
+ return provider.get(resource);
122
+ },
123
+ },
124
+ }),
125
+ __metadata("design:paramtypes", [Function, String, Function, Function])
126
+ ], PostgresLockAdapter);
127
+ export { PostgresLockAdapter };
@@ -0,0 +1,2 @@
1
+ export * from './lock.model.js';
2
+ export * from './schemas.js';
@@ -0,0 +1,2 @@
1
+ export * from './lock.model.js';
2
+ export * from './schemas.js';
@@ -0,0 +1,7 @@
1
+ import { EntityWithoutMetadata } from '../../../orm/entity.js';
2
+ import { Timestamp } from '../../../orm/types.js';
3
+ export declare class PostgresLock extends EntityWithoutMetadata {
4
+ resource: string;
5
+ key: string;
6
+ expiration: Timestamp;
7
+ }
@@ -7,38 +7,30 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  var __metadata = (this && this.__metadata) || function (k, v) {
8
8
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
9
  };
10
- import { Array, Entity, Integer, Unique } from '../../orm/index.js';
11
- import { BooleanProperty, StringProperty } from '../../schema/index.js';
12
- export var Foo;
13
- (function (Foo) {
14
- Foo[Foo["Bar"] = 0] = "Bar";
15
- Foo[Foo["Baz"] = 1] = "Baz";
16
- })(Foo || (Foo = {}));
17
- export class User extends Entity {
18
- static entityName = 'User';
19
- name;
20
- nickNames;
21
- age;
22
- hasAge;
23
- mail;
24
- }
10
+ import { ExpiresAt, Table } from '../../../orm/decorators.js';
11
+ import { EntityWithoutMetadata } from '../../../orm/entity.js';
12
+ import { Timestamp, Unique } from '../../../orm/types.js';
13
+ import { StringProperty } from '../../../schema/index.js';
14
+ let PostgresLock = class PostgresLock extends EntityWithoutMetadata {
15
+ resource;
16
+ key;
17
+ expiration;
18
+ };
25
19
  __decorate([
20
+ Unique(),
26
21
  StringProperty(),
27
22
  __metadata("design:type", String)
28
- ], User.prototype, "name", void 0);
29
- __decorate([
30
- Array(String),
31
- __metadata("design:type", Array)
32
- ], User.prototype, "nickNames", void 0);
33
- __decorate([
34
- Integer({ nullable: true }),
35
- __metadata("design:type", Object)
36
- ], User.prototype, "age", void 0);
23
+ ], PostgresLock.prototype, "resource", void 0);
37
24
  __decorate([
38
- BooleanProperty(),
39
- __metadata("design:type", Boolean)
40
- ], User.prototype, "hasAge", void 0);
41
- __decorate([
42
- Unique(),
25
+ StringProperty(),
43
26
  __metadata("design:type", String)
44
- ], User.prototype, "mail", void 0);
27
+ ], PostgresLock.prototype, "key", void 0);
28
+ __decorate([
29
+ ExpiresAt(),
30
+ Timestamp(),
31
+ __metadata("design:type", Number)
32
+ ], PostgresLock.prototype, "expiration", void 0);
33
+ PostgresLock = __decorate([
34
+ Table('lock')
35
+ ], PostgresLock);
36
+ export { PostgresLock };
@@ -0,0 +1,3 @@
1
+ import { PostgresLock } from './lock.model.js';
2
+ export declare const lockSchema: import("../../../orm/server/database-schema.js").DatabaseSchema<"lock">;
3
+ export declare const lock: import("../../../orm/server/types.js").PgTableFromType<typeof PostgresLock, "lock">;
@@ -0,0 +1,4 @@
1
+ import { databaseSchema } from '../../../orm/server/database-schema.js';
2
+ import { PostgresLock } from './lock.model.js';
3
+ export const lockSchema = databaseSchema('lock');
4
+ export const lock = lockSchema.getTable(PostgresLock);
@@ -0,0 +1,6 @@
1
+ import { type DatabaseConfig } from '../../orm/server/index.js';
2
+ export declare class PostgresLockModuleConfig {
3
+ database?: DatabaseConfig;
4
+ }
5
+ export declare function configurePostgresLock(config?: PostgresLockModuleConfig): void;
6
+ export declare function migratePostgresLockSchema(): Promise<void>;
@@ -0,0 +1,26 @@
1
+ import { inject, Injector } from '../../injector/index.js';
2
+ import { Database, migrate } from '../../orm/server/index.js';
3
+ import { isDefined } from '../../utils/type-guards.js';
4
+ import { Lock } from '../lock.js';
5
+ import { LockProvider } from '../provider.js';
6
+ import { PostgresLockProvider } from './provider.js';
7
+ import { PostgresLockAdapter } from './lock.js';
8
+ export class PostgresLockModuleConfig {
9
+ database;
10
+ }
11
+ export function configurePostgresLock(config) {
12
+ if (isDefined(config)) {
13
+ Injector.register(PostgresLockModuleConfig, { useValue: config });
14
+ }
15
+ Injector.registerSingleton(LockProvider, { useToken: PostgresLockProvider });
16
+ Injector.registerSingleton(Lock, { useToken: PostgresLockAdapter });
17
+ }
18
+ export async function migratePostgresLockSchema() {
19
+ const connection = inject(PostgresLockModuleConfig, undefined, { optional: true })?.database?.connection;
20
+ const database = inject(Database, connection);
21
+ await migrate(database, {
22
+ migrationsSchema: 'lock',
23
+ migrationsTable: '_migrations',
24
+ migrationsFolder: import.meta.resolve('./drizzle').replace('file://', ''),
25
+ });
26
+ }
@@ -0,0 +1,6 @@
1
+ import type { Lock } from '../lock.js';
2
+ import { LockProvider } from '../provider.js';
3
+ export declare class PostgresLockProvider extends LockProvider {
4
+ #private;
5
+ get(resource: string): Lock;
6
+ }
@@ -0,0 +1,29 @@
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 { Singleton, provide } from '../../injector/index.js';
8
+ import { DatabaseConfig } from '../../orm/server/index.js';
9
+ import { EntityRepositoryConfig, injectRepository } from '../../orm/server/repository.js';
10
+ import { LockProvider } from '../provider.js';
11
+ import { PostgresLockAdapter } from './lock.js';
12
+ import { PostgresLock } from './models/lock.model.js';
13
+ import { PostgresLockModuleConfig } from './module.js';
14
+ let PostgresLockProvider = class PostgresLockProvider extends LockProvider {
15
+ #lockRepository = injectRepository(PostgresLock);
16
+ get(resource) {
17
+ const resourceString = this.getResourceString(resource, this._prefix);
18
+ return new PostgresLockAdapter(this.#lockRepository, resourceString, this.logger, this.cancellationSignal);
19
+ }
20
+ };
21
+ PostgresLockProvider = __decorate([
22
+ Singleton({
23
+ providers: [
24
+ provide(EntityRepositoryConfig, { useValue: { schema: 'lock' } }),
25
+ { provide: DatabaseConfig, useFactory: (_, context) => context.resolve(PostgresLockModuleConfig).database ?? context.resolve(DatabaseConfig, undefined, { skipSelf: true }) },
26
+ ],
27
+ })
28
+ ], PostgresLockProvider);
29
+ export { PostgresLockProvider };
@@ -1,10 +1,20 @@
1
+ import { CancellationSignal } from '../cancellation/index.js';
1
2
  import type { Resolvable } from '../injector/index.js';
2
- import { resolveArgumentType } from '../injector/index.js';
3
+ import { Injector, resolveArgumentType } from '../injector/index.js';
4
+ import { Logger } from '../logger/logger.js';
3
5
  import type { Lock } from './lock.js';
4
6
  /** prefix */
5
7
  export type LockProviderArgument = string;
6
8
  export declare abstract class LockProvider implements Resolvable<LockProviderArgument> {
9
+ #private;
10
+ protected readonly _prefix: string | undefined;
11
+ protected readonly injector: Injector;
12
+ protected readonly lockInjector: Injector;
13
+ protected readonly logger: Logger;
14
+ protected readonly cancellationSignal: CancellationSignal;
7
15
  readonly [resolveArgumentType]: LockProviderArgument;
8
- abstract prefix(prefix: string): LockProvider;
16
+ constructor();
17
+ prefix(prefix: string): this;
9
18
  abstract get(resource: string): Lock;
19
+ protected getResourceString(resource: string, prefix?: string): string;
10
20
  }
package/lock/provider.js CHANGED
@@ -1,3 +1,26 @@
1
- import { resolveArgumentType } from '../injector/index.js';
1
+ import { CancellationSignal } from '../cancellation/index.js';
2
+ import { inject, injectArgument, Injector, resolveArgumentType } from '../injector/index.js';
3
+ import { Logger } from '../logger/logger.js';
4
+ import { isDefined, isString } from '../utils/type-guards.js';
2
5
  export class LockProvider {
6
+ #type;
7
+ _prefix = injectArgument(this, { optional: true });
8
+ injector = inject(Injector);
9
+ lockInjector = this.injector.fork(`LockInjector${isString(this._prefix) ? `:${this._prefix}` : ''}`);
10
+ logger;
11
+ cancellationSignal = inject(CancellationSignal);
12
+ constructor() {
13
+ this.#type = new.target;
14
+ this.logger = inject(Logger, `${this.#type.name}${isString(this._prefix) ? `:${this._prefix}` : ''}`);
15
+ }
16
+ prefix(prefix) {
17
+ const newPrefixString = this.getResourceString(prefix, this._prefix);
18
+ return this.injector.resolve(this.#type, newPrefixString);
19
+ }
20
+ getResourceString(resource, prefix) {
21
+ if (isDefined(prefix) && (prefix.length > 0)) {
22
+ return `${prefix}:${resource}`;
23
+ }
24
+ return resource;
25
+ }
3
26
  }
@@ -1,7 +1,8 @@
1
- import type { AcquireResult, LockedFunction, UsingResult } from '../lock.js';
1
+ import type { LockController, LockedFunction, LockTryUseResult } from '../lock.js';
2
2
  import { Lock } from '../lock.js';
3
3
  export declare class WebLock extends Lock {
4
- acquire<Throw extends boolean>(timeout: number | undefined, throwOnFail: Throw): Promise<AcquireResult<Throw>>;
5
- use<Throw extends boolean, R>(timeout: number | undefined, throwOnFail: Throw, func: LockedFunction<R>): Promise<UsingResult<Throw, R>>;
4
+ tryAcquireOnce(): Promise<LockController | false>;
5
+ tryAcquire(timeout?: number): Promise<LockController | false>;
6
+ tryUse<R>(timeout: number | undefined, func: LockedFunction<R>): Promise<LockTryUseResult<R>>;
6
7
  exists(): Promise<boolean>;
7
8
  }
@@ -4,61 +4,68 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
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
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
- import { map, timer } from 'rxjs';
8
- import { CancellationToken } from '../../cancellation/index.js';
9
7
  import { Injectable } from '../../injector/index.js';
10
8
  import { DeferredPromise } from '../../promise/deferred-promise.js';
11
- import { assertStringPass, isDefined, isNull, isObject } from '../../utils/type-guards.js';
9
+ import { assertStringPass, isNull, isObject, isUndefined } from '../../utils/type-guards.js';
12
10
  import { Lock } from '../lock.js';
13
11
  import { WebLockProvider } from './web-lock.provider.js';
14
12
  let WebLock = class WebLock extends Lock {
15
- async acquire(timeout, throwOnFail) {
16
- const acquirePromise = new DeferredPromise();
13
+ async tryAcquireOnce() {
14
+ return await this.tryAcquire(0);
15
+ }
16
+ async tryAcquire(timeout) {
17
+ const controllerPromise = new DeferredPromise();
17
18
  const releasePromise = new DeferredPromise();
18
- const controller = {
19
- lost: false,
20
- release() {
21
- releasePromise.resolve();
22
- },
23
- };
24
- const timeoutToken = (isDefined(timeout) && (timeout > 0)) ? CancellationToken.from(timer(timeout).pipe(map(() => true))) : undefined;
25
- void navigator.locks.request(this.resource, {
26
- signal: isDefined(timeoutToken) ? timeoutToken.asAbortSignal() : undefined,
27
- ifAvailable: isDefined(timeout) && (timeout <= 0),
28
- }, async (lock) => {
19
+ const ifAvailable = isUndefined(timeout) || (timeout <= 0);
20
+ const signal = ifAvailable ? undefined : AbortSignal.any([AbortSignal.timeout(timeout), this.cancellationSignal.asAbortSignal()]);
21
+ await navigator.locks
22
+ .request(this.resource, { signal, ifAvailable }, async (lock) => {
29
23
  if (isNull(lock)) {
30
- acquirePromise.resolve(false);
31
- return;
24
+ throw new Error('Failed to acquire lock.');
32
25
  }
33
- acquirePromise.resolve(true);
26
+ let lost = false;
27
+ controllerPromise.resolve({
28
+ get lost() {
29
+ return lost;
30
+ },
31
+ async release() {
32
+ releasePromise.resolve();
33
+ },
34
+ });
34
35
  await releasePromise;
36
+ lost = true;
35
37
  })
36
- .catch((error) => acquirePromise.reject(error));
37
- try {
38
- const success = await acquirePromise;
39
- if (!success) {
40
- throw new Error('Failed to acquire lock.');
41
- }
42
- return controller;
43
- }
44
- catch (error) {
45
- if (throwOnFail) {
46
- throw error;
47
- }
48
- return false;
49
- }
38
+ .catch(() => controllerPromise.resolve(false));
39
+ return await controllerPromise;
50
40
  }
51
- async use(timeout, throwOnFail, func) {
52
- const controller = await this.acquire(timeout, throwOnFail);
53
- if (controller == false) {
54
- return { success: false, result: undefined };
55
- }
41
+ async tryUse(timeout, func) {
42
+ const ifAvailable = isUndefined(timeout) || (timeout <= 0);
43
+ const signal = ifAvailable ? undefined : AbortSignal.any([AbortSignal.timeout(timeout), this.cancellationSignal.asAbortSignal()]);
44
+ let result;
56
45
  try {
57
- const result = await func(controller);
58
- return { success: true, result };
46
+ result = await navigator.locks.request(this.resource, { signal, ifAvailable }, async (lock) => {
47
+ if (isNull(lock)) {
48
+ return { type: 'already-locked' };
49
+ }
50
+ try {
51
+ const returnValue = await func({ lost: false });
52
+ return { type: 'result', value: returnValue };
53
+ }
54
+ catch (error) {
55
+ return { type: 'error', error };
56
+ }
57
+ });
58
+ }
59
+ catch {
60
+ return { success: false }; // navigator.locks.request throws a DOMException on timeout
59
61
  }
60
- finally {
61
- await controller.release();
62
+ switch (result.type) {
63
+ case 'result':
64
+ return { success: true, result: result.value };
65
+ case 'already-locked':
66
+ return { success: false };
67
+ case 'error':
68
+ throw result.error;
62
69
  }
63
70
  }
64
71
  async exists() {
@@ -1,8 +1,5 @@
1
1
  import type { Lock } from '../../lock/index.js';
2
2
  import { LockProvider } from '../../lock/index.js';
3
3
  export declare class WebLockProvider extends LockProvider {
4
- private readonly _prefix;
5
- constructor(prefix?: string);
6
- prefix(prefix: string): LockProvider;
7
4
  get(resource: string): Lock;
8
5
  }
@@ -4,32 +4,15 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
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
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
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
- var WebLockProvider_1;
14
- import { InjectArg, Singleton } from '../../injector/index.js';
7
+ import { Singleton } from '../../injector/index.js';
15
8
  import { LockProvider } from '../../lock/index.js';
16
9
  import { WebLock } from './web-lock.js';
17
- let WebLockProvider = WebLockProvider_1 = class WebLockProvider extends LockProvider {
18
- _prefix;
19
- constructor(prefix = '') {
20
- super();
21
- this._prefix = prefix;
22
- }
23
- prefix(prefix) {
24
- return new WebLockProvider_1(this._prefix + prefix);
25
- }
10
+ let WebLockProvider = class WebLockProvider extends LockProvider {
26
11
  get(resource) {
27
- return new WebLock(this._prefix + resource);
12
+ return new WebLock(this.getResourceString(resource, this._prefix), this.cancellationSignal);
28
13
  }
29
14
  };
30
- WebLockProvider = WebLockProvider_1 = __decorate([
31
- Singleton(),
32
- __param(0, InjectArg()),
33
- __metadata("design:paramtypes", [String])
15
+ WebLockProvider = __decorate([
16
+ Singleton()
34
17
  ], WebLockProvider);
35
18
  export { WebLockProvider };
@@ -0,0 +1,13 @@
1
+ import type { Record } from '../types/types.js';
2
+ import type { LogLevel } from './level.js';
3
+ export type LogPayload = {
4
+ timestamp: Date;
5
+ level: LogLevel;
6
+ module: string[];
7
+ message: string;
8
+ context: Record<string>;
9
+ };
10
+ /** Formats a log payload for a transport. */
11
+ export declare abstract class LogFormatter {
12
+ abstract format(payload: LogPayload): string;
13
+ }
@@ -0,0 +1,3 @@
1
+ /** Formats a log payload for a transport. */
2
+ export class LogFormatter {
3
+ }