@tstdl/base 0.92.166 → 0.92.168

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 (308) hide show
  1. package/api/server/middlewares/content-type.middleware.js +1 -1
  2. package/application/application.d.ts +12 -18
  3. package/application/application.js +48 -69
  4. package/application/index.d.ts +1 -5
  5. package/application/index.js +1 -5
  6. package/application/providers.d.ts +10 -0
  7. package/application/providers.js +54 -0
  8. package/authentication/client/authentication.service.d.ts +1 -3
  9. package/authentication/client/authentication.service.js +4 -5
  10. package/browser/browser-context-controller.d.ts +2 -4
  11. package/browser/browser-context-controller.js +5 -6
  12. package/browser/browser-controller.d.ts +2 -4
  13. package/browser/browser-controller.js +3 -4
  14. package/browser/browser.service.d.ts +1 -3
  15. package/browser/browser.service.js +1 -2
  16. package/browser/page-controller.d.ts +2 -4
  17. package/browser/page-controller.js +7 -8
  18. package/browser/utils.js +3 -3
  19. package/cancellation/token.d.ts +104 -41
  20. package/cancellation/token.js +125 -54
  21. package/core.d.ts +1 -13
  22. package/core.js +1 -46
  23. package/disposable/disposable.d.ts +0 -8
  24. package/disposable/disposable.js +1 -3
  25. package/disposable/index.d.ts +0 -6
  26. package/disposable/index.js +0 -6
  27. package/disposable/using.d.ts +0 -1
  28. package/disposable/using.js +2 -3
  29. package/distributed-loop/distributed-loop.js +2 -2
  30. package/errors/utils.js +4 -1
  31. package/examples/api/authentication.js +11 -5
  32. package/examples/api/basic-overview.js +17 -12
  33. package/examples/api/custom-authentication.js +13 -7
  34. package/examples/api/streaming.js +15 -12
  35. package/examples/browser/basic.js +6 -3
  36. package/examples/document-management/main.js +6 -3
  37. package/examples/http/client.js +7 -3
  38. package/examples/mail/basic.js +9 -7
  39. package/examples/pdf/basic.js +8 -6
  40. package/examples/template/basic.js +7 -5
  41. package/http/client/http-client-request.d.ts +1 -2
  42. package/http/client/http-client-request.js +1 -2
  43. package/http/server/http-server.d.ts +1 -3
  44. package/http/server/http-server.js +0 -1
  45. package/http/server/node/node-http-server.d.ts +1 -2
  46. package/http/server/node/node-http-server.js +1 -2
  47. package/import.js +1 -1
  48. package/injector/injector.d.ts +1 -1
  49. package/injector/types.d.ts +3 -4
  50. package/lock/lock.d.ts +40 -21
  51. package/lock/lock.js +74 -1
  52. package/lock/postgres/drizzle/0000_busy_tattoo.sql +7 -0
  53. package/lock/postgres/drizzle/meta/0000_snapshot.json +65 -0
  54. package/lock/postgres/drizzle/meta/_journal.json +13 -0
  55. package/lock/postgres/drizzle.config.js +11 -0
  56. package/lock/postgres/index.d.ts +2 -0
  57. package/lock/postgres/index.js +2 -0
  58. package/lock/postgres/lock.d.ts +14 -0
  59. package/lock/postgres/lock.js +127 -0
  60. package/lock/postgres/models/index.d.ts +2 -0
  61. package/lock/postgres/models/index.js +2 -0
  62. package/lock/postgres/models/lock.model.d.ts +7 -0
  63. package/{examples/orm/user.model.js → lock/postgres/models/lock.model.js} +22 -30
  64. package/lock/postgres/models/schemas.d.ts +3 -0
  65. package/lock/postgres/models/schemas.js +4 -0
  66. package/lock/postgres/module.d.ts +6 -0
  67. package/lock/postgres/module.js +26 -0
  68. package/lock/postgres/provider.d.ts +6 -0
  69. package/lock/postgres/provider.js +29 -0
  70. package/lock/provider.d.ts +12 -2
  71. package/lock/provider.js +24 -1
  72. package/lock/web/web-lock.d.ts +4 -3
  73. package/lock/web/web-lock.js +49 -42
  74. package/lock/web/web-lock.provider.d.ts +0 -3
  75. package/lock/web/web-lock.provider.js +5 -22
  76. package/logger/formatter.d.ts +13 -0
  77. package/logger/formatter.js +3 -0
  78. package/logger/formatters/index.d.ts +2 -0
  79. package/logger/formatters/index.js +2 -0
  80. package/logger/formatters/json.d.ts +5 -0
  81. package/logger/formatters/json.js +33 -0
  82. package/logger/formatters/pretty-print.d.ts +5 -0
  83. package/logger/formatters/pretty-print.js +55 -0
  84. package/logger/index.d.ts +5 -2
  85. package/logger/index.js +5 -2
  86. package/logger/level.d.ts +10 -8
  87. package/logger/level.js +9 -9
  88. package/logger/logger.d.ts +21 -30
  89. package/logger/logger.js +98 -26
  90. package/logger/manager.d.ts +20 -0
  91. package/logger/manager.js +77 -0
  92. package/logger/tokens.d.ts +1 -1
  93. package/logger/tokens.js +1 -1
  94. package/logger/transport.d.ts +14 -0
  95. package/logger/transport.js +16 -0
  96. package/logger/transports/console.d.ts +14 -0
  97. package/logger/transports/console.js +36 -0
  98. package/logger/transports/index.d.ts +1 -0
  99. package/logger/transports/index.js +1 -0
  100. package/mail/clients/nodemailer.mail-client.d.ts +0 -1
  101. package/mail/clients/nodemailer.mail-client.js +9 -7
  102. package/message-bus/local/local-message-bus.js +2 -2
  103. package/message-bus/message-bus-base.d.ts +2 -3
  104. package/message-bus/message-bus-base.js +5 -6
  105. package/message-bus/message-bus.d.ts +1 -2
  106. package/message-bus/message-bus.js +1 -2
  107. package/module/index.d.ts +0 -2
  108. package/module/index.js +0 -2
  109. package/module/module.d.ts +17 -18
  110. package/module/module.js +47 -12
  111. package/module/modules/function.module.d.ts +6 -6
  112. package/module/modules/function.module.js +25 -9
  113. package/module/modules/web-server.module.d.ts +2 -10
  114. package/module/modules/web-server.module.js +3 -11
  115. package/openid-connect/index.d.ts +0 -2
  116. package/openid-connect/index.js +0 -2
  117. package/openid-connect/oidc-state.model.d.ts +4 -5
  118. package/openid-connect/oidc-state.model.js +51 -1
  119. package/openid-connect/oidc.service-model.d.ts +1 -1
  120. package/openid-connect/oidc.service.d.ts +2 -6
  121. package/openid-connect/oidc.service.js +24 -37
  122. package/orm/decorators.d.ts +10 -1
  123. package/orm/decorators.js +8 -0
  124. package/orm/server/repository.d.ts +3 -1
  125. package/orm/server/repository.js +32 -3
  126. package/package.json +17 -28
  127. package/pdf/pdf.service.js +9 -9
  128. package/pool/pool.d.ts +1 -3
  129. package/pool/pool.js +3 -4
  130. package/queue/postgres/job.model.d.ts +1 -2
  131. package/queue/postgres/job.model.js +1 -2
  132. package/queue/postgres/module.js +1 -1
  133. package/threading/thread-pool.d.ts +1 -3
  134. package/threading/thread-pool.js +7 -8
  135. package/utils/format-error.d.ts +7 -0
  136. package/utils/format-error.js +59 -17
  137. package/utils/index.d.ts +1 -0
  138. package/utils/index.js +1 -0
  139. package/utils/object/dereference.d.ts +51 -19
  140. package/utils/object/dereference.js +52 -43
  141. package/utils/timing.js +2 -2
  142. package/utils/try-chain.d.ts +22 -0
  143. package/utils/try-chain.js +46 -0
  144. package/database/entity-repository.d.ts +0 -50
  145. package/database/entity-repository.js +0 -3
  146. package/database/entity.d.ts +0 -7
  147. package/database/entity.js +0 -1
  148. package/database/id.d.ts +0 -1
  149. package/database/id.js +0 -9
  150. package/database/index.d.ts +0 -11
  151. package/database/index.js +0 -11
  152. package/database/module.d.ts +0 -8
  153. package/database/module.js +0 -11
  154. package/database/mongo/classes.d.ts +0 -21
  155. package/database/mongo/classes.js +0 -26
  156. package/database/mongo/index.d.ts +0 -15
  157. package/database/mongo/index.js +0 -15
  158. package/database/mongo/model/document.d.ts +0 -29
  159. package/database/mongo/model/document.js +0 -63
  160. package/database/mongo/model/index.d.ts +0 -1
  161. package/database/mongo/model/index.js +0 -1
  162. package/database/mongo/module.d.ts +0 -8
  163. package/database/mongo/module.js +0 -68
  164. package/database/mongo/mongo-base.repository.d.ts +0 -103
  165. package/database/mongo/mongo-base.repository.js +0 -263
  166. package/database/mongo/mongo-bulk.d.ts +0 -35
  167. package/database/mongo/mongo-bulk.js +0 -90
  168. package/database/mongo/mongo-entity-repository.d.ts +0 -98
  169. package/database/mongo/mongo-entity-repository.js +0 -278
  170. package/database/mongo/operations.d.ts +0 -10
  171. package/database/mongo/operations.js +0 -54
  172. package/database/mongo/query-converter.d.ts +0 -6
  173. package/database/mongo/query-converter.js +0 -83
  174. package/database/mongo/simple-entity-repository.d.ts +0 -7
  175. package/database/mongo/simple-entity-repository.js +0 -6
  176. package/database/mongo/types.d.ts +0 -50
  177. package/database/mongo/types.js +0 -3
  178. package/database/query.d.ts +0 -121
  179. package/database/query.js +0 -7
  180. package/database/utils.d.ts +0 -2
  181. package/database/utils.js +0 -3
  182. package/disposable/async-disposer.d.ts +0 -35
  183. package/disposable/async-disposer.js +0 -125
  184. package/examples/orm/drizzle.config.js +0 -6
  185. package/examples/orm/schemas.d.ts +0 -3
  186. package/examples/orm/schemas.js +0 -4
  187. package/examples/orm/test.d.ts +0 -1
  188. package/examples/orm/test.js +0 -11
  189. package/examples/orm/user.model.d.ts +0 -13
  190. package/key-value-store/mongo/index.d.ts +0 -6
  191. package/key-value-store/mongo/index.js +0 -6
  192. package/key-value-store/mongo/module.d.ts +0 -8
  193. package/key-value-store/mongo/module.js +0 -18
  194. package/key-value-store/mongo/mongo-key-value-store.provider.d.ts +0 -8
  195. package/key-value-store/mongo/mongo-key-value-store.provider.js +0 -26
  196. package/key-value-store/mongo/mongo-key-value.model.d.ts +0 -7
  197. package/key-value-store/mongo/mongo-key-value.model.js +0 -1
  198. package/key-value-store/mongo/mongo-key-value.repository.d.ts +0 -10
  199. package/key-value-store/mongo/mongo-key-value.repository.js +0 -31
  200. package/key-value-store/mongo/mongo-key-value.store.d.ts +0 -15
  201. package/key-value-store/mongo/mongo-key-value.store.js +0 -82
  202. package/key-value-store/mongo/tokens.d.ts +0 -3
  203. package/key-value-store/mongo/tokens.js +0 -2
  204. package/lock/mongo/index.d.ts +0 -5
  205. package/lock/mongo/index.js +0 -5
  206. package/lock/mongo/lock.d.ts +0 -14
  207. package/lock/mongo/lock.js +0 -125
  208. package/lock/mongo/model.d.ts +0 -6
  209. package/lock/mongo/model.js +0 -1
  210. package/lock/mongo/module.d.ts +0 -12
  211. package/lock/mongo/module.js +0 -20
  212. package/lock/mongo/mongo-lock-repository.d.ts +0 -14
  213. package/lock/mongo/mongo-lock-repository.js +0 -67
  214. package/lock/mongo/provider.d.ts +0 -8
  215. package/lock/mongo/provider.js +0 -36
  216. package/logger/console/index.d.ts +0 -1
  217. package/logger/console/index.js +0 -1
  218. package/logger/console/logger.d.ts +0 -11
  219. package/logger/console/logger.js +0 -64
  220. package/logger/noop/index.d.ts +0 -1
  221. package/logger/noop/index.js +0 -1
  222. package/logger/noop/logger.d.ts +0 -9
  223. package/logger/noop/logger.js +0 -21
  224. package/migration/index.d.ts +0 -9
  225. package/migration/index.js +0 -9
  226. package/migration/migration-state-repository.d.ts +0 -4
  227. package/migration/migration-state-repository.js +0 -3
  228. package/migration/migration-state.d.ts +0 -6
  229. package/migration/migration-state.js +0 -1
  230. package/migration/migrator.d.ts +0 -23
  231. package/migration/migrator.js +0 -76
  232. package/migration/mongo/index.d.ts +0 -2
  233. package/migration/mongo/index.js +0 -2
  234. package/migration/mongo/migration-state-repository.d.ts +0 -11
  235. package/migration/mongo/migration-state-repository.js +0 -32
  236. package/migration/mongo/module.d.ts +0 -12
  237. package/migration/mongo/module.js +0 -17
  238. package/module/module-base.d.ts +0 -18
  239. package/module/module-base.js +0 -40
  240. package/module/module-metric-reporter.d.ts +0 -29
  241. package/module/module-metric-reporter.js +0 -62
  242. package/openid-connect/mongo-oidc-state.repository.d.ts +0 -21
  243. package/openid-connect/mongo-oidc-state.repository.js +0 -52
  244. package/openid-connect/oidc-state.repository.d.ts +0 -4
  245. package/openid-connect/oidc-state.repository.js +0 -3
  246. package/process-shutdown.d.ts +0 -9
  247. package/process-shutdown.js +0 -65
  248. package/queue/mongo/index.d.ts +0 -4
  249. package/queue/mongo/index.js +0 -4
  250. package/queue/mongo/job.d.ts +0 -12
  251. package/queue/mongo/job.js +0 -1
  252. package/queue/mongo/mongo-job.repository.d.ts +0 -13
  253. package/queue/mongo/mongo-job.repository.js +0 -54
  254. package/queue/mongo/queue.d.ts +0 -38
  255. package/queue/mongo/queue.js +0 -266
  256. package/queue/mongo/queue.provider.d.ts +0 -18
  257. package/queue/mongo/queue.provider.js +0 -38
  258. package/search-index/elastic/config.d.ts +0 -8
  259. package/search-index/elastic/config.js +0 -26
  260. package/search-index/elastic/index.d.ts +0 -8
  261. package/search-index/elastic/index.js +0 -8
  262. package/search-index/elastic/keyword-rewriter.d.ts +0 -8
  263. package/search-index/elastic/keyword-rewriter.js +0 -18
  264. package/search-index/elastic/model/elastic-query.d.ts +0 -16
  265. package/search-index/elastic/model/elastic-query.js +0 -1
  266. package/search-index/elastic/model/index-mapping.d.ts +0 -26
  267. package/search-index/elastic/model/index-mapping.js +0 -4
  268. package/search-index/elastic/model/index.d.ts +0 -3
  269. package/search-index/elastic/model/index.js +0 -3
  270. package/search-index/elastic/model/sort.d.ts +0 -8
  271. package/search-index/elastic/model/sort.js +0 -1
  272. package/search-index/elastic/module.d.ts +0 -10
  273. package/search-index/elastic/module.js +0 -49
  274. package/search-index/elastic/query-builder/boolean-query-builder.d.ts +0 -11
  275. package/search-index/elastic/query-builder/boolean-query-builder.js +0 -52
  276. package/search-index/elastic/query-builder/index.d.ts +0 -1
  277. package/search-index/elastic/query-builder/index.js +0 -1
  278. package/search-index/elastic/query-converter.d.ts +0 -9
  279. package/search-index/elastic/query-converter.js +0 -183
  280. package/search-index/elastic/search-index.d.ts +0 -30
  281. package/search-index/elastic/search-index.js +0 -144
  282. package/search-index/elastic/sort-converter.d.ts +0 -4
  283. package/search-index/elastic/sort-converter.js +0 -14
  284. package/search-index/elastic/types.d.ts +0 -5
  285. package/search-index/elastic/types.js +0 -1
  286. package/search-index/error.d.ts +0 -10
  287. package/search-index/error.js +0 -14
  288. package/search-index/index.d.ts +0 -3
  289. package/search-index/index.js +0 -3
  290. package/search-index/memory/index.d.ts +0 -1
  291. package/search-index/memory/index.js +0 -1
  292. package/search-index/memory/memory-search-index.d.ts +0 -19
  293. package/search-index/memory/memory-search-index.js +0 -144
  294. package/search-index/search-index.d.ts +0 -46
  295. package/search-index/search-index.js +0 -31
  296. package/search-index/search-result.d.ts +0 -12
  297. package/search-index/search-result.js +0 -1
  298. package/theme/adapters/css-adapter.d.ts +0 -5
  299. package/theme/adapters/css-adapter.js +0 -29
  300. package/theme/adapters/index.d.ts +0 -2
  301. package/theme/adapters/index.js +0 -2
  302. package/theme/adapters/tailwind-adapter.d.ts +0 -18
  303. package/theme/adapters/tailwind-adapter.js +0 -32
  304. package/theme/index.d.ts +0 -1
  305. package/theme/index.js +0 -1
  306. package/theme/theme-service.d.ts +0 -43
  307. package/theme/theme-service.js +0 -128
  308. /package/{examples/orm → lock/postgres}/drizzle.config.d.ts +0 -0
