sleepy-serv 0.19.0 → 0.20.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/README.md +5 -7
- package/dist/cli/build.d.ts.map +1 -1
- package/dist/core/utils.d.ts +2 -2
- package/dist/core/utils.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/cli/build.ts +26 -3
- package/src/core/socket.ts +18 -18
- package/src/core/utils.ts +2 -2
package/README.md
CHANGED
|
@@ -552,7 +552,7 @@ const app = createApp(3000, {
|
|
|
552
552
|
The `app.ws` object exposes four methods for interacting with connected clients:
|
|
553
553
|
|
|
554
554
|
- `query(fn)`: return a filtered list of active sessions. The filter function receives `(clientId, data, index)` and returns a boolean. Each entry in the returned array is a `SessionEntry` with `clientId` and `app` (the application context). To list all sessions: `app.ws.query(() => true)`.
|
|
555
|
-
- `send(
|
|
555
|
+
- `send(event, body, fn)`: push a notification to clients matching a filter. The filter function receives `(clientId, data, index)` and returns a boolean. To target one client: `app.ws.send('ping', body, id => id === targetId)`.
|
|
556
556
|
- `broadcast(event, body)`: push a notification to all connected clients.
|
|
557
557
|
- `drop(fn, code?, reason?)`: close connections matching a filter. The filter function receives `(clientId, data, index)` and returns a boolean. The default code is `CloseCode.Ok` (1000), which tells the client not to reconnect. Passing a custom code (e.g. 4000) allows the client to reconnect. To drop one client: `app.ws.drop(id => id === targetId)`.
|
|
558
558
|
|
|
@@ -562,7 +562,7 @@ The same commands are available inside endpoint handlers via `req.ws`:
|
|
|
562
562
|
export default function (req) {
|
|
563
563
|
const targetId = req.query.targetId
|
|
564
564
|
|
|
565
|
-
req.ws.send(
|
|
565
|
+
req.ws.send('ping', { from: 'handler' }, id => id === targetId)
|
|
566
566
|
|
|
567
567
|
return Response.json({ ok: true })
|
|
568
568
|
}
|
|
@@ -616,13 +616,11 @@ Produces a production build using `Bun.build()` with the plugin:
|
|
|
616
616
|
|
|
617
617
|
```bash
|
|
618
618
|
sleepy build
|
|
619
|
-
sleepy build --compile
|
|
620
|
-
sleepy build --compile --bytecode
|
|
621
619
|
```
|
|
622
620
|
|
|
623
|
-
Output goes to `./dist` by default.
|
|
624
|
-
|
|
625
|
-
|
|
621
|
+
Output goes to `./dist` by default. Build options like `compile`,
|
|
622
|
+
`bytecode`, and `outdir` are configured in `sleepy.config.ts` (see
|
|
623
|
+
[Configuration](#configuration)).
|
|
626
624
|
|
|
627
625
|
## Configuration
|
|
628
626
|
|
package/dist/cli/build.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/cli/build.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/cli/build.ts"],"names":[],"mappings":"AA+BA,wBAAsB,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC,CAyE5C"}
|
package/dist/core/utils.d.ts
CHANGED
|
@@ -102,10 +102,10 @@ export type SessionEntry = {
|
|
|
102
102
|
};
|
|
103
103
|
export type FilterFn = (clientId: string, data: unknown, index: number) => boolean;
|
|
104
104
|
export type SocketCommands = {
|
|
105
|
-
query: (fn: FilterFn) => SessionEntry[];
|
|
106
|
-
send: (fn: FilterFn, event: string, body: unknown) => void;
|
|
107
105
|
broadcast: (event: string, body: unknown) => void;
|
|
106
|
+
send: (event: string, body: unknown, fn: FilterFn) => void;
|
|
108
107
|
drop: (fn: FilterFn, code?: number, reason?: string) => void;
|
|
108
|
+
query: (fn: FilterFn) => SessionEntry[];
|
|
109
109
|
};
|
|
110
110
|
export type BaseRequest = {
|
|
111
111
|
method: HttpMethod;
|
package/dist/core/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/core/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,KAAK,CAAA;AACtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,KAAK,CAAA;AAE1D,eAAO,MAAM,UAAU;;;;;;;CAOb,CAAA;AAEV,MAAM,MAAM,UAAU,GAAG,OAAO,UAAU,CAAC,MAAM,OAAO,UAAU,CAAC,CAAA;AAEnE,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmEb,CAAA;AAEV,MAAM,MAAM,UAAU,GAAG,OAAO,UAAU,CAAC,MAAM,OAAO,UAAU,CAAC,CAAA;AAEnE,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;AAElD,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;AAClD,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,kBAAkB,CAAA;AACzD,MAAM,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,aAAa,CAAA;AAEtD,MAAM,MAAM,UAAU,GAAG,CACvB,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,MAAM,KACT,aAAa,CAAA;AAElB,MAAM,MAAM,OAAO,GAAG,CACpB,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,OAAO,KACT,aAAa,CAAA;AAElB,MAAM,MAAM,eAAe,GAAG,CAAC,UAAU,GAAG,OAAO,CAAC,EAAE,CAAA;AAEtD,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,EAAE,EAAE,gBAAgB,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,GAAG,EAAE,OAAO,CAAA;CACb,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;AAC/D,MAAM,MAAM,OAAO,GAAG,aAAa,GAAG,eAAe,CAAA;AAErD,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,GAAG,EAAE,OAAO,CAAA;CACb,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG,CACrB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,MAAM,KACV,OAAO,CAAA;AAEZ,MAAM,MAAM,cAAc,GAAG;IAC3B,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/core/utils.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/cli/build.ts
CHANGED
|
@@ -1,14 +1,37 @@
|
|
|
1
|
-
import path from 'path'
|
|
2
1
|
import fs from 'fs'
|
|
2
|
+
import path from 'path'
|
|
3
3
|
import { loadConfig } from '../plugin/config'
|
|
4
4
|
import { scanRoutes } from '../plugin/scanner'
|
|
5
5
|
import { generateBarrelModule } from '../plugin/codegen'
|
|
6
6
|
|
|
7
7
|
import type { BunPlugin } from 'bun'
|
|
8
8
|
|
|
9
|
+
function resolveCompileOption (
|
|
10
|
+
compile: boolean | string | undefined,
|
|
11
|
+
): { outfile: string } | undefined {
|
|
12
|
+
if (!compile) {
|
|
13
|
+
return undefined
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
if (typeof compile === 'string') {
|
|
17
|
+
return { outfile: compile }
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
try {
|
|
21
|
+
const raw = fs.readFileSync('package.json', 'utf-8')
|
|
22
|
+
const pkg = JSON.parse(raw)
|
|
23
|
+
|
|
24
|
+
if (pkg.name) {
|
|
25
|
+
return { outfile: pkg.name }
|
|
26
|
+
}
|
|
27
|
+
} catch {}
|
|
28
|
+
|
|
29
|
+
return { outfile: 'api' }
|
|
30
|
+
}
|
|
31
|
+
|
|
9
32
|
export async function build (): Promise<void> {
|
|
10
33
|
const config = await loadConfig()
|
|
11
|
-
const entrypoint = config.app?.entrypoint?? './src/index.ts'
|
|
34
|
+
const entrypoint = config.app?.entrypoint ?? './src/index.ts'
|
|
12
35
|
|
|
13
36
|
if (!fs.existsSync(entrypoint)) {
|
|
14
37
|
console.error(`Entrypoint not found: ${entrypoint}`)
|
|
@@ -45,7 +68,7 @@ export async function build (): Promise<void> {
|
|
|
45
68
|
target: 'bun',
|
|
46
69
|
minify: true,
|
|
47
70
|
bytecode: config.build?.bytecode || undefined,
|
|
48
|
-
compile: (config.build?.compile
|
|
71
|
+
compile: resolveCompileOption(config.build?.compile),
|
|
49
72
|
plugins: [...userPlugins, sleepyPlugin],
|
|
50
73
|
entrypoints: [entrypoint],
|
|
51
74
|
})
|
package/src/core/socket.ts
CHANGED
|
@@ -746,50 +746,50 @@ export function buildSocketCommands (state: SocketState): SocketCommands {
|
|
|
746
746
|
}
|
|
747
747
|
|
|
748
748
|
return {
|
|
749
|
-
|
|
750
|
-
const
|
|
749
|
+
broadcast (event, body) {
|
|
750
|
+
for (const clientId of state.activeSessions.keys()) {
|
|
751
|
+
sendToClient(clientId, event, body)
|
|
752
|
+
}
|
|
753
|
+
},
|
|
754
|
+
send (event, body, fn) {
|
|
751
755
|
let index = 0
|
|
752
756
|
|
|
757
|
+
/* TODO: look into concurrency at some point */
|
|
753
758
|
for (const [clientId, session] of state.activeSessions) {
|
|
754
759
|
if (fn(clientId, session.ws.data, index)) {
|
|
755
|
-
|
|
756
|
-
clientId,
|
|
757
|
-
app: session.ws.data.app,
|
|
758
|
-
})
|
|
760
|
+
sendToClient(clientId, event, body)
|
|
759
761
|
}
|
|
760
762
|
|
|
761
763
|
index += 1
|
|
762
764
|
}
|
|
763
|
-
|
|
764
|
-
return results
|
|
765
765
|
},
|
|
766
|
-
|
|
766
|
+
drop (fn, code, reason) {
|
|
767
767
|
let index = 0
|
|
768
768
|
|
|
769
|
-
/* TODO: look into concurrency at some point */
|
|
770
769
|
for (const [clientId, session] of state.activeSessions) {
|
|
771
770
|
if (fn(clientId, session.ws.data, index)) {
|
|
772
|
-
|
|
771
|
+
session.ws.close(code, reason)
|
|
773
772
|
}
|
|
774
773
|
|
|
775
774
|
index += 1
|
|
776
775
|
}
|
|
777
776
|
},
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
sendToClient(clientId, event, body)
|
|
781
|
-
}
|
|
782
|
-
},
|
|
783
|
-
drop (fn, code, reason) {
|
|
777
|
+
query (fn) {
|
|
778
|
+
const results: SessionEntry[] = []
|
|
784
779
|
let index = 0
|
|
785
780
|
|
|
786
781
|
for (const [clientId, session] of state.activeSessions) {
|
|
787
782
|
if (fn(clientId, session.ws.data, index)) {
|
|
788
|
-
|
|
783
|
+
results.push({
|
|
784
|
+
clientId,
|
|
785
|
+
app: session.ws.data.app,
|
|
786
|
+
})
|
|
789
787
|
}
|
|
790
788
|
|
|
791
789
|
index += 1
|
|
792
790
|
}
|
|
791
|
+
|
|
792
|
+
return results
|
|
793
793
|
},
|
|
794
794
|
}
|
|
795
795
|
}
|
package/src/core/utils.ts
CHANGED
|
@@ -133,10 +133,10 @@ export type FilterFn = (
|
|
|
133
133
|
) => boolean
|
|
134
134
|
|
|
135
135
|
export type SocketCommands = {
|
|
136
|
-
query: (fn: FilterFn) => SessionEntry[]
|
|
137
|
-
send: (fn: FilterFn, event: string, body: unknown) => void
|
|
138
136
|
broadcast: (event: string, body: unknown) => void
|
|
137
|
+
send: (event: string, body: unknown, fn: FilterFn) => void
|
|
139
138
|
drop: (fn: FilterFn, code?: number, reason?: string) => void
|
|
139
|
+
query: (fn: FilterFn) => SessionEntry[]
|
|
140
140
|
}
|
|
141
141
|
|
|
142
142
|
export type BaseRequest = {
|