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.
- package/dist/app/index.js +1 -1
- package/dist/broadcasting/index.js +1 -1
- package/dist/bun/plugin.js +1 -1
- package/dist/bun/preload.js +1 -1
- package/dist/{chunk-rsdg619q.js → chunk-11dkjm1r.js} +2 -2
- package/dist/{chunk-rsdg619q.js.map → chunk-11dkjm1r.js.map} +1 -1
- package/dist/{chunk-eqrd31ye.js → chunk-17m5wxv0.js} +2 -2
- package/dist/{chunk-eqrd31ye.js.map → chunk-17m5wxv0.js.map} +1 -1
- package/dist/{chunk-ct274qts.js → chunk-1esnvq2z.js} +2 -2
- package/dist/{chunk-ct274qts.js.map → chunk-1esnvq2z.js.map} +1 -1
- package/dist/{chunk-4xx78ba9.js → chunk-1nqdzmvm.js} +2 -2
- package/dist/{chunk-4xx78ba9.js.map → chunk-1nqdzmvm.js.map} +1 -1
- package/dist/{chunk-dzzmqv0j.js → chunk-32d510cd.js} +2 -2
- package/dist/{chunk-dzzmqv0j.js.map → chunk-32d510cd.js.map} +1 -1
- package/dist/{chunk-kgmr9qxx.js → chunk-4f69ygc8.js} +2 -2
- package/dist/{chunk-kgmr9qxx.js.map → chunk-4f69ygc8.js.map} +1 -1
- package/dist/chunk-5fmbsy4q.js +6 -0
- package/dist/{chunk-9r1atj8w.js.map → chunk-5fmbsy4q.js.map} +2 -2
- package/dist/{chunk-699z6d8y.js → chunk-5txddtaa.js} +3 -3
- package/dist/{chunk-699z6d8y.js.map → chunk-5txddtaa.js.map} +1 -1
- package/dist/{chunk-gasdfwva.js → chunk-5z5xskg1.js} +2 -2
- package/dist/{chunk-gasdfwva.js.map → chunk-5z5xskg1.js.map} +1 -1
- package/dist/{chunk-3e88tyee.js → chunk-64bq12j3.js} +2 -2
- package/dist/{chunk-3e88tyee.js.map → chunk-64bq12j3.js.map} +1 -1
- package/dist/{chunk-javjeayw.js → chunk-67zyjx0c.js} +2 -2
- package/dist/{chunk-javjeayw.js.map → chunk-67zyjx0c.js.map} +1 -1
- package/dist/{chunk-xjy5apyr.js → chunk-6c14bexh.js} +2 -2
- package/dist/{chunk-xjy5apyr.js.map → chunk-6c14bexh.js.map} +1 -1
- package/dist/{chunk-vkngcrzq.js → chunk-6fc909z5.js} +2 -2
- package/dist/{chunk-vkngcrzq.js.map → chunk-6fc909z5.js.map} +1 -1
- package/dist/{chunk-v6v6sem5.js → chunk-74aj8ms2.js} +2 -2
- package/dist/{chunk-v6v6sem5.js.map → chunk-74aj8ms2.js.map} +1 -1
- package/dist/{chunk-npg72mez.js → chunk-7pn0bnsc.js} +2 -2
- package/dist/{chunk-npg72mez.js.map → chunk-7pn0bnsc.js.map} +1 -1
- package/dist/{chunk-x14sk95v.js → chunk-8v81dvje.js} +3 -3
- package/dist/{chunk-x14sk95v.js.map → chunk-8v81dvje.js.map} +1 -1
- package/dist/chunk-9j9wqrb2.js +5 -0
- package/dist/chunk-9j9wqrb2.js.map +33 -0
- package/dist/{chunk-enhkf60v.js → chunk-a70s8pz4.js} +2 -2
- package/dist/{chunk-enhkf60v.js.map → chunk-a70s8pz4.js.map} +1 -1
- package/dist/{chunk-wgpa04jb.js → chunk-ae6xz52s.js} +2 -2
- package/dist/{chunk-wgpa04jb.js.map → chunk-ae6xz52s.js.map} +1 -1
- package/dist/{chunk-62ke19q4.js → chunk-ba0rkpk5.js} +4 -4
- package/dist/{chunk-62ke19q4.js.map → chunk-ba0rkpk5.js.map} +1 -1
- package/dist/{chunk-4yafsffx.js → chunk-btr9kyqh.js} +2 -2
- package/dist/{chunk-4yafsffx.js.map → chunk-btr9kyqh.js.map} +1 -1
- package/dist/{chunk-gzdf2025.js → chunk-bw8kt7ps.js} +2 -2
- package/dist/{chunk-gzdf2025.js.map → chunk-bw8kt7ps.js.map} +1 -1
- package/dist/{chunk-02gdzs5t.js → chunk-cecq6q1b.js} +1 -1
- package/dist/{chunk-d36dfqxw.js → chunk-d6kgxmp7.js} +3 -3
- package/dist/{chunk-d36dfqxw.js.map → chunk-d6kgxmp7.js.map} +1 -1
- package/dist/{chunk-g30q4n5y.js → chunk-dcwjwfjc.js} +2 -2
- package/dist/{chunk-g30q4n5y.js.map → chunk-dcwjwfjc.js.map} +1 -1
- package/dist/{chunk-77xj0dgc.js → chunk-dwz0wbhj.js} +2 -2
- package/dist/{chunk-77xj0dgc.js.map → chunk-dwz0wbhj.js.map} +1 -1
- package/dist/{chunk-9r0sb4zn.js → chunk-dxxak51x.js} +2 -2
- package/dist/{chunk-9r0sb4zn.js.map → chunk-dxxak51x.js.map} +1 -1
- package/dist/{chunk-62723jyy.js → chunk-e9zz0zfv.js} +1 -1
- package/dist/{chunk-01am9k5v.js → chunk-f233yzxf.js} +2 -2
- package/dist/{chunk-01am9k5v.js.map → chunk-f233yzxf.js.map} +1 -1
- package/dist/{chunk-tja0c815.js → chunk-fck5yw2s.js} +2 -2
- package/dist/{chunk-tja0c815.js.map → chunk-fck5yw2s.js.map} +1 -1
- package/dist/chunk-g5pj95dz.js +9 -0
- package/dist/{chunk-kry5vwam.js.map → chunk-g5pj95dz.js.map} +3 -3
- package/dist/{chunk-31kcf7dq.js → chunk-j21tm6jf.js} +2 -2
- package/dist/{chunk-31kcf7dq.js.map → chunk-j21tm6jf.js.map} +1 -1
- package/dist/{chunk-pvdbrt4z.js → chunk-jny4f23c.js} +3 -3
- package/dist/{chunk-pvdbrt4z.js.map → chunk-jny4f23c.js.map} +1 -1
- package/dist/{chunk-64s1pzz1.js → chunk-jzatvtjd.js} +2 -2
- package/dist/{chunk-64s1pzz1.js.map → chunk-jzatvtjd.js.map} +1 -1
- package/dist/{chunk-cn2r5jfj.js → chunk-k5bjfhz8.js} +2 -2
- package/dist/{chunk-cn2r5jfj.js.map → chunk-k5bjfhz8.js.map} +1 -1
- package/dist/{chunk-kgg1eqne.js → chunk-ka4tdhm8.js} +2 -2
- package/dist/{chunk-kgg1eqne.js.map → chunk-ka4tdhm8.js.map} +1 -1
- package/dist/{chunk-h3mwgbg7.js → chunk-katt90qz.js} +2 -2
- package/dist/{chunk-h3mwgbg7.js.map → chunk-katt90qz.js.map} +1 -1
- package/dist/{chunk-y9fp58bg.js → chunk-knvxwrwh.js} +2 -2
- package/dist/{chunk-y9fp58bg.js.map → chunk-knvxwrwh.js.map} +1 -1
- package/dist/{chunk-9c89q2mz.js → chunk-ma5rj4st.js} +2 -2
- package/dist/{chunk-9c89q2mz.js.map → chunk-ma5rj4st.js.map} +1 -1
- package/dist/{chunk-v06qcyj5.js → chunk-mqwrmbh4.js} +3 -3
- package/dist/{chunk-v06qcyj5.js.map → chunk-mqwrmbh4.js.map} +1 -1
- package/dist/{chunk-jdj7k3r9.js → chunk-msyqr4y7.js} +2 -2
- package/dist/{chunk-jdj7k3r9.js.map → chunk-msyqr4y7.js.map} +1 -1
- package/dist/{chunk-q0waxxz5.js → chunk-n2zmg475.js} +2 -2
- package/dist/{chunk-q0waxxz5.js.map → chunk-n2zmg475.js.map} +1 -1
- package/dist/{chunk-33wjsw4r.js → chunk-nkbreczg.js} +3 -3
- package/dist/{chunk-33wjsw4r.js.map → chunk-nkbreczg.js.map} +1 -1
- package/dist/{chunk-1pwwrpa3.js → chunk-nqk3cx97.js} +2 -2
- package/dist/{chunk-1pwwrpa3.js.map → chunk-nqk3cx97.js.map} +1 -1
- package/dist/{chunk-4qwwy968.js → chunk-q8k3gh8k.js} +2 -2
- package/dist/{chunk-4qwwy968.js.map → chunk-q8k3gh8k.js.map} +1 -1
- package/dist/{chunk-f9mfw82d.js → chunk-qfzyym5h.js} +3 -3
- package/dist/{chunk-f9mfw82d.js.map → chunk-qfzyym5h.js.map} +1 -1
- package/dist/{chunk-rgb69nh1.js → chunk-qkrba9c2.js} +2 -2
- package/dist/{chunk-rgb69nh1.js.map → chunk-qkrba9c2.js.map} +1 -1
- package/dist/{chunk-1zfsgffv.js → chunk-r8637cqv.js} +3 -3
- package/dist/{chunk-1zfsgffv.js.map → chunk-r8637cqv.js.map} +1 -1
- package/dist/chunk-r9as9htn.js +5 -0
- package/dist/{chunk-b50zmz3t.js.map → chunk-r9as9htn.js.map} +1 -1
- package/dist/{chunk-tmnhkphv.js → chunk-r9h6aj7g.js} +4 -4
- package/dist/{chunk-tmnhkphv.js.map → chunk-r9h6aj7g.js.map} +1 -1
- package/dist/{chunk-w9k9s4wh.js → chunk-rc2asvyf.js} +2 -2
- package/dist/{chunk-w9k9s4wh.js.map → chunk-rc2asvyf.js.map} +1 -1
- package/dist/{chunk-m0ggfy1m.js → chunk-rxsmwbxv.js} +2 -2
- package/dist/{chunk-m0ggfy1m.js.map → chunk-rxsmwbxv.js.map} +1 -1
- package/dist/{chunk-rjxdc0xh.js → chunk-swe2b6rv.js} +1 -1
- package/dist/chunk-tzsnadg1.js +37 -0
- package/dist/chunk-tzsnadg1.js.map +20 -0
- package/dist/{chunk-3y75q5a2.js → chunk-vdzb29p5.js} +2 -2
- package/dist/{chunk-3y75q5a2.js.map → chunk-vdzb29p5.js.map} +1 -1
- package/dist/{chunk-8k1zqrvh.js → chunk-wrypq618.js} +2 -2
- package/dist/{chunk-8k1zqrvh.js.map → chunk-wrypq618.js.map} +1 -1
- package/dist/{chunk-hs5v3eqj.js → chunk-yhzb9qpk.js} +2 -2
- package/dist/{chunk-hs5v3eqj.js.map → chunk-yhzb9qpk.js.map} +1 -1
- package/dist/client/index.d.ts +3 -2
- package/dist/client/index.d.ts.map +1 -1
- package/dist/config/index.js +1 -1
- package/dist/console/run.js +2 -2
- package/dist/console/run.js.map +1 -1
- package/dist/container/index.js +2 -2
- package/dist/container/index.js.map +1 -1
- package/dist/database/index.js +2 -2
- package/dist/database/index.js.map +1 -1
- package/dist/email/index.js +2 -2
- package/dist/email/index.js.map +1 -1
- package/dist/facades/index.d.ts +1 -0
- package/dist/facades/index.d.ts.map +1 -1
- package/dist/facades/index.js +2 -2
- package/dist/facades/index.js.map +1 -1
- package/dist/foundation/index.js +2 -2
- package/dist/foundation/index.js.map +1 -1
- package/dist/gemi.d.ts +45 -0
- package/dist/http/index.js +2 -2
- package/dist/http/index.js.map +1 -1
- package/dist/i18n/dictionaryRuntime.js +2 -2
- package/dist/i18n/dictionaryRuntime.js.map +1 -1
- package/dist/i18n/index.js +2 -2
- package/dist/i18n/index.js.map +1 -1
- package/dist/ide/typescript-plugin/index.js +1206 -0
- package/dist/ide/typescript-plugin/index.js.map +17 -0
- package/dist/internal/type-stubs/app/http/routes/api.d.ts +24 -0
- package/dist/internal/type-stubs/app/http/routes/api.d.ts.map +1 -0
- package/dist/internal/type-stubs/app/http/routes/view.d.ts +6 -0
- package/dist/internal/type-stubs/app/http/routes/view.d.ts.map +1 -0
- package/dist/internal/type-stubs/app/i18n/index.d.ts +4 -0
- package/dist/internal/type-stubs/app/i18n/index.d.ts.map +1 -0
- package/dist/kernel/index.js +3 -3
- package/dist/kernel/index.js.map +3 -3
- package/dist/kernel/providers.d.ts +16 -4
- package/dist/kernel/providers.d.ts.map +1 -1
- package/dist/orm/context.d.ts +65 -0
- package/dist/orm/context.d.ts.map +1 -1
- package/dist/orm/index.js +2 -2
- package/dist/orm/index.js.map +1 -1
- package/dist/server/index.js +2 -2
- package/dist/server/index.js.map +1 -1
- package/dist/services/discovery.d.ts +27 -0
- package/dist/services/discovery.d.ts.map +1 -1
- package/dist/services/events/Event.d.ts +208 -0
- package/dist/services/events/Event.d.ts.map +1 -0
- package/dist/services/events/EventManager.d.ts +285 -0
- package/dist/services/events/EventManager.d.ts.map +1 -0
- package/dist/services/events/EventServiceProvider.d.ts +46 -0
- package/dist/services/events/EventServiceProvider.d.ts.map +1 -0
- package/dist/services/events/FakeEventManager.d.ts +155 -0
- package/dist/services/events/FakeEventManager.d.ts.map +1 -0
- package/dist/services/events/FakeEventManager.test-d.d.ts +2 -0
- package/dist/services/events/FakeEventManager.test-d.d.ts.map +1 -0
- package/dist/services/events/Listener.d.ts +189 -0
- package/dist/services/events/Listener.d.ts.map +1 -0
- package/dist/services/events/Listener.test-d.d.ts +2 -0
- package/dist/services/events/Listener.test-d.d.ts.map +1 -0
- package/dist/services/events/config.d.ts +55 -0
- package/dist/services/events/config.d.ts.map +1 -0
- package/dist/services/events/listenerJob.d.ts +43 -0
- package/dist/services/events/listenerJob.d.ts.map +1 -0
- package/dist/services/index.d.ts +6 -1
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +8 -8
- package/dist/services/index.js.map +5 -3
- package/dist/services/queue/QueueManager.d.ts +31 -0
- package/dist/services/queue/QueueManager.d.ts.map +1 -1
- package/dist/support/index.js +2 -2
- package/dist/support/index.js.map +1 -1
- package/dist/testing/index.d.ts +24 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/ide/typescript-plugin/package.json +5 -0
- package/package.json +4 -2
- package/dist/chunk-4t80js0n.js +0 -33
- package/dist/chunk-4t80js0n.js.map +0 -18
- package/dist/chunk-98a576s9.js +0 -5
- package/dist/chunk-98a576s9.js.map +0 -30
- package/dist/chunk-9r1atj8w.js +0 -6
- package/dist/chunk-b50zmz3t.js +0 -5
- package/dist/chunk-kry5vwam.js +0 -9
- /package/dist/{chunk-02gdzs5t.js.map → chunk-cecq6q1b.js.map} +0 -0
- /package/dist/{chunk-62723jyy.js.map → chunk-e9zz0zfv.js.map} +0 -0
- /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 @@
|
|
|
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"}
|
package/dist/services/index.d.ts
CHANGED
|
@@ -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":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,0CAA0C,CAAC;AACrF,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAC3D,OAAO,EACL,eAAe,EACf,KAAK,qBAAqB,GAC3B,MAAM,wCAAwC,CAAC;AAChD,YAAY,EACV,SAAS,EACT,YAAY,EACZ,aAAa,EACb,cAAc,EACd,UAAU,GACX,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAE7E,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAG7E,OAAO,EAAE,0BAA0B,EAAE,MAAM,2CAA2C,CAAC;AACvF,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EACL,mBAAmB,EACnB,KAAK,0BAA0B,GAChC,MAAM,kDAAkD,CAAC;AAC1D,OAAO,EACL,gBAAgB,EAChB,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,GAC5B,MAAM,+CAA+C,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAC7E,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC3E,YAAY,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAGjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAG9E,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAG7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAEnE,YAAY,EACV,aAAa,EACb,kBAAkB,GACnB,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,YAAY,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAGhD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../services/index.ts"],"names":[],"mappings":"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"}
|