@@ -1,138 +1,201 @@
1
1
  import { BehaviorSubject, type Observable, type Observer, type Subscribable, type Unsubscribable } from 'rxjs';
2
+ /**
3
+ * Configuration for connecting a source to a CancellationToken.
4
+ */
2
5
  export type ConnectConfig = {
3
6
  /**
4
- * Propagate parent set to child.
7
+ * Propagate 'set' (true) states to the child token.
5
8
  * @default true
6
9
  */
7
10
  set?: boolean;
8
11
  /**
9
- * Propagate unset to child.
12
+ * Propagate 'unset' (false) states to the child token.
10
13
  * @default true
11
14
  */
12
15
  unset?: boolean;
13
16
  /**
14
- * Propagate complete to child.
17
+ * Propagate the 'complete' event to the child token.
15
18
  * @default true
16
19
  */
17
20
  complete?: boolean;
18
21
  /**
19
- * Propagate errors to child.
22
+ * Propagate errors to the child token.
20
23
  * @default true
21
24
  */
22
25
  error?: boolean;
23
26
  /**
24
- * Update state immediately and don't wait for next state change.
27
+ * Immediately apply the source's current state upon connection.
28
+ * If false, waits for the next state change.
25
29
  * @default true
26
30
  */
27
31
  immediate?: boolean;
28
32
  /**
29
- * Only update the state once (if immediate is also true it basically just sets the same value).
33
+ * Only propagate the first applicable state change, then disconnect.
30
34
  * @default false
31
35
  */
32
36
  once?: boolean;
33
37
  };
