gemi 0.55.0 → 0.57.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 (199) hide show
  1. package/dist/app/index.js +1 -1
  2. package/dist/broadcasting/index.js +1 -1
  3. package/dist/bun/plugin.js +1 -1
  4. package/dist/bun/preload.js +1 -1
  5. package/dist/{chunk-rsdg619q.js → chunk-11dkjm1r.js} +2 -2
  6. package/dist/{chunk-rsdg619q.js.map → chunk-11dkjm1r.js.map} +1 -1
  7. package/dist/{chunk-eqrd31ye.js → chunk-17m5wxv0.js} +2 -2
  8. package/dist/{chunk-eqrd31ye.js.map → chunk-17m5wxv0.js.map} +1 -1
  9. package/dist/{chunk-ct274qts.js → chunk-1esnvq2z.js} +2 -2
  10. package/dist/{chunk-ct274qts.js.map → chunk-1esnvq2z.js.map} +1 -1
  11. package/dist/{chunk-4xx78ba9.js → chunk-1nqdzmvm.js} +2 -2
  12. package/dist/{chunk-4xx78ba9.js.map → chunk-1nqdzmvm.js.map} +1 -1
  13. package/dist/{chunk-dzzmqv0j.js → chunk-32d510cd.js} +2 -2
  14. package/dist/{chunk-dzzmqv0j.js.map → chunk-32d510cd.js.map} +1 -1
  15. package/dist/{chunk-kgmr9qxx.js → chunk-4f69ygc8.js} +2 -2
  16. package/dist/{chunk-kgmr9qxx.js.map → chunk-4f69ygc8.js.map} +1 -1
  17. package/dist/chunk-5fmbsy4q.js +6 -0
  18. package/dist/{chunk-9r1atj8w.js.map → chunk-5fmbsy4q.js.map} +2 -2
  19. package/dist/{chunk-699z6d8y.js → chunk-5txddtaa.js} +3 -3
  20. package/dist/{chunk-699z6d8y.js.map → chunk-5txddtaa.js.map} +1 -1
  21. package/dist/{chunk-gasdfwva.js → chunk-5z5xskg1.js} +2 -2
  22. package/dist/{chunk-gasdfwva.js.map → chunk-5z5xskg1.js.map} +1 -1
  23. package/dist/{chunk-3e88tyee.js → chunk-64bq12j3.js} +2 -2
  24. package/dist/{chunk-3e88tyee.js.map → chunk-64bq12j3.js.map} +1 -1
  25. package/dist/{chunk-javjeayw.js → chunk-67zyjx0c.js} +2 -2
  26. package/dist/{chunk-javjeayw.js.map → chunk-67zyjx0c.js.map} +1 -1
  27. package/dist/{chunk-xjy5apyr.js → chunk-6c14bexh.js} +2 -2
  28. package/dist/{chunk-xjy5apyr.js.map → chunk-6c14bexh.js.map} +1 -1
  29. package/dist/{chunk-vkngcrzq.js → chunk-6fc909z5.js} +2 -2
  30. package/dist/{chunk-vkngcrzq.js.map → chunk-6fc909z5.js.map} +1 -1
  31. package/dist/{chunk-v6v6sem5.js → chunk-74aj8ms2.js} +2 -2
  32. package/dist/{chunk-v6v6sem5.js.map → chunk-74aj8ms2.js.map} +1 -1
  33. package/dist/{chunk-npg72mez.js → chunk-7pn0bnsc.js} +2 -2
  34. package/dist/{chunk-npg72mez.js.map → chunk-7pn0bnsc.js.map} +1 -1
  35. package/dist/{chunk-x14sk95v.js → chunk-8v81dvje.js} +3 -3
  36. package/dist/{chunk-x14sk95v.js.map → chunk-8v81dvje.js.map} +1 -1
  37. package/dist/chunk-9j9wqrb2.js +5 -0
  38. package/dist/chunk-9j9wqrb2.js.map +33 -0
  39. package/dist/{chunk-enhkf60v.js → chunk-a70s8pz4.js} +2 -2
  40. package/dist/{chunk-enhkf60v.js.map → chunk-a70s8pz4.js.map} +1 -1
  41. package/dist/{chunk-wgpa04jb.js → chunk-ae6xz52s.js} +2 -2
  42. package/dist/{chunk-wgpa04jb.js.map → chunk-ae6xz52s.js.map} +1 -1
  43. package/dist/{chunk-62ke19q4.js → chunk-ba0rkpk5.js} +4 -4
  44. package/dist/{chunk-62ke19q4.js.map → chunk-ba0rkpk5.js.map} +1 -1
  45. package/dist/{chunk-4yafsffx.js → chunk-btr9kyqh.js} +2 -2
  46. package/dist/{chunk-4yafsffx.js.map → chunk-btr9kyqh.js.map} +1 -1
  47. package/dist/{chunk-gzdf2025.js → chunk-bw8kt7ps.js} +2 -2
  48. package/dist/{chunk-gzdf2025.js.map → chunk-bw8kt7ps.js.map} +1 -1
  49. package/dist/{chunk-02gdzs5t.js → chunk-cecq6q1b.js} +1 -1
  50. package/dist/{chunk-d36dfqxw.js → chunk-d6kgxmp7.js} +3 -3
  51. package/dist/{chunk-d36dfqxw.js.map → chunk-d6kgxmp7.js.map} +1 -1
  52. package/dist/{chunk-g30q4n5y.js → chunk-dcwjwfjc.js} +2 -2
  53. package/dist/{chunk-g30q4n5y.js.map → chunk-dcwjwfjc.js.map} +1 -1
  54. package/dist/{chunk-77xj0dgc.js → chunk-dwz0wbhj.js} +2 -2
  55. package/dist/{chunk-77xj0dgc.js.map → chunk-dwz0wbhj.js.map} +1 -1
  56. package/dist/{chunk-9r0sb4zn.js → chunk-dxxak51x.js} +2 -2
  57. package/dist/{chunk-9r0sb4zn.js.map → chunk-dxxak51x.js.map} +1 -1
  58. package/dist/{chunk-62723jyy.js → chunk-e9zz0zfv.js} +1 -1
  59. package/dist/{chunk-01am9k5v.js → chunk-f233yzxf.js} +2 -2
  60. package/dist/{chunk-01am9k5v.js.map → chunk-f233yzxf.js.map} +1 -1
  61. package/dist/{chunk-tja0c815.js → chunk-fck5yw2s.js} +2 -2
  62. package/dist/{chunk-tja0c815.js.map → chunk-fck5yw2s.js.map} +1 -1
  63. package/dist/chunk-g5pj95dz.js +9 -0
  64. package/dist/{chunk-kry5vwam.js.map → chunk-g5pj95dz.js.map} +3 -3
  65. package/dist/{chunk-31kcf7dq.js → chunk-j21tm6jf.js} +2 -2
  66. package/dist/{chunk-31kcf7dq.js.map → chunk-j21tm6jf.js.map} +1 -1
  67. package/dist/{chunk-pvdbrt4z.js → chunk-jny4f23c.js} +3 -3
  68. package/dist/{chunk-pvdbrt4z.js.map → chunk-jny4f23c.js.map} +1 -1
  69. package/dist/{chunk-64s1pzz1.js → chunk-jzatvtjd.js} +2 -2
  70. package/dist/{chunk-64s1pzz1.js.map → chunk-jzatvtjd.js.map} +1 -1
  71. package/dist/{chunk-cn2r5jfj.js → chunk-k5bjfhz8.js} +2 -2
  72. package/dist/{chunk-cn2r5jfj.js.map → chunk-k5bjfhz8.js.map} +1 -1
  73. package/dist/{chunk-kgg1eqne.js → chunk-ka4tdhm8.js} +2 -2
  74. package/dist/{chunk-kgg1eqne.js.map → chunk-ka4tdhm8.js.map} +1 -1
  75. package/dist/{chunk-h3mwgbg7.js → chunk-katt90qz.js} +2 -2
  76. package/dist/{chunk-h3mwgbg7.js.map → chunk-katt90qz.js.map} +1 -1
  77. package/dist/{chunk-y9fp58bg.js → chunk-knvxwrwh.js} +2 -2
  78. package/dist/{chunk-y9fp58bg.js.map → chunk-knvxwrwh.js.map} +1 -1
  79. package/dist/{chunk-9c89q2mz.js → chunk-ma5rj4st.js} +2 -2
  80. package/dist/{chunk-9c89q2mz.js.map → chunk-ma5rj4st.js.map} +1 -1
  81. package/dist/{chunk-v06qcyj5.js → chunk-mqwrmbh4.js} +3 -3
  82. package/dist/{chunk-v06qcyj5.js.map → chunk-mqwrmbh4.js.map} +1 -1
  83. package/dist/{chunk-jdj7k3r9.js → chunk-msyqr4y7.js} +2 -2
  84. package/dist/{chunk-jdj7k3r9.js.map → chunk-msyqr4y7.js.map} +1 -1
  85. package/dist/{chunk-q0waxxz5.js → chunk-n2zmg475.js} +2 -2
  86. package/dist/{chunk-q0waxxz5.js.map → chunk-n2zmg475.js.map} +1 -1
  87. package/dist/{chunk-33wjsw4r.js → chunk-nkbreczg.js} +3 -3
  88. package/dist/{chunk-33wjsw4r.js.map → chunk-nkbreczg.js.map} +1 -1
  89. package/dist/{chunk-1pwwrpa3.js → chunk-nqk3cx97.js} +2 -2
  90. package/dist/{chunk-1pwwrpa3.js.map → chunk-nqk3cx97.js.map} +1 -1
  91. package/dist/{chunk-4qwwy968.js → chunk-q8k3gh8k.js} +2 -2
  92. package/dist/{chunk-4qwwy968.js.map → chunk-q8k3gh8k.js.map} +1 -1
  93. package/dist/{chunk-f9mfw82d.js → chunk-qfzyym5h.js} +3 -3
  94. package/dist/{chunk-f9mfw82d.js.map → chunk-qfzyym5h.js.map} +1 -1
  95. package/dist/{chunk-rgb69nh1.js → chunk-qkrba9c2.js} +2 -2
  96. package/dist/{chunk-rgb69nh1.js.map → chunk-qkrba9c2.js.map} +1 -1
  97. package/dist/{chunk-1zfsgffv.js → chunk-r8637cqv.js} +3 -3
  98. package/dist/{chunk-1zfsgffv.js.map → chunk-r8637cqv.js.map} +1 -1
  99. package/dist/chunk-r9as9htn.js +5 -0
  100. package/dist/{chunk-b50zmz3t.js.map → chunk-r9as9htn.js.map} +1 -1
  101. package/dist/{chunk-tmnhkphv.js → chunk-r9h6aj7g.js} +4 -4
  102. package/dist/{chunk-tmnhkphv.js.map → chunk-r9h6aj7g.js.map} +1 -1
  103. package/dist/{chunk-w9k9s4wh.js → chunk-rc2asvyf.js} +2 -2
  104. package/dist/{chunk-w9k9s4wh.js.map → chunk-rc2asvyf.js.map} +1 -1
  105. package/dist/{chunk-m0ggfy1m.js → chunk-rxsmwbxv.js} +2 -2
  106. package/dist/{chunk-m0ggfy1m.js.map → chunk-rxsmwbxv.js.map} +1 -1
  107. package/dist/{chunk-rjxdc0xh.js → chunk-swe2b6rv.js} +1 -1
  108. package/dist/chunk-tzsnadg1.js +37 -0
  109. package/dist/chunk-tzsnadg1.js.map +20 -0
  110. package/dist/{chunk-3y75q5a2.js → chunk-vdzb29p5.js} +2 -2
  111. package/dist/{chunk-3y75q5a2.js.map → chunk-vdzb29p5.js.map} +1 -1
  112. package/dist/{chunk-8k1zqrvh.js → chunk-wrypq618.js} +2 -2
  113. package/dist/{chunk-8k1zqrvh.js.map → chunk-wrypq618.js.map} +1 -1
  114. package/dist/{chunk-hs5v3eqj.js → chunk-yhzb9qpk.js} +2 -2
  115. package/dist/{chunk-hs5v3eqj.js.map → chunk-yhzb9qpk.js.map} +1 -1
  116. package/dist/client/index.d.ts +3 -2
  117. package/dist/client/index.d.ts.map +1 -1
  118. package/dist/config/index.js +1 -1
  119. package/dist/console/run.js +2 -2
  120. package/dist/console/run.js.map +1 -1
  121. package/dist/container/index.js +2 -2
  122. package/dist/container/index.js.map +1 -1
  123. package/dist/database/index.js +2 -2
  124. package/dist/database/index.js.map +1 -1
  125. package/dist/email/index.js +2 -2
  126. package/dist/email/index.js.map +1 -1
  127. package/dist/facades/index.d.ts +1 -0
  128. package/dist/facades/index.d.ts.map +1 -1
  129. package/dist/facades/index.js +2 -2
  130. package/dist/facades/index.js.map +1 -1
  131. package/dist/foundation/index.js +2 -2
  132. package/dist/foundation/index.js.map +1 -1
  133. package/dist/gemi.d.ts +45 -0
  134. package/dist/http/index.js +2 -2
  135. package/dist/http/index.js.map +1 -1
  136. package/dist/i18n/dictionaryRuntime.js +2 -2
  137. package/dist/i18n/dictionaryRuntime.js.map +1 -1
  138. package/dist/i18n/index.js +2 -2
  139. package/dist/i18n/index.js.map +1 -1
  140. package/dist/ide/typescript-plugin/index.js +1206 -0
  141. package/dist/ide/typescript-plugin/index.js.map +17 -0
  142. package/dist/internal/type-stubs/app/http/routes/api.d.ts +24 -0
  143. package/dist/internal/type-stubs/app/http/routes/api.d.ts.map +1 -0
  144. package/dist/internal/type-stubs/app/http/routes/view.d.ts +6 -0
  145. package/dist/internal/type-stubs/app/http/routes/view.d.ts.map +1 -0
  146. package/dist/internal/type-stubs/app/i18n/index.d.ts +4 -0
  147. package/dist/internal/type-stubs/app/i18n/index.d.ts.map +1 -0
  148. package/dist/kernel/index.js +3 -3
  149. package/dist/kernel/index.js.map +3 -3
  150. package/dist/kernel/providers.d.ts +16 -4
  151. package/dist/kernel/providers.d.ts.map +1 -1
  152. package/dist/orm/context.d.ts +65 -0
  153. package/dist/orm/context.d.ts.map +1 -1
  154. package/dist/orm/index.js +2 -2
  155. package/dist/orm/index.js.map +1 -1
  156. package/dist/server/index.js +2 -2
  157. package/dist/server/index.js.map +1 -1
  158. package/dist/services/discovery.d.ts +27 -0
  159. package/dist/services/discovery.d.ts.map +1 -1
  160. package/dist/services/events/Event.d.ts +208 -0
  161. package/dist/services/events/Event.d.ts.map +1 -0
  162. package/dist/services/events/EventManager.d.ts +285 -0
  163. package/dist/services/events/EventManager.d.ts.map +1 -0
  164. package/dist/services/events/EventServiceProvider.d.ts +46 -0
  165. package/dist/services/events/EventServiceProvider.d.ts.map +1 -0
  166. package/dist/services/events/FakeEventManager.d.ts +155 -0
  167. package/dist/services/events/FakeEventManager.d.ts.map +1 -0
  168. package/dist/services/events/FakeEventManager.test-d.d.ts +2 -0
  169. package/dist/services/events/FakeEventManager.test-d.d.ts.map +1 -0
  170. package/dist/services/events/Listener.d.ts +189 -0
  171. package/dist/services/events/Listener.d.ts.map +1 -0
  172. package/dist/services/events/Listener.test-d.d.ts +2 -0
  173. package/dist/services/events/Listener.test-d.d.ts.map +1 -0
  174. package/dist/services/events/config.d.ts +55 -0
  175. package/dist/services/events/config.d.ts.map +1 -0
  176. package/dist/services/events/listenerJob.d.ts +43 -0
  177. package/dist/services/events/listenerJob.d.ts.map +1 -0
  178. package/dist/services/index.d.ts +6 -1
  179. package/dist/services/index.d.ts.map +1 -1
  180. package/dist/services/index.js +8 -8
  181. package/dist/services/index.js.map +5 -3
  182. package/dist/services/queue/QueueManager.d.ts +31 -0
  183. package/dist/services/queue/QueueManager.d.ts.map +1 -1
  184. package/dist/support/index.js +2 -2
  185. package/dist/support/index.js.map +1 -1
  186. package/dist/testing/index.d.ts +24 -0
  187. package/dist/testing/index.d.ts.map +1 -1
  188. package/ide/typescript-plugin/package.json +5 -0
  189. package/package.json +4 -2
  190. package/dist/chunk-4t80js0n.js +0 -33
  191. package/dist/chunk-4t80js0n.js.map +0 -18
  192. package/dist/chunk-98a576s9.js +0 -5
  193. package/dist/chunk-98a576s9.js.map +0 -30
  194. package/dist/chunk-9r1atj8w.js +0 -6
  195. package/dist/chunk-b50zmz3t.js +0 -5
  196. package/dist/chunk-kry5vwam.js +0 -9
  197. /package/dist/{chunk-02gdzs5t.js.map → chunk-cecq6q1b.js.map} +0 -0
  198. /package/dist/{chunk-62723jyy.js.map → chunk-e9zz0zfv.js.map} +0 -0
  199. /package/dist/{chunk-rjxdc0xh.js.map → chunk-swe2b6rv.js.map} +0 -0