38
+ /**
39
+ * A read-only view of a CancellationToken's state.
40
+ *
41
+ * It allows consumers to subscribe to state changes, await cancellation,
42
+ * or convert to other signal types (like AbortSignal) without being able
43
+ * to change the token's state.
44
+ *
45
+ * It is both `PromiseLike<void>` (resolves when set) and `Subscribable<void>`
46
+ * (emits when set).
47
+ */
34
48
  export declare class CancellationSignal implements PromiseLike<void>, Subscribable<void> {
35
- #private;
49
+ protected readonly _stateSubject: BehaviorSubject<boolean>;
36
50
  /**
37
- * Observable which emits the current state and every state change.
51
+ * Observable which emits the current state (true for set, false for unset)
52
+ * and any subsequent state changes.
38
53
  */
39
54
  readonly state$: Observable<boolean>;
40
55
  /**
41
- * Observable which emits when this token is set.
56
+ * Observable which emits `void` only when the token becomes set.
42
57
  */
43
58
  readonly set$: Observable<void>;
44
59
  /**
45
- * Observable which emits when this token is unset.
60
+ * Observable which emits `void` only when the token becomes unset.
46
61
  */
47
62
  readonly unset$: Observable<void>;
48
63
  /**
49
- * Returns a promise which is resolved when this token changes its state.
64
+ * A promise that resolves with the next state of the token.
50
65
  */
51
66
  get $state(): Promise<boolean>;
52
67
  /**
53
- * Returns a promise which is resolved when this token is set.
68
+ * A promise that resolves when the token is next set.
69
+ * If the token is already set, it resolves immediately.
54
70
  */
55
71
  get $set(): Promise<void>;
56
72
  /**
57
- * Returns a promise which is resolved when this token is unset.
73
+ * A promise that resolves when the token is next unset.
74
+ * If the token is already unset, it resolves immediately.
58
75
  */
59
76
  get $unset(): Promise<void>;
77
+ /**
78
+ * The current state of the token.
79
+ * @returns `true` if set, `false` if unset.
80
+ */
60
81
  get state(): boolean;
61
82
  /**
62
- * Whether this token is set.
83
+ * Whether the token is currently in a 'set' state.
63
84
  */
64
85
  get isSet(): boolean;
65
86
  /**
66
- * Whether this token is unset.
87
+ * Whether the token is currently in an 'unset' state.
67
88
  */
68
89
  get isUnset(): boolean;
90
+ /**
91
+ * @internal
92
+ */
69
93
  constructor(stateSubject: BehaviorSubject<boolean>);
70
94
  /**
71
- * Returns an AbortSignal.
95
+ * Returns a standard `AbortSignal` that is aborted when this token is set.
96
+ * Useful for interoperability with APIs like `fetch`.
72
97
  */
73
98
  asAbortSignal(): AbortSignal;
74
99
  /**
75
- * Create a new token and connect it to this instance.
100
+ * Creates a new `CancellationToken` that is connected to this one.
101
+ * State changes from this token will propagate to the new child token.
76
102
  * @see {@link connect}
77
103
  */
78
104
  createChild(config?: ConnectConfig): CancellationToken;
79
105
  /**
80
- * Propagate events from this instance to `target`. Events from the `target` are *not* propagated to this instance.
81
- * @param target receiver to connect
106
+ * Propagates state changes from this token to a target `CancellationToken`.
107
+ * @param target The token to receive state updates.
108
+ * @param config Configuration for the connection.
82
109
  */
83
110
  connect(target: CancellationToken, config?: ConnectConfig): void;
111
+ /**
112
+ * Allows this object to be awaited. The promise resolves when the token is set.
113
+ * Implements the `PromiseLike<void>` interface.
114
+ */
84
115
  then<TResult>(onfulfilled?: ((value: void) => TResult | PromiseLike<TResult>) | null): Promise<TResult>;
116
+ /**
117
+ * Subscribes to notifications for when the token becomes set.
118
+ * This is an alias for `this.set$.subscribe(observer)`.
119
+ * Implements the `Subscribable<void>` interface.
120
+ */
85
121
  subscribe(observer: Partial<Observer<void>>): Unsubscribable;
86
122
  }
123
+ /**
124
+ * A CancellationToken represents a unit of work that can be cancelled.
125
+ * It can be explicitly set/unset, completed, or errored.
126
+ *
127
+ * You can create child tokens, connect them to other async primitives
128
+ * (Promises, AbortSignals), and pass around its read-only `signal`
129
+ * to consumers that should only react to cancellation, not trigger it.
130
+ */
87
131
  export declare class CancellationToken extends CancellationSignal {
88
132
  #private;
89
- /** Signal for this token */
133
+ /**
134
+ * A read-only view of this token.
135
+ * Useful for passing to functions that should only be able to check for
136
+ * cancellation but not trigger it.
137
+ */
90
138
  get signal(): CancellationSignal;
91
139
  /**
92
- * @param initialState which state to initialze this token to
93
- * - `false`: unset
94
- * - `true`: set
95
- * @default false
140
+ * @param initialState The initial state of the token. `false` (unset) by default.
96
141
  */
97
142
  constructor(initialState?: boolean);
98
143
  /**
99
- * Creates a token and sets it whenever the source signals
100
- * @param source source to listen to
101
- * @param complete complete token after signal
144
+ * Creates a token that is set when the source signals.
145
+ * @param source The event source to listen to.
146
+ * @example
147
+ * // From a fetch promise
148
+ * const token = CancellationToken.from(fetch('/api/data'));
149
+ *
150
+ * // From a browser AbortSignal
151
+ * const controller = new AbortController();
152
+ * const token = CancellationToken.from(controller.signal);
102
153
  */
103
- static from(source: AbortSignal | PromiseLike<any> | Observable<void>, options?: {
104
- complete?: boolean;
105
- }): CancellationToken;
154
+ static from(source: AbortSignal | PromiseLike<any> | Observable<void>, config?: ConnectConfig): CancellationToken;
106
155
  /**
107
- * Creates a token and connects the source to its next, error and complete.
108
- * @param observable observable to subscribe. Takes emitted value as state if type is boolean otherwise sets state to true.
156
+ * Creates a token and connects it to an `Observable<boolean>` source.
157
+ * The token's state will mirror the boolean values emitted by the observable.
158
+ * @param source The observable source.
159
+ * @param config Configuration for the connection.
109
160
  */
110
161
  static from(source: Observable<boolean>, config?: ConnectConfig): CancellationToken;
111
- static connect(state$: Observable<boolean>, target: CancellationToken, config?: ConnectConfig): void;
112
162
  /**
113
- * Become a child of the provided parent. Events from the parent are propagated to this token. Events from this token are *not* propagated to the parent.
163
+ * Connects an observable state source to a target token.
164
+ * @param source$ The observable providing boolean state.
165
+ * @param target The CancellationToken to update.
166
+ * @param config The connection configuration.
167
+ */
168
+ static connect(source$: Observable<boolean>, target: CancellationToken, config?: ConnectConfig): void;
169
+ /**
170
+ * Makes this token a child of a parent token.
171
+ * State changes from the parent will propagate to this token.
172
+ * @param parent The token to inherit state from.
173
+ * @param config Configuration for the connection.
114
174
  */
115
175
  inherit(parent: CancellationToken | CancellationSignal, config?: ConnectConfig): this;
116
176
  /**
117
- * Set this token.
177
+ * Sets the token's state to `true`.
178
+ * This signals cancellation or completion of the associated operation.
118
179
  */
119
180
  set(): void;
120
181
  /**
121
- * Unset this token.
182
+ * Sets the token's state to `false`.
183
+ * This can be used to reset the token.
122
184
  */
123
185
  unset(): void;
124
186
  /**
125
- * Set the state.
187
+ * Explicitly sets the state of the token.
188
+ * @param state `true` for set, `false` for unset.
126
189
  */
127
190
  setState(state: boolean): void;
128
191
  /**
129
- * Errors the token.
192
+ * Puts the token into an errored state.
193
+ * All current and future subscribers will receive this error.
130
194
  */
131
195
  error(error: Error): void;
132
196
  /**
133
- * Clean up subscriptions.
134
- *
135
- * Keep in mind that *active* awaits (promise) on this token will throw.
197
+ * Completes the token's lifecycle.
198
+ * No further state changes can occur. Active awaits may throw an error.
136
199
  */
137
200
  complete(): void;
138
201
  }