@@ -0,0 +1,189 @@
1
+ import type { Event, EventClass } from "./Event";
2
+ /**
3
+ * One side effect of one event, in its own file.
4
+ *
5
+ * ```typescript
6
+ * // app/listeners/SendWelcomeEmail.ts
7
+ * export class SendWelcomeEmail extends Listener {
8
+ * static name = "SendWelcomeEmail";
9
+ * static event = UserRegistered;
10
+ *
11
+ * async handle(event: UserRegistered) {
12
+ * await Mail.send(event.email, ...);
13
+ * }
14
+ * }
15
+ * ```
16
+ *
17
+ * That is the whole of what the subsystem buys: adding a fourth side effect to
18
+ * a registration is adding a file, rather than editing the controller that
19
+ * already has three.
20
+ *
21
+ * ### Why the binding lives here and not on the event
22
+ *
23
+ * The listener is the thing with an opinion about what it cares about; an event
24
+ * has no business knowing who is watching. An event listing its listeners would
25
+ * also put the property back the way it was — adding a side effect would edit
26
+ * an existing file.
27
+ *
28
+ * ### Why the binding is a value at all
29
+ *
30
+ * Laravel binds a listener to an event by reflecting on the type-hint of
31
+ * `handle(UserRegistered $event)`. TypeScript erases types at runtime, so that
32
+ * mechanism cannot exist here and the binding has to be carried as a value.
33
+ * That constraint turns out to be a favourable one: it is also what makes the
34
+ * payload types flow without a generated registry.
35
+ *
36
+ * ### The seam, written down rather than hidden
37
+ *
38
+ * **Nothing checks that `static event` and the annotation on `handle` agree.**
39
+ * A static and an instance member cannot reference each other's types, so the
40
+ * compiler sees `static event = UserRegistered` and `handle(event: OrderPaid)`
41
+ * as two unrelated declarations. Copy a listener, change the static, forget the
42
+ * annotation, and TypeScript is satisfied while the listener receives something
43
+ * else.
44
+ *
45
+ * It is accepted because the failure is local and immediate — that one listener
46
+ * reads a field that is not there, in its own stack — rather than the
47
+ * misroute-shaped failures the rest of this subsystem is arranged against. The
48
+ * `Listener.test-d.ts` beside this file pins the two halves the compiler *does*
49
+ * enforce, so a later refactor reaching for convenience cannot widen them to
50
+ * `any` unnoticed.
51
+ */
52
+ export declare abstract class Listener {
53
+ /**
54
+ * The name this listener is reported and de-duplicated under. Required.
55
+ *
56
+ * Two listener classes claiming one name is refused at registration, and a
57
+ * discovery walk makes that ordinary: `auth/NotifyAdmins.ts` beside
58
+ * `billing/NotifyAdmins.ts` is a natural thing to write, and nothing forces
59
+ * the import alias a hand-written list would have demanded.
60
+ *
61
+ * As on `Event`, the `"unset"` default is a floor and not the check — a class
62
+ * declaration always shadows it with its own implicit binding, which is the
63
+ * one a minifier renames. `discoverListeners` reads the property descriptor
64
+ * to tell a declared name from an implicit one.
65
+ *
66
+ * For a **queued** listener it is more than a label: the queue is keyed by
67
+ * name, the listener is registered under `listener:<name>`, and that string
68
+ * is what a queued dispatch carries. So a queued listener whose name is the
69
+ * implicit class binding is refused at registration rather than warned about
70
+ * — the two ends of the queue can be two different module graphs, and a name
71
+ * only one of them minified is a side effect that stops happening in
72
+ * production and reports success.
73
+ */
74
+ static name: string;
75
+ /**
76
+ * The event class this listener handles. Exactly one, required.
77
+ *
78
+ * It holds the **class**, not its name. The name is read off it once, at
79
+ * registration, inside `EventManager.useListeners` — and that read happens in
80
+ * the module graph that declared the class, so the name it yields is the
81
+ * source one. Nothing downstream keeps the class object, because a registry
82
+ * keyed by class identity is wrong in production only.
83
+ *
84
+ * There is no `static events = [A, B]`, deliberately. A listener bound to two
85
+ * events has to discriminate inside `handle`, and the natural way to write
86
+ * that is `if (event instanceof UserRegistered)` — which is `true` in every
87
+ * test and `false` in a production build, for the reason `Event`'s own doc
88
+ * comment gives. Two events wanting the same side effect are two small
89
+ * listeners calling one shared function.
90
+ *
91
+ * Declared as required, and still checked at runtime: every subclass inherits
92
+ * this declaration whether or not it assigns to it, so the compiler cannot
93
+ * see a listener that left it out. `EventManager` refuses one out loud.
94
+ */
95
+ static event: EventClass;
96
+ /**
97
+ * Where this listener runs. **A context boundary, not a performance dial.**
98
+ *
99
+ * Left `false`, the listener runs inline, inside the dispatcher's
100
+ * `kernelContext` and `ormContext`: it has the request's `app()`, the
101
+ * authenticated user through `currentActor()`, and it joins the ambient
102
+ * transaction.
103
+ *
104
+ * **Unless the event declares `static afterCommit`.** That flag releases its
105
+ * listeners after the commit and outside the transaction's scope, so a sync
106
+ * listener bound to one runs with `currentTransaction()` undefined and
107
+ * commits on its own. The listener kept sync *because* it writes a row that
108
+ * has to roll back with the write it describes — an audit trail, a ledger
109
+ * entry — starts committing separately the day someone sets that flag in the
110
+ * event's file, and nothing on this side says so: no error, no warning, and
111
+ * a `queued = false` that still reads as "inside the transaction".
112
+ *
113
+ * Set `true`, it is handed to the `QueueManager` instead and run from a
114
+ * drain, on the queue's terms. What crosses is the event's name and its
115
+ * constructor arguments as JSON, and nothing else — not the instance the sync
116
+ * listeners share, and not a line of the request. With `worker = true` it is
117
+ * a different thread with a cloned application.
118
+ *
119
+ * The part that catches people is that the context is not reliably *gone*
120
+ * either: the queue is in-process, so a drain that happens to start from
121
+ * `push` is still standing in the dispatcher's context and `app()` there
122
+ * resolves the request's application. Nothing about that is promised. A
123
+ * queued listener that reads the current actor, or writes expecting to join
124
+ * the ambient transaction, works until the day the queue was already busy —
125
+ * and then reads different rows, or commits separately, with no error either
126
+ * way. So: a listener that needs the request's context has to stay sync, and
127
+ * a listener that only needs the payload is free to queue.
128
+ *
129
+ * What it buys, in exchange, is the queue's whole retry path: `maxAttempts`,
130
+ * `onFail`-style re-queueing and dead-lettering, none of which a sync
131
+ * listener has. `dispatchAndWait` does **not** wait for it.
132
+ */
133
+ queued: boolean;
134
+ /**
135
+ * Attempts before the queue gives up, counting the first. `Job`'s field and
136
+ * `Job`'s meaning, because it is forwarded to one.
137
+ *
138
+ * **Ignored unless `queued` is true.** A sync listener has no retry path at
139
+ * all — its throw is logged and the next listener runs — so a `maxAttempts`
140
+ * beside `queued = false` is a line that does nothing, which is why it is
141
+ * said here rather than in a note somewhere else.
142
+ */
143
+ maxAttempts: number;
144
+ /**
145
+ * Runs `handle` in a Worker thread with its own cloned application, for a
146
+ * queued listener whose work is CPU-bound. `Job`'s field and `Job`'s
147
+ * meaning, because it is forwarded to one.
148
+ *
149
+ * **Ignored unless `queued` is true.** A sync listener runs on the
150
+ * dispatcher's stack by definition; there is no thread to move it to.
151
+ */
152
+ worker: boolean;
153
+ /**
154
+ * The side effect. Runs inside the dispatcher's context when `queued` is
155
+ * false: a sync listener has the request's `app()`, its authenticated user,
156
+ * and — unless the event declares `static afterCommit` — its ambient
157
+ * transaction. A queued one can rely on none of them — see `queued`.
158
+ *
159
+ * Annotate the parameter with the event named in `static event` — narrowing
160
+ * the base's `Event` here is legal because method parameters are bivariant,
161
+ * which is what lets this class avoid a generic parameter. Nothing checks
162
+ * that the two agree; see the note on the class.
163
+ *
164
+ * Abstract, so a listener that forgets it fails to compile rather than
165
+ * silently handling nothing.
166
+ *
167
+ * A throw is caught, logged with both names, and the next listener still
168
+ * runs. Listeners are independent side effects by construction, and their
169
+ * order is a filesystem walk's — letting one cancel the rest would make that
170
+ * order load-bearing, which is the exact coupling this subsystem exists to
171
+ * remove.
172
+ */
173
+ abstract handle(event: Event): void | Promise<void>;
174
+ }
175
+ /**
176
+ * A `Listener` subclass, as the registry and the `events` config slice hold
177
+ * one.
178
+ *
179
+ * Zero-argument, because the manager constructs one per dispatch and has
180
+ * nothing to pass it. The `event` member is typed as present even though
181
+ * `EventManager` checks for it at runtime: an inherited declaration is
182
+ * indistinguishable from an assignment to the type system, so this is the
183
+ * shape, and the runtime check is what covers the difference.
184
+ */
185
+ export type ListenerClass = (new () => Listener) & {
186
+ name: string;
187
+ event: EventClass;
188
+ };
189
+ //# sourceMappingURL=Listener.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Listener.d.ts","sourceRoot":"","sources":["../../../services/events/Listener.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEjD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AACH,8BAAsB,QAAQ;IAC5B;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,MAAM,CAAC,IAAI,SAAW;IAEtB;;;;;;;;;;;;;;;;;;;OAmBG;IACH,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC;IAEzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoCG;IACH,MAAM,UAAS;IAEf;;;;;;;;OAQG;IACH,WAAW,SAAK;IAEhB;;;;;;;OAOG;IACH,MAAM,UAAS;IAEf;;;;;;;;;;;;;;;;;;;OAmBG;IACH,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;CACpD;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,UAAU,QAAQ,CAAC,GAAG;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,UAAU,CAAC;CACnB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Listener.test-d.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Listener.test-d.d.ts","sourceRoot":"","sources":["../../../services/events/Listener.test-d.ts"],"names":[],"mappings":""}
@@ -0,0 +1,55 @@
1
+ import type { ListenerClass } from "./Listener";
2
+ export interface EventConfig {
3
+ /**
4
+ * The `Listener` subclasses this application registers, or nothing.
5
+ *
6
+ * ### Why "or nothing" is the point
7
+ *
8
+ * A dispatch fans out to whatever the `EventManager` holds for the event's
9
+ * name, and an event nothing is registered for is not an error — it is the
10
+ * ordinary state of an application that has not written that listener yet.
11
+ * So this list is a second spelling of `app/listeners`, kept in step by hand,
12
+ * and what the two disagreeing costs is a side effect that stops happening,
13
+ * with a development-only warning as the only trace. Nothing fails, nothing
14
+ * is dropped from a log: the welcome email simply is not sent.
15
+ *
16
+ * Leaving this out spells it once: the listeners are the classes under
17
+ * `listenersDir`.
18
+ *
19
+ * ### The rule, exactly
20
+ *
21
+ * **Declared wins, and `[]` is declared.** A `listeners` that is present is
22
+ * used verbatim and no directory is read — that is the escape hatch for an
23
+ * app whose listeners live somewhere this cannot walk, for one that
24
+ * deliberately registers a subset, and for a deploy that ships no source. An
25
+ * empty array means an app with no listeners and says so; it does not mean
26
+ * "find some".
27
+ *
28
+ * **Absent or `undefined` discovers.** `undefined` counts as absent for the
29
+ * same reason `withDefaults` treats it that way everywhere else: a key spread
30
+ * in from an optional value is an omission, not an instruction.
31
+ */
32
+ listeners?: ListenerClass[];
33
+ /**
34
+ * Where to look when `listeners` was not declared. Relative to the project
35
+ * root, or absolute.
36
+ *
37
+ * Every `.ts`/`.tsx` file underneath it is imported at boot and every
38
+ * exported class extending `Listener` is registered, so this wants to be a
39
+ * directory of listener declarations rather than a directory that merely
40
+ * contains some. That includes an abstract base a few listeners share: the
41
+ * walk excludes the framework's `Listener` and nothing else, so a base
42
+ * sitting here is registered alongside its subclasses and its `handle` runs
43
+ * on every dispatch of whatever event it declares. Keep shared bases outside
44
+ * this directory.
45
+ *
46
+ * There is no `eventsDir` to go with it. Event classes are never discovered
47
+ * — each is imported by the listener that binds to it and by the code that
48
+ * dispatches it, so nothing needs to walk them and a walk that imported them
49
+ * anyway would only be a boot cost.
50
+ */
51
+ listenersDir?: string;
52
+ }
53
+ export declare function defineEventConfig(config: EventConfig): EventConfig;
54
+ export declare function eventConfigDefaults(): Required<EventConfig>;
55
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../services/events/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGhD,MAAM,WAAW,WAAW;IAC1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACH,SAAS,CAAC,EAAE,aAAa,EAAE,CAAC;IAE5B;;;;;;;;;;;;;;;;;OAiBG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,CAElE;AAED,wBAAgB,mBAAmB,IAAI,QAAQ,CAAC,WAAW,CAAC,CAK3D"}
@@ -0,0 +1,43 @@
1
+ import { Job } from "../queue/Job";
2
+ import type { Listener, ListenerClass } from "./Listener";
3
+ /**
4
+ * The adapter that lets `queued = true` be one line: a `Job` subclass, built at
5
+ * registration, that runs exactly one listener.
6
+ *
7
+ * Retries, `maxAttempts`, dead-lettering, `concurrency` and worker-thread
8
+ * execution are four features the queue already has, already documents for
9
+ * applications, and is already tested on. A second queue for listeners would be
10
+ * four features that are almost the same as those, differing in ways nobody
11
+ * decided. So a queued listener is not queued by anything written here — it is
12
+ * a job, and everything after `push` is the queue's.
13
+ */
14
+ /**
15
+ * The name a listener's synthetic job is registered under.
16
+ *
17
+ * Prefixed, and visibly so. The synthetic jobs land in
18
+ * `QueueManager.registeredJobs` alongside the app's own, because that getter is
19
+ * documented as reporting what the manager was handed and a queued listener
20
+ * genuinely is something the queue will run — hiding them would make a queue
21
+ * introspection tool lie about what is about to execute. The prefix is what
22
+ * keeps an author from reading `SendWelcomeEmail` there and looking for a job
23
+ * file they never wrote.
24
+ */
25
+ export declare function listenerJobName(listenerName: string): string;
26
+ /**
27
+ * Builds the `Job` subclass that runs one queued listener.
28
+ *
29
+ * `instance` is the listener the caller already constructed to read `queued`
30
+ * off; the three fields that decide where the work runs are read from that one
31
+ * instance rather than from a fresh one per attempt, so a listener's
32
+ * constructor runs once at boot instead of once per retry.
33
+ *
34
+ * What crosses the queue is `[eventName, constructorArguments]` as JSON — a
35
+ * name and the arguments, never the event instance and never the classes. That
36
+ * is invariant 1 at its second boundary: the class objects on the pushing side
37
+ * and the running side can come from two different module graphs (a minified
38
+ * bundle and a source-side discovery walk), so a name declared as a string
39
+ * literal is the only thing both ends agree on. `EventManager.rehydrate` turns
40
+ * it back into an event.
41
+ */
42
+ export declare function jobForListener(listener: ListenerClass, instance: Listener): new () => Job;
43
+ //# sourceMappingURL=listenerJob.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listenerJob.d.ts","sourceRoot":"","sources":["../../../services/events/listenerJob.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAEnC,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE1D;;;;;;;;;;GAUG;AAEH;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,aAAa,EACvB,QAAQ,EAAE,QAAQ,GACjB,UAAU,GAAG,CAiFf"}
@@ -31,6 +31,10 @@ export type { LogEntry } from "./logging/types";
31
31
  export { QueueServiceProvider } from "./queue/QueueServiceProvider";
32
32
  export { QueueManager } from "./queue/QueueManager";
33
33
  export { Job } from "./queue/Job";
34
+ export { EventServiceProvider } from "./events/EventServiceProvider";
35
+ export { EventManager } from "./events/EventManager";
36
+ export { Event, type EventClass } from "./events/Event";
37
+ export { Listener, type ListenerClass } from "./events/Listener";
34
38
  export { ImageServiceProvider } from "./image-optimization/ImageServiceProvider";
35
39
  export { ImageManager } from "./image-optimization/ImageManager";
36
40
  export type { FitEnum, ResizeParameters, } from "./image-optimization/drivers/types";
@@ -54,7 +58,7 @@ export { Command, CommandFailed } from "../console/Command";
54
58
  export type { ArgSpec, OptionSpec, CommandArgument, CommandOption, CommandClass, CommandResult, } from "../console/Command";
55
59
  export type { CommandContext } from "../console/context";
56
60
  export { CommandRegistry } from "../console/CommandRegistry";
57
- export { discoverJobs, discoverCronJobs, discoverCommands } from "./discovery";
61
+ export { discoverJobs, discoverCronJobs, discoverCommands, discoverListeners, } from "./discovery";
58
62
  export { RedisServiceProvider } from "./redis/RedisServiceProvider";
59
63
  export { RedisManager } from "./redis/RedisManager";
60
64
  export { defineFilesystemConfig, filesystemConfigDefaults, type FilesystemConfig, } from "./file-storage/config";
@@ -64,6 +68,7 @@ export { defineBroadcastConfig, broadcastConfigDefaults, type BroadcastConfig, }
64
68
  export { defineRouteConfig, apiRouteConfigDefaults, viewRouteConfigDefaults, type RouteConfig, type ApiRouteConfig, type ViewRouteConfig, } from "./router/config";
65
69
  export { defineLogConfig, logConfigDefaults, type LogConfig, } from "./logging/config";
66
70
  export { defineQueueConfig, queueConfigDefaults, type QueueConfig, } from "./queue/config";
71
+ export { defineEventConfig, eventConfigDefaults, type EventConfig, } from "./events/config";
67
72
  export { defineImageConfig, imageConfigDefaults, type ImageConfig, } from "./image-optimization/config";
68
73
  export { defineScheduleConfig, scheduleConfigDefaults, type ScheduleConfig, } from "./cron/config";
69
74
  export { defineCommandConfig, commandConfigDefaults, type CommandConfig, } from "../console/config";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../services/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../services/index.ts"],"names":[],"mappings":"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"}