@@ -1,67 +1,93 @@
1
1
  import { BehaviorSubject, defer, filter, first, firstValueFrom, from, fromEvent, isObservable, map, skip, take } from 'rxjs';
2
- import { noopOperator } from '../rxjs-utils/noop.js';
2
+ import { match, P } from 'ts-pattern';
3
+ import { registerFinalization } from '../memory/finalization.js';
3
4
  import { noop } from '../utils/noop.js';
4
5
  import { isBoolean } from '../utils/type-guards.js';
6
+ /**
7
+ * A read-only view of a CancellationToken's state.
8
+ *
9
+ * It allows consumers to subscribe to state changes, await cancellation,
10
+ * or convert to other signal types (like AbortSignal) without being able
11
+ * to change the token's state.
12
+ *
13
+ * It is both `PromiseLike<void>` (resolves when set) and `Subscribable<void>`
14
+ * (emits when set).
15
+ */
5
16
  export class CancellationSignal {
6
- #stateSubject;
17
+ _stateSubject;
7
18
  /**
8
- * Observable which emits the current state and every state change.
19
+ * Observable which emits the current state (true for set, false for unset)
20
+ * and any subsequent state changes.
9
21
  */
10
- state$ = defer(() => this.#stateSubject);
22
+ state$ = defer(() => this._stateSubject);
11
23
  /**
12
- * Observable which emits when this token is set.
24
+ * Observable which emits `void` only when the token becomes set.
13
25
  */
14
26
  set$ = this.state$.pipe(filter((state) => state), map(() => undefined));
15
27
  /**
16
- * Observable which emits when this token is unset.
28
+ * Observable which emits `void` only when the token becomes unset.
17
29
  */
18
30
  unset$ = this.state$.pipe(filter((state) => !state), map(() => undefined));
19
31
  /**
20
- * Returns a promise which is resolved when this token changes its state.
32
+ * A promise that resolves with the next state of the token.
21
33
  */
22
34
  get $state() {
35
+ // skip(1) to wait for the *next* change, not the current state.
23
36
  return firstValueFrom(this.state$.pipe(skip(1)));
24
37
  }
25
38
  /**
26
- * Returns a promise which is resolved when this token is set.
39
+ * A promise that resolves when the token is next set.
40
+ * If the token is already set, it resolves immediately.
27
41
  */
28
42
  get $set() {
29
- return firstValueFrom(this.set$);
43
+ return firstValueFrom(this.set$.pipe(first()));
30
44
  }
31
45
  /**
32
- * Returns a promise which is resolved when this token is unset.
46
+ * A promise that resolves when the token is next unset.
47
+ * If the token is already unset, it resolves immediately.
33
48
  */
34
49
  get $unset() {
35
- return firstValueFrom(this.unset$);
50
+ return firstValueFrom(this.unset$.pipe(first()));
36
51
  }
52
+ /**
53
+ * The current state of the token.
54
+ * @returns `true` if set, `false` if unset.
55
+ */
37
56
  get state() {
38
- return this.#stateSubject.value;
57
+ return this._stateSubject.value;
39
58
  }
40
59
  /**
41
- * Whether this token is set.
60
+ * Whether the token is currently in a 'set' state.
42
61
  */
43
62
  get isSet() {
44
- return this.#stateSubject.value;
63
+ return this._stateSubject.value;
45
64
  }
46
65
  /**
47
- * Whether this token is unset.
66
+ * Whether the token is currently in an 'unset' state.
48
67
  */
49
68
  get isUnset() {
50
- return !this.#stateSubject.value;
69
+ return !this._stateSubject.value;
51
70
  }
71
+ /**
72
+ * @internal
73
+ */
52
74
  constructor(stateSubject) {
53
- this.#stateSubject = stateSubject;
75
+ this._stateSubject = stateSubject;
54
76
  }
55
77
  /**
56
- * Returns an AbortSignal.
78
+ * Returns a standard `AbortSignal` that is aborted when this token is set.
79
+ * Useful for interoperability with APIs like `fetch`.
57
80
  */
58
81
  asAbortSignal() {
59
82
  const abortController = new AbortController();
60
- this.set$.pipe(first()).subscribe(() => abortController.abort());
61
- return abortController.signal;
83
+ const subscription = this.set$.pipe(first()).subscribe(() => abortController.abort());
84
+ const signal = abortController.signal;
85
+ registerFinalization(signal, (subscription) => subscription.unsubscribe(), subscription);
86
+ return signal;
62
87
  }
63
88
  /**
64
- * Create a new token and connect it to this instance.
89
+ * Creates a new `CancellationToken` that is connected to this one.
90
+ * State changes from this token will propagate to the new child token.
65
91
  * @see {@link connect}
66
92
  */
67
93
  createChild(config) {
@@ -70,99 +96,144 @@ export class CancellationSignal {
70
96
  return child;
71
97
  }
72
98
  /**
73
- * Propagate events from this instance to `target`. Events from the `target` are *not* propagated to this instance.
74
- * @param target receiver to connect
99
+ * Propagates state changes from this token to a target `CancellationToken`.
100
+ * @param target The token to receive state updates.
101
+ * @param config Configuration for the connection.
75
102
  */
76
103
  connect(target, config) {
77
104
  CancellationToken.connect(this.state$, target, config);
78
105
  }
106
+ /**
107
+ * Allows this object to be awaited. The promise resolves when the token is set.
108
+ * Implements the `PromiseLike<void>` interface.
109
+ */
79
110
  async then(onfulfilled) {
80
111
  await this.$set;
81
112
  return onfulfilled?.();
82
113
  }
114
+ /**
115
+ * Subscribes to notifications for when the token becomes set.
116
+ * This is an alias for `this.set$.subscribe(observer)`.
117
+ * Implements the `Subscribable<void>` interface.
118
+ */
83
119
  subscribe(observer) {
84
120
  return this.set$.subscribe(observer);
85
121
  }
86
122
  }
123
+ /**
124
+ * A CancellationToken represents a unit of work that can be cancelled.
125
+ * It can be explicitly set/unset, completed, or errored.
126
+ *
127
+ * You can create child tokens, connect them to other async primitives
128
+ * (Promises, AbortSignals), and pass around its read-only `signal`
129
+ * to consumers that should only react to cancellation, not trigger it.
130
+ */
87
131
  export class CancellationToken extends CancellationSignal {
88
- #stateSubject;
89
132
  #signal;
90
- /** Signal for this token */
133
+ /**
134
+ * A read-only view of this token.
135
+ * Useful for passing to functions that should only be able to check for
136
+ * cancellation but not trigger it.
137
+ */
91
138
  get signal() {
92
- return (this.#signal ??= new CancellationSignal(this.#stateSubject));
139
+ return (this.#signal ??= new CancellationSignal(this._stateSubject));
93
140
  }
94
141
  /**
95
- * @param initialState which state to initialze this token to
96
- * - `false`: unset
97
- * - `true`: set
98
- * @default false
142
+ * @param initialState The initial state of the token. `false` (unset) by default.
99
143
  */
100
144
  constructor(initialState = false) {
101
145
  const stateSubject = new BehaviorSubject(initialState);
102
146
  super(stateSubject);
103
- this.#stateSubject = stateSubject;
104
147
  }
105
148
  static from(source, config) {
106
- const source$ = (source instanceof AbortSignal) ? fromEvent(source, 'abort', () => true)
107
- : isObservable(source) ? source.pipe(map((state) => (isBoolean(state) ? state : true)))
108
- : from(source).pipe(map(() => true));
149
+ const source$ = match(source)
150
+ .with(P.instanceOf(AbortSignal), (signal) => fromEvent(signal, 'abort').pipe(map(() => true)))
151
+ .with(P.when(isObservable), (obs) => obs.pipe(map((state) => (isBoolean(state) ? state : true))))
152
+ .otherwise((source) => from(source).pipe(map(() => true)));
109
153
  const token = new CancellationToken();
110
154
  CancellationToken.connect(source$, token, config);
111
155
  return token;
112
156
  }
113
- static connect(state$, target, config = {}) {
157
+ /**
158
+ * Connects an observable state source to a target token.
159
+ * @param source$ The observable providing boolean state.
160
+ * @param target The CancellationToken to update.
161
+ * @param config The connection configuration.
162
+ */
163
+ static connect(source$, target, config = {}) {
114
164
  const { set = true, unset = true, complete = true, error = true, immediate = true, once = false } = config;
115
- const stateObservable = state$
116
- .pipe(immediate ? noopOperator() : skip(1), (set && unset) ? noopOperator() : set ? filter((state) => state) : unset ? filter((state) => !state) : filter(() => false), once ? take(1) : noopOperator());
165
+ let stateObservable = source$;
166
+ if (!immediate) {
167
+ stateObservable = stateObservable.pipe(skip(1));
168
+ }
169
+ if (!set || !unset) {
170
+ if (set) {
171
+ stateObservable = stateObservable.pipe(filter((state) => state));
172
+ }
173
+ else if (unset) {
174
+ stateObservable = stateObservable.pipe(filter((state) => !state));
175
+ }
176
+ else {
177
+ stateObservable = stateObservable.pipe(filter(() => false));
178
+ }
179
+ }
180
+ if (once) {
181
+ stateObservable = stateObservable.pipe(take(1));
182
+ }
117
183
  const subscription = stateObservable.subscribe({
118
184
  next: (state) => target.setState(state),
119
- error: error ? ((errorValue) => target.error(errorValue)) : noop,
120
- complete: complete ? (() => target.complete()) : noop,
185
+ error: error ? (errorValue) => target.error(errorValue) : noop,
186
+ complete: complete ? () => target.complete() : noop,
121
187
  });
122
- target.#stateSubject.subscribe({
188
+ // Ensure the connection is torn down if the target is completed or errors.
189
+ target._stateSubject.subscribe({
123
190
  error: () => subscription.unsubscribe(),
124
191
  complete: () => subscription.unsubscribe(),
125
192
  });
126
193
  }
127
194
  /**
128
- * Become a child of the provided parent. Events from the parent are propagated to this token. Events from this token are *not* propagated to the parent.
195
+ * Makes this token a child of a parent token.
196
+ * State changes from the parent will propagate to this token.
197
+ * @param parent The token to inherit state from.
198
+ * @param config Configuration for the connection.
129
199
  */
130
200
  inherit(parent, config) {
131
- const { state$ } = (parent instanceof CancellationToken) ? parent.signal : parent;
132
- CancellationToken.connect(state$, this, config);
201
+ CancellationToken.connect(parent.state$, this, config);
133
202
  return this;
134
203
  }
135
204
  /**
136
- * Set this token.
205
+ * Sets the token's state to `true`.
206
+ * This signals cancellation or completion of the associated operation.
137
207
  */
138
208
  set() {
139
209
  this.setState(true);
140
210
  }
141
211
  /**
142
- * Unset this token.
212
+ * Sets the token's state to `false`.
213
+ * This can be used to reset the token.
143
214
  */
144
215
  unset() {
145
216
  this.setState(false);
146
217
  }
147
218
  /**
148
- * Set the state.
219
+ * Explicitly sets the state of the token.
220
+ * @param state `true` for set, `false` for unset.
149
221
  */
150
222
  setState(state) {
151
- this.#stateSubject.next(state);
223
+ this._stateSubject.next(state);
152
224
  }
153
225
  /**
154
- * Errors the token.
226
+ * Puts the token into an errored state.
227
+ * All current and future subscribers will receive this error.
155
228
  */
156
229
  error(error) {
157
- this.#stateSubject.error(error);
230
+ this._stateSubject.error(error);
158
231
  }
159
232
  /**
160
- * Clean up subscriptions.
161
- *
162
- * Keep in mind that *active* awaits (promise) on this token will throw.
233
+ * Completes the token's lifecycle.
234
+ * No further state changes can occur. Active awaits may throw an error.
163
235
  */
164
236
  complete() {
165
- this.#stateSubject.complete();
237
+ this._stateSubject.complete();
166
238
  }
167
239
  }
168
- // export { CancellationSignal as ReadonlyCancellationToken };
package/core.d.ts CHANGED
@@ -1,11 +1,7 @@
1
- import type { CancellationSignal } from './cancellation/token.js';
2
- import { Injector } from './injector/injector.js';
3
- import { type InjectionToken } from './injector/token.js';
4
- import { LogLevel, Logger, type LoggerArgument } from './logger/index.js';
1
+ import { Injector } from './injector/index.js';
5
2
  declare global {
6
3
  var tstdlLoaded: boolean | undefined;
7
4
  }
8
- export declare const CORE_LOGGER: InjectionToken<Logger, never>;
9
5
  /**
10
6
  * @deprecated Usage of `getGlobalInjector` should be avoided. Use `Application` scoped injector instead.
11
7
  */
@@ -13,11 +9,3 @@ export declare function getGlobalInjector(): Injector;
13
9
  export declare function isDevMode(): boolean;
14
10
  export declare function isProdMode(): boolean;
15
11
  export declare function enableProdMode(): void;
16
- export declare function connect(name: string, connectFunction: (() => Promise<any>), logger: Logger, cancellationSignal: CancellationSignal, maxTries?: number): Promise<void>;
17
- export type CoreConfiguration = {
18
- production?: boolean;
19
- logger?: InjectionToken<Logger, LoggerArgument>;
20
- logLevel?: LogLevel;
21
- coreLogPrefix?: string;
22
- };
23
- export declare function configureTstdl(config?: CoreConfiguration): void;
package/core.js CHANGED
@@ -1,16 +1,8 @@
1
- import { Injector } from './injector/injector.js';
2
- import { injectionToken } from './injector/token.js';
3
- import { ConsoleLogger } from './logger/console/logger.js';
4
- import { LogLevel, Logger } from './logger/index.js';
5
- import { LOG_LEVEL } from './logger/tokens.js';
6
- import { initializeSignals, setProcessShutdownLogger } from './process-shutdown.js';
7
- import { timeout } from './utils/timing.js';
8
- import { assertDefinedPass, isDefined } from './utils/type-guards.js';
1
+ import { Injector } from './injector/index.js';
9
2
  if (globalThis.tstdlLoaded == true) {
10
3
  console.error(new Error('tstdl seems to be loaded multiple times. This is likely an error as some modules won\'t work as intended this way.'));
11
4
  }
12
5
  globalThis.tstdlLoaded = true;
13
- export const CORE_LOGGER = injectionToken('core logger');
14
6
  let globalInjector;
15
7
  let _isDevMode = true;
16
8
  /**
@@ -28,40 +20,3 @@ export function isProdMode() {
28
20
  export function enableProdMode() {
29
21
  _isDevMode = false;
30
22
  }
31
- export async function connect(name, connectFunction, logger, cancellationSignal, maxTries = 5) {
32
- let triesLeft = maxTries;
33
- let success = false;
34
- while (!success && cancellationSignal.isUnset && triesLeft-- > 0) {
35
- try {
36
- logger.verbose(`connecting to ${name}...`);
37
- await connectFunction();
38
- success = true;
39
- logger.info(`connected to ${name}`);
40
- }
41
- catch (error) {
42
- logger.verbose(`error connecting to ${name}${triesLeft > 0 ? ', trying again...' : ''}`);
43
- logger.error(error);
44
- if (triesLeft == 0) {
45
- throw new Error(`Failed to connect to ${name} - no tries left.`);
46
- }
47
- await timeout(3000);
48
- }
49
- }
50
- }
51
- let coreLogPrefix;
52
- export function configureTstdl(config = {}) {
53
- if (config.production == true) {
54
- enableProdMode();
55
- }
56
- const logger = getGlobalInjector().resolve(CORE_LOGGER);
57
- setProcessShutdownLogger(logger);
58
- initializeSignals();
59
- Injector.register(Logger, { useToken: config.logger ?? ConsoleLogger });
60
- Injector.register(LOG_LEVEL, { useFactory: (level) => assertDefinedPass(level, 'LogLevel argument not provided') }, { defaultArgumentProvider: () => config.logLevel ?? LogLevel.Trace });
61
- if (isDefined(config.coreLogPrefix)) {
62
- coreLogPrefix = config.coreLogPrefix;
63
- }
64
- }
65
- Injector.register(Logger, { useToken: ConsoleLogger });
66
- Injector.register(LOG_LEVEL, { useValue: LogLevel.Trace });
67
- Injector.register(CORE_LOGGER, { useToken: Logger, defaultArgumentProvider: () => coreLogPrefix });
@@ -1,11 +1,3 @@
1
- export declare const dispose: typeof Symbol.dispose;
2
- export declare const disposeAsync: typeof Symbol.asyncDispose;
3
- export interface Disposable {
4
- [Symbol.dispose](): void;
5
- }
6
- export interface AsyncDisposable {
7
- [Symbol.asyncDispose](): PromiseLike<void>;
8
- }
9
1
  export declare function isDisposable(object: any): object is Disposable;
10
2
  export declare function isAsyncDisposable(object: any): object is AsyncDisposable;
11
3
  export declare function isSyncOrAsyncDisposable(object: any): object is Disposable | AsyncDisposable;
@@ -1,6 +1,4 @@
1
1
  import { isFunction } from '../utils/type-guards.js';
2
- export const dispose = Symbol.dispose;
3
- export const disposeAsync = Symbol.asyncDispose;
4
2
  export function isDisposable(object) {
5
3
  return isFunction(object?.[Symbol.dispose]);
6
4
  }
@@ -8,5 +6,5 @@ export function isAsyncDisposable(object) {
8
6
  return isFunction(object?.[Symbol.asyncDispose]);
9
7
  }
10
8
  export function isSyncOrAsyncDisposable(object) {
11
- return isFunction(object?.[Symbol.dispose] ?? object?.[Symbol.asyncDispose]);
9
+ return isDisposable(object) || isAsyncDisposable(object);
12
10
  }
@@ -1,8 +1,2 @@
1
- /**
2
- * Dispose pattern
3
- *
4
- * @module Disposable
5
- */
6
- export * from './async-disposer.js';
7
1
  export * from './disposable.js';
8
2
  export * from './using.js';
@@ -1,8 +1,2 @@
1
- /**
2
- * Dispose pattern
3
- *
4
- * @module Disposable
5
- */
6
- export * from './async-disposer.js';
7
1
  export * from './disposable.js';
8
2
  export * from './using.js';