@simplysm/service-server 13.0.28 → 13.0.30
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 +23 -14
- package/dist/core/define-service.d.ts.map +1 -1
- package/dist/core/define-service.js.map +1 -1
- package/dist/protocol/protocol-wrapper.d.ts.map +1 -1
- package/dist/protocol/protocol-wrapper.js.map +1 -1
- package/dist/service-server.d.ts.map +1 -1
- package/dist/service-server.js +23 -11
- package/dist/service-server.js.map +1 -1
- package/dist/services/auto-update-service.d.ts.map +1 -1
- package/dist/services/auto-update-service.js.map +1 -1
- package/dist/services/orm-service.d.ts.map +1 -1
- package/dist/services/orm-service.js +4 -1
- package/dist/services/orm-service.js.map +1 -1
- package/dist/transport/socket/service-socket.d.ts.map +1 -1
- package/dist/transport/socket/service-socket.js.map +1 -1
- package/dist/transport/socket/websocket-handler.d.ts.map +1 -1
- package/dist/transport/socket/websocket-handler.js +3 -1
- package/dist/transport/socket/websocket-handler.js.map +1 -1
- package/docs/authentication.md +33 -24
- package/docs/built-in-services.md +13 -29
- package/docs/server.md +13 -2
- package/docs/transport.md +62 -4
- package/package.json +6 -6
- package/src/core/define-service.ts +9 -3
- package/src/protocol/protocol-wrapper.ts +4 -1
- package/src/service-server.ts +24 -13
- package/src/services/auto-update-service.ts +2 -1
- package/src/services/orm-service.ts +19 -5
- package/src/transport/socket/service-socket.ts +5 -1
- package/src/transport/socket/websocket-handler.ts +16 -4
package/README.md
CHANGED
|
@@ -16,41 +16,49 @@ pnpm add @simplysm/service-server
|
|
|
16
16
|
|
|
17
17
|
### Core Functions and Classes
|
|
18
18
|
|
|
19
|
-
- [`createServiceServer`](#basic-server-configuration) - Factory function for creating a ServiceServer instance
|
|
20
|
-
- [`ServiceServer`](docs/server.md#serviceserver) - Main server class. Creates Fastify instance and configures routes/plugins
|
|
19
|
+
- [`createServiceServer`](#basic-server-configuration) - Factory function for creating a `ServiceServer` instance
|
|
20
|
+
- [`ServiceServer`](docs/server.md#serviceserver) - Main server class. Creates a Fastify instance and configures routes/plugins
|
|
21
21
|
- [`defineService`](#custom-services) - Defines a service with a factory function pattern
|
|
22
|
-
- `
|
|
22
|
+
- [`ServiceContext`](docs/server.md#servicecontext) - Context object passed to service factory functions
|
|
23
|
+
- `runServiceMethod` - Internal function that dispatches a service method call (auth checks + execution)
|
|
23
24
|
|
|
24
25
|
### Authentication
|
|
25
26
|
|
|
26
|
-
- [`auth`](#authentication) -
|
|
27
|
-
- [`getServiceAuthPermissions`](#
|
|
28
|
-
- [`
|
|
27
|
+
- [`auth`](#authentication) - Wrapper that sets authentication requirements at service or method level
|
|
28
|
+
- [`getServiceAuthPermissions`](docs/authentication.md#getserviceauthpermissions) - Reads auth permissions from an `auth()`-wrapped function
|
|
29
|
+
- [`signJwt`](docs/authentication.md#jwt-functions) - Generate a JWT token (HS256, 12-hour expiration)
|
|
30
|
+
- [`verifyJwt`](docs/authentication.md#jwt-functions) - Verify and decode a JWT token
|
|
31
|
+
- [`decodeJwt`](docs/authentication.md#jwt-functions) - Decode a JWT token without verification (synchronous)
|
|
29
32
|
- [`AuthTokenPayload`](docs/authentication.md#authtokenpayload) - JWT payload interface (includes `roles`, `data`)
|
|
30
33
|
|
|
31
34
|
### Transport Layer - WebSocket
|
|
32
35
|
|
|
33
|
-
- `WebSocketHandler` -
|
|
34
|
-
-
|
|
36
|
+
- [`WebSocketHandler`](docs/transport.md#websockethandler) - Interface for managing multiple WebSocket connections, routing messages, and broadcasting events
|
|
37
|
+
- `createWebSocketHandler` - Factory function that creates a `WebSocketHandler` instance
|
|
38
|
+
- [`ServiceSocket`](docs/transport.md#servicesocket) - Interface wrapping a single WebSocket connection. Manages ping/pong, protocol encoding/decoding, event listener management
|
|
39
|
+
- `createServiceSocket` - Factory function that creates a `ServiceSocket` instance
|
|
35
40
|
|
|
36
41
|
### Transport Layer - HTTP
|
|
37
42
|
|
|
38
|
-
- `
|
|
39
|
-
-
|
|
40
|
-
- `
|
|
43
|
+
- `handleHttpRequest` - Handles service method calls via HTTP at `/api/:service/:method`
|
|
44
|
+
- `handleUpload` - Handles multipart file upload at `/upload` (auth required)
|
|
45
|
+
- `handleStaticFile` - Serves static files from `rootPath/www/`. Prevents path traversal and blocks hidden files
|
|
41
46
|
|
|
42
47
|
### Protocol
|
|
43
48
|
|
|
44
|
-
- [`ProtocolWrapper`](docs/transport.md#protocolwrapper) -
|
|
49
|
+
- [`ProtocolWrapper`](docs/transport.md#protocolwrapper) - Interface for message encoding/decoding. Messages over 30KB are processed in worker threads
|
|
50
|
+
- `createProtocolWrapper` - Factory function that creates a `ProtocolWrapper` instance
|
|
45
51
|
|
|
46
52
|
### Built-in Services
|
|
47
53
|
|
|
48
54
|
- [`OrmService`](docs/built-in-services.md#ormservice) - DB connection/transaction/query execution (WebSocket only, auth required)
|
|
55
|
+
- `OrmServiceType` - Type alias for `OrmService` method signatures (for client-side type sharing)
|
|
49
56
|
- [`AutoUpdateService`](docs/built-in-services.md#autoupdateservice) - App auto-update (provides latest version query and download path)
|
|
57
|
+
- `AutoUpdateServiceType` - Type alias for `AutoUpdateService` method signatures (for client-side type sharing)
|
|
50
58
|
|
|
51
59
|
### Utilities
|
|
52
60
|
|
|
53
|
-
- [`getConfig`](docs/server.md#getconfig) - JSON config file loading with caching and real-time file watching
|
|
61
|
+
- [`getConfig`](docs/server.md#getconfig) - JSON config file loading with caching and real-time file watching
|
|
54
62
|
|
|
55
63
|
### Legacy
|
|
56
64
|
|
|
@@ -119,7 +127,8 @@ The `ctx` parameter provides access to server resources:
|
|
|
119
127
|
- `ctx.http` - HTTP request/reply objects (HTTP only, undefined for WebSocket)
|
|
120
128
|
- `ctx.authInfo` - Authentication info (set via JWT token)
|
|
121
129
|
- `ctx.clientName` - Client identifier
|
|
122
|
-
- `ctx.
|
|
130
|
+
- `ctx.clientPath` - Resolved per-client directory path (`rootPath/www/{clientName}`)
|
|
131
|
+
- `ctx.getConfig(section)` - Get server config by section name
|
|
123
132
|
|
|
124
133
|
### Authentication
|
|
125
134
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define-service.d.ts","sourceRoot":"","sources":["../../src/core/define-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAOnE,MAAM,WAAW,cAAc,CAAC,SAAS,GAAG,OAAO;IACjD,MAAM,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,IAAI,CAAC,EAAE;QACL,UAAU,EAAE,MAAM,CAAC;QACnB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;KAChD,CAAC;IAEF,2CAA2C;IAC3C,MAAM,CAAC,EAAE;QACP,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IAEF,IAAI,QAAQ,IAAI,SAAS,GAAG,SAAS,CAAC;IACtC,IAAI,UAAU,IAAI,MAAM,GAAG,SAAS,CAAC;IACrC,IAAI,UAAU,IAAI,MAAM,GAAG,SAAS,CAAC;IACrC,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAC3C;AAED,wBAAgB,oBAAoB,CAAC,SAAS,GAAG,OAAO,EACtD,MAAM,EAAE,aAAa,CAAC,SAAS,CAAC,EAChC,MAAM,CAAC,EAAE,aAAa,EACtB,IAAI,CAAC,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAA;CAAE,EAC7E,MAAM,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/B,cAAc,CAAC,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"define-service.d.ts","sourceRoot":"","sources":["../../src/core/define-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAOnE,MAAM,WAAW,cAAc,CAAC,SAAS,GAAG,OAAO;IACjD,MAAM,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,IAAI,CAAC,EAAE;QACL,UAAU,EAAE,MAAM,CAAC;QACnB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;KAChD,CAAC;IAEF,2CAA2C;IAC3C,MAAM,CAAC,EAAE;QACP,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IAEF,IAAI,QAAQ,IAAI,SAAS,GAAG,SAAS,CAAC;IACtC,IAAI,UAAU,IAAI,MAAM,GAAG,SAAS,CAAC;IACrC,IAAI,UAAU,IAAI,MAAM,GAAG,SAAS,CAAC;IACrC,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAC3C;AAED,wBAAgB,oBAAoB,CAAC,SAAS,GAAG,OAAO,EACtD,MAAM,EAAE,aAAa,CAAC,SAAS,CAAC,EAChC,MAAM,CAAC,EAAE,aAAa,EACtB,IAAI,CAAC,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAA;CAAE,EAC7E,MAAM,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/B,cAAc,CAAC,SAAS,CAAC,CAoD3B;AAMD,+FAA+F;AAC/F,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,EAAE,GAAG,SAAS,CAE5E;AAED;;;;;;;GAOG;AACH,wBAAgB,IAAI,CAAC,SAAS,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAAE,EAAE,EAAE,SAAS,GAAG,SAAS,CAAC;AAC1F,wBAAgB,IAAI,CAAC,SAAS,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAC5D,WAAW,EAAE,MAAM,EAAE,EACrB,EAAE,EAAE,SAAS,GACZ,SAAS,CAAC;AAcb,MAAM,WAAW,iBAAiB,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;IACnF,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,QAAQ,CAAC;IAC3C,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAAC,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,EACpF,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,QAAQ,GACzC,iBAAiB,CAAC,QAAQ,CAAC,CAM7B;AAID;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,CAAC,WAAW,IACpC,WAAW,SAAS,iBAAiB,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/core/define-service.ts"],
|
|
4
|
-
"mappings": "AAGA,SAAS,gBAAgB;AACzB,SAAS,iBAAiB;AAC1B,OAAO,UAAU;AAuBV,SAAS,qBACd,QACA,QACA,MACA,QAC2B;AAC3B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IAEA,IAAI,WAAkC;AACpC,aAAQ,QAAQ,kBAAkB,QAAQ,MAAM,kBAAkB;AAAA,
|
|
4
|
+
"mappings": "AAGA,SAAS,gBAAgB;AACzB,SAAS,iBAAiB;AAC1B,OAAO,UAAU;AAuBV,SAAS,qBACd,QACA,QACA,MACA,QAC2B;AAC3B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IAEA,IAAI,WAAkC;AACpC,aAAQ,QAAQ,kBAAkB,QAAQ,MAAM,kBAAkB;AAAA,IAGpE;AAAA,IAEA,IAAI,aAAiC;AACnC,YAAM,OAAO,QAAQ,cAAc,MAAM,cAAc,QAAQ;AAC/D,UAAI,QAAQ,KAAM,QAAO;AAEzB,UAAI,SAAS,MAAM,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,GAAG,KAAK,KAAK,SAAS,IAAI,GAAG;AACnF,cAAM,IAAI,MAAM,kGAAuB,IAAI,EAAE;AAAA,MAC/C;AAEA,aAAO;AAAA,IACT;AAAA,IAEA,IAAI,aAAiC;AACnC,YAAM,OAAO,KAAK;AAClB,aAAO,QAAQ,OAAO,SAAY,KAAK,QAAQ,OAAO,QAAQ,UAAU,OAAO,IAAI;AAAA,IACrF;AAAA,IAEA,MAAM,UAAa,SAA6B;AAC9C,UAAI,eAA8C,CAAC;AAEnD,YAAM,eAAe,KAAK,QAAQ,OAAO,QAAQ,UAAU,cAAc;AACzE,YAAM,aAAa,MAAM,UAA6B,YAAY;AAClE,UAAI,cAAc,MAAM;AACtB,uBAAe;AAAA,MACjB;AAEA,YAAM,aAAa,KAAK;AACxB,UAAI,cAAc,MAAM;AACtB,cAAM,iBAAiB,KAAK,QAAQ,YAAY,cAAc;AAC9D,cAAM,eAAe,MAAM,UAA6B,cAAc;AACtE,YAAI,gBAAgB,MAAM;AACxB,yBAAe,SAAS,cAAc,YAAY;AAAA,QACpD;AAAA,MACF;AAEA,YAAM,SAAS,aAAa,OAAO;AACnC,UAAI,UAAU,KAAM,OAAM,IAAI,MAAM,iFAAqB,OAAO,EAAE;AAClE,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAIA,MAAM,mBAAmB,uBAAO,iBAAiB;AAG1C,SAAS,0BAA0B,IAAoC;AAC5E,SAAQ,GAA0C,gBAAgB;AACpE;AAeO,SAAS,KAAK,iBAAsC,SAA8B;AACvF,QAAM,cAAc,MAAM,QAAQ,eAAe,IAAI,kBAAkB,CAAC;AACxE,QAAM,KAAK,MAAM,QAAQ,eAAe,IAAI,UAAW;AAGvD,QAAM,UAAU,IAAI,SAAoB,GAAG,GAAG,IAAI;AAClD,EAAC,QAA+C,gBAAgB,IAAI;AAEpE,SAAO;AACT;AAyBO,SAAS,cACd,MACA,SAC6B;AAC7B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,iBAAiB,0BAA0B,OAAO;AAAA,EACpD;AACF;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol-wrapper.d.ts","sourceRoot":"","sources":["../../src/protocol/protocol-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAEnD,OAAO,KAAK,EAAE,0BAA0B,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAI3F;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAE/F;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,0BAA0B,CAAC,cAAc,CAAC,CAAC,CAAC;IAE1E;;OAEG;IACH,OAAO,IAAI,IAAI,CAAC;CACjB;AAiBD;;;;;GAKG;AACH,wBAAgB,qBAAqB,IAAI,eAAe,
|
|
1
|
+
{"version":3,"file":"protocol-wrapper.d.ts","sourceRoot":"","sources":["../../src/protocol/protocol-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAEnD,OAAO,KAAK,EAAE,0BAA0B,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAI3F;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAE/F;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,0BAA0B,CAAC,cAAc,CAAC,CAAC,CAAC;IAE1E;;OAEG;IACH,OAAO,IAAI,IAAI,CAAC;CACjB;AAiBD;;;;;GAKG;AACH,wBAAgB,qBAAqB,IAAI,eAAe,CA8DvD"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/protocol/protocol-wrapper.ts"],
|
|
4
|
-
"mappings": "AACA,SAAS,cAAgC;AAEzC,SAAS,6BAA6B;AA2BtC,IAAI;AAEJ,SAAS,YAA6D;AACpE,MAAI,gBAAgB,MAAM;AACxB,mBAAe,OAAO;AAAA,MACpB,YAAY,QAAQ,oCAAoC;AAAA,MACxD;AAAA,QACE,gBAAgB,EAAE,wBAAwB,KAAK;AAAA,MACjD;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAQO,SAAS,wBAAyC;AAKvD,QAAM,WAAW,sBAAsB;AACvC,QAAM,iBAAiB,KAAK;AAS5B,WAAS,yBAAyB,KAA8B;AAC9D,QAAI,EAAE,UAAU,KAAM,QAAO;AAE7B,UAAM,OAAO,IAAI;AAGjB,QAAI,gBAAgB,YAAY;AAC9B,aAAO;AAAA,IACT;AAGA,QAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,aAAO,KAAK,SAAS,KAAK,KAAK,KAAK,CAAC,SAAS,gBAAgB,UAAU;AAAA,IAC1E;AAEA,WAAO;AAAA,EACT;AAMA,SAAO;AAAA,IACL,MAAM,
|
|
4
|
+
"mappings": "AACA,SAAS,cAAgC;AAEzC,SAAS,6BAA6B;AA2BtC,IAAI;AAEJ,SAAS,YAA6D;AACpE,MAAI,gBAAgB,MAAM;AACxB,mBAAe,OAAO;AAAA,MACpB,YAAY,QAAQ,oCAAoC;AAAA,MACxD;AAAA,QACE,gBAAgB,EAAE,wBAAwB,KAAK;AAAA,MACjD;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAQO,SAAS,wBAAyC;AAKvD,QAAM,WAAW,sBAAsB;AACvC,QAAM,iBAAiB,KAAK;AAS5B,WAAS,yBAAyB,KAA8B;AAC9D,QAAI,EAAE,UAAU,KAAM,QAAO;AAE7B,UAAM,OAAO,IAAI;AAGjB,QAAI,gBAAgB,YAAY;AAC9B,aAAO;AAAA,IACT;AAGA,QAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,aAAO,KAAK,SAAS,KAAK,KAAK,KAAK,CAAC,SAAS,gBAAgB,UAAU;AAAA,IAC1E;AAEA,WAAO;AAAA,EACT;AAMA,SAAO;AAAA,IACL,MAAM,OACJ,MACA,SACiD;AACjD,UAAI,yBAAyB,OAAO,GAAG;AACrC,eAAO,UAAU,EAAE,OAAO,MAAM,OAAO;AAAA,MACzC,OAAO;AACL,eAAO,SAAS,OAAO,MAAM,OAAO;AAAA,MACtC;AAAA,IACF;AAAA,IAEA,MAAM,OAAO,OAAmE;AAC9E,YAAM,YAAY,MAAM;AACxB,UAAI,YAAY,gBAAgB;AAC9B,eAAO,UAAU,EAAE,OAAO,KAAK;AAAA,MACjC,OAAO;AACL,eAAO,SAAS,OAAO,KAAK;AAAA,MAC9B;AAAA,IACF;AAAA,IAEA,UAAgB;AACd,eAAS,QAAQ;AAAA,IACnB;AAAA,EACF;AACF;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-server.d.ts","sourceRoot":"","sources":["../src/service-server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAIhE,OAAO,EAA4B,YAAY,EAAO,MAAM,uBAAuB,CAAC;AACpF,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,SAAS,CAAC;AAa/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAOnE,qBAAa,aAAa,CAAC,SAAS,GAAG,OAAO,CAAE,SAAQ,YAAY,CAAC;IACnE,KAAK,EAAE,IAAI,CAAC;IACZ,KAAK,EAAE,IAAI,CAAC;CACb,CAAC;IAOY,QAAQ,CAAC,OAAO,EAAE,oBAAoB;IANlD,MAAM,UAAS;IAEf,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA4C;IAEvE,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;gBAEb,OAAO,EAAE,oBAAoB;
|
|
1
|
+
{"version":3,"file":"service-server.d.ts","sourceRoot":"","sources":["../src/service-server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAIhE,OAAO,EAA4B,YAAY,EAAO,MAAM,uBAAuB,CAAC;AACpF,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,SAAS,CAAC;AAa/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAOnE,qBAAa,aAAa,CAAC,SAAS,GAAG,OAAO,CAAE,SAAQ,YAAY,CAAC;IACnE,KAAK,EAAE,IAAI,CAAC;IACZ,KAAK,EAAE,IAAI,CAAC;CACb,CAAC;IAOY,QAAQ,CAAC,OAAO,EAAE,oBAAoB;IANlD,MAAM,UAAS;IAEf,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA4C;IAEvE,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;gBAEb,OAAO,EAAE,oBAAoB;IAiB5C,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IA4IvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAStB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC;IAK3E,SAAS,CAAC,KAAK,EAAE,KAAK,EAC1B,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,EACvC,YAAY,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,OAAO,EACtC,IAAI,EAAE,KAAK;IAKP,iBAAiB,CAAC,OAAO,EAAE,gBAAgB,CAAC,SAAS,CAAC;IAOtD,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAO1E,OAAO,CAAC,yBAAyB;CAyBlC;AAED,wBAAgB,mBAAmB,CAAC,SAAS,GAAG,OAAO,EACrD,OAAO,EAAE,oBAAoB,GAC5B,aAAa,CAAC,SAAS,CAAC,CAE1B"}
|
package/dist/service-server.js
CHANGED
|
@@ -23,7 +23,10 @@ class ServiceServer extends EventEmitter {
|
|
|
23
23
|
this.options = options;
|
|
24
24
|
const httpsConf = options.ssl ? { pfx: Buffer.from(options.ssl.pfxBytes), passphrase: options.ssl.passphrase } : null;
|
|
25
25
|
this.fastify = fastify({ https: httpsConf });
|
|
26
|
-
this._wsHandler = createWebSocketHandler(
|
|
26
|
+
this._wsHandler = createWebSocketHandler(
|
|
27
|
+
(def) => runServiceMethod(this, def),
|
|
28
|
+
options.auth?.jwtSecret
|
|
29
|
+
);
|
|
27
30
|
}
|
|
28
31
|
isOpen = false;
|
|
29
32
|
_wsHandler;
|
|
@@ -61,19 +64,28 @@ class ServiceServer extends EventEmitter {
|
|
|
61
64
|
allowedHeaders: ["Content-Type", "Authorization", "x-sd-client-name"],
|
|
62
65
|
exposedHeaders: ["Content-Disposition", "Content-Length"]
|
|
63
66
|
});
|
|
64
|
-
this.fastify.addContentTypeParser(
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
67
|
+
this.fastify.addContentTypeParser(
|
|
68
|
+
"application/json",
|
|
69
|
+
{ parseAs: "string" },
|
|
70
|
+
(req, body, done) => {
|
|
71
|
+
try {
|
|
72
|
+
const json = jsonParse(body);
|
|
73
|
+
done(null, json);
|
|
74
|
+
} catch (err) {
|
|
75
|
+
const error = err;
|
|
76
|
+
error.statusCode = 400;
|
|
77
|
+
done(error, void 0);
|
|
78
|
+
}
|
|
72
79
|
}
|
|
73
|
-
|
|
80
|
+
);
|
|
74
81
|
this.fastify.setSerializerCompiler(() => (data) => jsonStringify(data));
|
|
75
82
|
this.fastify.all("/api/:service/:method", async (req, reply) => {
|
|
76
|
-
await handleHttpRequest(
|
|
83
|
+
await handleHttpRequest(
|
|
84
|
+
req,
|
|
85
|
+
reply,
|
|
86
|
+
this.options.auth?.jwtSecret,
|
|
87
|
+
(def) => runServiceMethod(this, def)
|
|
88
|
+
);
|
|
77
89
|
});
|
|
78
90
|
this.fastify.all("/upload", async (req, reply) => {
|
|
79
91
|
await handleUpload(req, reply, this.options.rootPath, this.options.auth?.jwtSecret);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/service-server.ts"],
|
|
4
|
-
"mappings": "AACA,SAAS,wBAAwB;AACjC,SAAS,yBAAyB;AAClC,SAAS,wBAAwB;AACjC,SAAS,eAAe,WAAW,cAAc,WAAW;AAE5D,OAAO,aAAa;AACpB,OAAO,sBAAsB;AAC7B,OAAO,mBAAmB;AAC1B,OAAO,sBAAsB;AAC7B,OAAO,mBAAmB;AAC1B,OAAO,iBAAiB;AACxB,OAAO,UAAU;AACjB,SAAS,cAAc;AACvB,SAAS,oBAAoB;AAC7B,SAAS,8BAA8B;AAEvC,SAAS,SAAS,iBAAiB;AAGnC,SAAS,0BAA0B;AACnC,SAAS,4BAA4B;AACrC,OAAO,aAAa;AAEpB,MAAM,SAAS,QAAQ,QAAQ,8BAA8B;AAEtD,MAAM,sBAA2C,aAGrD;AAAA,EAOD,YAAqB,SAA+B;AAClD,UAAM;AADa;AAKnB,UAAM,YAAY,QAAQ,MACtB,EAAE,KAAK,OAAO,KAAK,QAAQ,IAAI,QAAQ,GAAG,YAAY,QAAQ,IAAI,WAAW,IAC7E;AAEJ,SAAK,UAAU,QAAQ,EAAE,OAAO,UAAU,CAAC;AAE3C,SAAK,aAAa,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-update-service.d.ts","sourceRoot":"","sources":["../../src/services/auto-update-service.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE5E,eAAO,MAAM,iBAAiB;6BACG,MAAM,GAAG,OAAO,CAC3C;QACE,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,EAAE,MAAM,CAAC;KACtB,GACD,SAAS,CACZ;
|
|
1
|
+
{"version":3,"file":"auto-update-service.d.ts","sourceRoot":"","sources":["../../src/services/auto-update-service.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE5E,eAAO,MAAM,iBAAiB;6BACG,MAAM,GAAG,OAAO,CAC3C;QACE,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,EAAE,MAAM,CAAC;KACtB,GACD,SAAS,CACZ;EAuCA,CAAC;AAEJ,MAAM,MAAM,qBAAqB,GAAG,cAAc,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/services/auto-update-service.ts"],
|
|
4
|
-
"mappings": "AAAA,OAAO,UAAU;AACjB,OAAO,YAAY;AACnB,SAAS,UAAU,iBAAiB;AACpC,SAAS,qBAA0C;AAE5C,MAAM,oBAAoB,cAAc,cAAc,CAAC,SAAS;AAAA,EACrE,MAAM,eAAe,UAMnB;AACA,UAAM,aAAa,IAAI;AACvB,QAAI,cAAc,KAAM,OAAM,IAAI,MAAM,iGAAsB;AAE9D,QAAI,CAAE,MAAM,SAAS,KAAK,QAAQ,YAAY,UAAU,SAAS,CAAC,EAAI,QAAO;AAE7E,UAAM,UAAU,MAAM,UAAU,KAAK,QAAQ,YAAY,UAAU,SAAS,CAAC;AAC7E,UAAM,WAAW,QACd,IAAI,CAAC,UAAU;AAAA,MACd,UAAU;AAAA,MACV,SAAS,KAAK,SAAS,MAAM,KAAK,QAAQ,IAAI,CAAC;AAAA,MAC/C,SAAS,KAAK,QAAQ,IAAI;AAAA,IAC5B,EAAE,EACD,OAAO,CAAC,SAAS;AAChB,UAAI,aAAa,WAAW;AAC1B,eAAO,KAAK,YAAY,UAAU,YAAY,KAAK,KAAK,OAAO;AAAA,MACjE,OAAO;AACL,eAAO,KAAK,YAAY,UAAU,YAAY,KAAK,KAAK,OAAO;AAAA,MACjE;AAAA,IACF,CAAC;AAEH,UAAM,UAAU,OAAO;AAAA,MACrB,SAAS,IAAI,CAAC,SAAS,KAAK,OAAO;AAAA,MACnC;AAAA,IACF;AAEA,QAAI,WAAW,KAAM,QAAO;AAE5B,UAAM,cAAc,SAAS,KAAK,CAAC,SAAS,KAAK,YAAY,OAAO;AACpE,QAAI,eAAe,KAAM,QAAO;AAEhC,UAAM,
|
|
4
|
+
"mappings": "AAAA,OAAO,UAAU;AACjB,OAAO,YAAY;AACnB,SAAS,UAAU,iBAAiB;AACpC,SAAS,qBAA0C;AAE5C,MAAM,oBAAoB,cAAc,cAAc,CAAC,SAAS;AAAA,EACrE,MAAM,eAAe,UAMnB;AACA,UAAM,aAAa,IAAI;AACvB,QAAI,cAAc,KAAM,OAAM,IAAI,MAAM,iGAAsB;AAE9D,QAAI,CAAE,MAAM,SAAS,KAAK,QAAQ,YAAY,UAAU,SAAS,CAAC,EAAI,QAAO;AAE7E,UAAM,UAAU,MAAM,UAAU,KAAK,QAAQ,YAAY,UAAU,SAAS,CAAC;AAC7E,UAAM,WAAW,QACd,IAAI,CAAC,UAAU;AAAA,MACd,UAAU;AAAA,MACV,SAAS,KAAK,SAAS,MAAM,KAAK,QAAQ,IAAI,CAAC;AAAA,MAC/C,SAAS,KAAK,QAAQ,IAAI;AAAA,IAC5B,EAAE,EACD,OAAO,CAAC,SAAS;AAChB,UAAI,aAAa,WAAW;AAC1B,eAAO,KAAK,YAAY,UAAU,YAAY,KAAK,KAAK,OAAO;AAAA,MACjE,OAAO;AACL,eAAO,KAAK,YAAY,UAAU,YAAY,KAAK,KAAK,OAAO;AAAA,MACjE;AAAA,IACF,CAAC;AAEH,UAAM,UAAU,OAAO;AAAA,MACrB,SAAS,IAAI,CAAC,SAAS,KAAK,OAAO;AAAA,MACnC;AAAA,IACF;AAEA,QAAI,WAAW,KAAM,QAAO;AAE5B,UAAM,cAAc,SAAS,KAAK,CAAC,SAAS,KAAK,YAAY,OAAO;AACpE,QAAI,eAAe,KAAM,QAAO;AAEhC,UAAM,eACJ,MAAM,KAAK,KAAK,IAAI,cAAc,IAAI,UAAU,WAAW,YAAY,QAAQ;AAEjF,WAAO;AAAA,MACL,SAAS,QAAQ,SAAS;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AACF,EAAE;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orm-service.d.ts","sourceRoot":"","sources":["../../src/services/orm-service.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,UAAU,EAEf,KAAK,OAAO,EACZ,KAAK,cAAc,EAEnB,KAAK,QAAQ,EACb,KAAK,UAAU,EAChB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAClF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAS9D,eAAO,MAAM,UAAU;
|
|
1
|
+
{"version":3,"file":"orm-service.d.ts","sourceRoot":"","sources":["../../src/services/orm-service.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,UAAU,EAEf,KAAK,OAAO,EACZ,KAAK,cAAc,EAEnB,KAAK,QAAQ,EACb,KAAK,UAAU,EAChB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAClF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAS9D,eAAO,MAAM,UAAU;iBA+BE,aAAa,GAAG;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAClE,OAAO,EAAE,OAAO,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;iBASiB,aAAa,GAAG;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;kBA2CvD,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;6BASX,MAAM,mBAAmB,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;8BAKtD,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;gCAKpB,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;gCAM9C,MAAM,SACP,MAAM,WACJ,OAAO,EAAE,GACjB,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;wBAMb,MAAM,QACR,QAAQ,EAAE,YACN,CAAC,UAAU,GAAG,SAAS,CAAC,EAAE,GACnC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;uBA8Bb,MAAM,aACH,MAAM,cACL,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,WAC7B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GACjC,OAAO,CAAC,IAAI,CAAC;EAMrB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,cAAc,CAAC,OAAO,UAAU,CAAC,CAAC"}
|
|
@@ -112,7 +112,10 @@ const OrmService = defineService(
|
|
|
112
112
|
for (let i = 0; i < result.length; i++) {
|
|
113
113
|
const opt = options?.[i];
|
|
114
114
|
if (opt != null) {
|
|
115
|
-
const parsedResult = await parseQueryResult(
|
|
115
|
+
const parsedResult = await parseQueryResult(
|
|
116
|
+
result[i],
|
|
117
|
+
opt
|
|
118
|
+
);
|
|
116
119
|
parsed.push(parsedResult ?? []);
|
|
117
120
|
} else {
|
|
118
121
|
parsed.push(result[i]);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/services/orm-service.ts"],
|
|
4
|
-
"mappings": "AAAA,SAAS,oBAAoD;AAC7D;AAAA,EAEE;AAAA,EAGA;AAAA,OAGK;AACP,SAAS,eAAe,YAAiC;AAGzD,OAAO,aAAa;AAEpB,MAAM,SAAS,QAAQ,QAAQ,2BAA2B;AAG1D,MAAM,cAAc,oBAAI,QAA4C;AAE7D,MAAM,aAAa;AAAA,EACxB;AAAA,EACA,KAAK,CAAC,QAAQ;AACZ,UAAM,OAAO,MAAqB;AAChC,YAAM,SAAS,IAAI;AACnB,UAAI,UAAU,MAAM;AAClB,cAAM,IAAI,MAAM,gKAAkD;AAAA,MACpE;AACA,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,OAAO,QAAuE;AAC5F,YAAM,UAAU,MAAM,IAAI,UAAoD,KAAK,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-socket.d.ts","sourceRoot":"","sources":["../../../src/transport/socket/service-socket.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAG9C,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC/B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEtE,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"service-socket.d.ts","sourceRoot":"","sources":["../../../src/transport/socket/service-socket.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAG9C,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC/B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEtE,OAAO,KAAK,EACV,oBAAoB,EACpB,oBAAoB,EAErB,MAAM,0BAA0B,CAAC;AAIlC;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,mBAAmB,EAAE,QAAQ,CAAC;IACvC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IAEpC;;OAEG;IACH,KAAK,IAAI,IAAI,CAAC;IAEd;;OAEG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAE/D;;OAEG;IACH,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IAEtE;;OAEG;IACH,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAEvC;;OAEG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAE5E;;OAEG;IACH,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;IAEtD;;OAEG;IACH,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAAC;IACxD,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAC1D,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,oBAAoB,CAAA;KAAE,KAAK,IAAI,GAAG,IAAI,CAAC;CAClG;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,cAAc,GACtB,aAAa,CAgKf"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/transport/socket/service-socket.ts"],
|
|
4
|
-
"mappings": "AACA,SAAS,gBAAgB;AAEzB,SAAS,qBAAqB;AAC9B,OAAO,aAAa;AACpB,SAAS,iBAAiB;AAE1B,SAAS,6BAA6B;
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket-handler.d.ts","sourceRoot":"","sources":["../../../src/transport/socket/websocket-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAEpC,OAAO,KAAK,EAAE,eAAe,EAAwB,MAAM,0BAA0B,CAAC;AACtF,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAE3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAK9C;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CAAC;IAElG;;OAEG;IACH,QAAQ,IAAI,IAAI,CAAC;IAEjB;;OAEG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5F;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,KAAK,EACvB,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,EACvC,YAAY,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,OAAO,EACtC,IAAI,EAAE,KAAK,GACV,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,CAAC,GAAG,EAAE;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB,KAAK,OAAO,CAAC,OAAO,CAAC,EACtB,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,gBAAgB,
|
|
1
|
+
{"version":3,"file":"websocket-handler.d.ts","sourceRoot":"","sources":["../../../src/transport/socket/websocket-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAEpC,OAAO,KAAK,EAAE,eAAe,EAAwB,MAAM,0BAA0B,CAAC;AACtF,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAE3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAK9C;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CAAC;IAElG;;OAEG;IACH,QAAQ,IAAI,IAAI,CAAC;IAEjB;;OAEG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5F;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,KAAK,EACvB,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,EACvC,YAAY,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,OAAO,EACtC,IAAI,EAAE,KAAK,GACV,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,CAAC,GAAG,EAAE;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB,KAAK,OAAO,CAAC,OAAO,CAAC,EACtB,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,gBAAgB,CAgMlB"}
|
|
@@ -26,7 +26,9 @@ function createWebSocketHandler(runMethod, jwtSecret) {
|
|
|
26
26
|
return await serviceSocket.send(uuid, { name: "response" });
|
|
27
27
|
} else if (message.name === "evt:gets") {
|
|
28
28
|
const { name } = message.body;
|
|
29
|
-
const infos = Array.from(socketMap.values()).flatMap(
|
|
29
|
+
const infos = Array.from(socketMap.values()).flatMap(
|
|
30
|
+
(subSock) => subSock.getEventListeners(name)
|
|
31
|
+
);
|
|
30
32
|
return await serviceSocket.send(uuid, { name: "response", body: infos });
|
|
31
33
|
} else if (message.name === "evt:emit") {
|
|
32
34
|
const { keys, data } = message.body;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/transport/socket/websocket-handler.ts"],
|
|
4
|
-
"mappings": "AACA,SAAS,YAAY;AAErB,SAAS,2BAA+C;AACxD,SAAS,iBAAiB;AAE1B,OAAO,aAAa;AAEpB,MAAM,SAAS,QAAQ,QAAQ,iCAAiC;AAwCzD,SAAS,uBACd,WAMA,WACkB;AAKlB,QAAM,YAAY,oBAAI,IAA2B;AAMjD,iBAAe,eACb,eACA,MACA,SACiB;AACjB,QAAI;AACF,UAAI,QAAQ,KAAK,SAAS,GAAG,KAAK,MAAM,QAAQ,QAAQ,IAAI,GAAG;AAC7D,cAAM,CAAC,aAAa,UAAU,IAAI,QAAQ,KAAK,MAAM,GAAG;AAExD,cAAM,SAAS,MAAM,UAAU;AAAA,UAC7B;AAAA,UACA;AAAA,UACA,QAAQ,QAAQ;AAAA,UAChB,QAAQ;AAAA,QACV,CAAC;AAED,eAAO,MAAM,cAAc,KAAK,MAAM,EAAE,MAAM,YAAY,MAAM,OAAO,CAAC;AAAA,MAC1E,WAAW,QAAQ,SAAS,WAAW;AACrC,cAAM,EAAE,KAAK,MAAM,KAAK,IAAI,QAAQ;AACpC,sBAAc,iBAAiB,KAAK,MAAM,IAAI;AAC9C,eAAO,MAAM,cAAc,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AAAA,MAC5D,WAAW,QAAQ,SAAS,cAAc;AACxC,cAAM,EAAE,IAAI,IAAI,QAAQ;AACxB,sBAAc,oBAAoB,GAAG;AACrC,eAAO,MAAM,cAAc,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AAAA,MAC5D,WAAW,QAAQ,SAAS,YAAY;AACtC,cAAM,EAAE,KAAK,IAAI,QAAQ;AACzB,cAAM,QAAQ,MAAM,KAAK,UAAU,OAAO,CAAC,EAAE,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
package/docs/authentication.md
CHANGED
|
@@ -41,7 +41,7 @@ Method-level `auth()` overrides service-level settings.
|
|
|
41
41
|
|
|
42
42
|
## getServiceAuthPermissions
|
|
43
43
|
|
|
44
|
-
|
|
44
|
+
Read auth permissions from an `auth()`-wrapped function. Returns `undefined` if the function is not wrapped with `auth()`. Primarily used internally by `runServiceMethod`, but exported for advanced use cases.
|
|
45
45
|
|
|
46
46
|
```typescript
|
|
47
47
|
import { defineService, auth, getServiceAuthPermissions } from "@simplysm/service-server";
|
|
@@ -55,43 +55,52 @@ const servicePerms = someServiceDef.authPermissions;
|
|
|
55
55
|
// string[] if service-level auth is set, or undefined for public
|
|
56
56
|
```
|
|
57
57
|
|
|
58
|
-
|
|
58
|
+
| Signature | Returns | Description |
|
|
59
|
+
|-----------|---------|------|
|
|
60
|
+
| `getServiceAuthPermissions(fn: Function)` | `string[] \| undefined` | Returns the permission array attached by `auth()`, or `undefined` if not wrapped |
|
|
59
61
|
|
|
60
|
-
|
|
62
|
+
## JWT Functions
|
|
61
63
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
| Method | Returns | Description |
|
|
65
|
-
|--------|---------|------|
|
|
66
|
-
| `sign(payload)` | `Promise<string>` | Generate a JWT token (HS256, 12-hour expiration) |
|
|
67
|
-
| `verify(token)` | `Promise<AuthTokenPayload<TAuthInfo>>` | Verify token signature and expiration, return payload |
|
|
68
|
-
| `decode(token)` | `AuthTokenPayload<TAuthInfo>` | Decode token without verification (synchronous) |
|
|
69
|
-
|
|
70
|
-
Generate and verify JWT tokens through the `ServiceServer` instance:
|
|
64
|
+
Standalone functions for JWT token generation and verification using the `jose` library (HS256 algorithm, 12-hour expiration).
|
|
71
65
|
|
|
72
66
|
```typescript
|
|
73
|
-
import {
|
|
74
|
-
|
|
75
|
-
const server = createServiceServer({
|
|
76
|
-
port: 8080,
|
|
77
|
-
rootPath: "/app/data",
|
|
78
|
-
auth: { jwtSecret: "my-secret-key" },
|
|
79
|
-
services: [],
|
|
80
|
-
});
|
|
67
|
+
import { signJwt, verifyJwt, decodeJwt } from "@simplysm/service-server";
|
|
81
68
|
|
|
82
69
|
// Generate token (12-hour expiration, HS256 algorithm)
|
|
83
|
-
const token = await
|
|
70
|
+
const token = await signJwt("my-secret-key", {
|
|
84
71
|
roles: ["admin", "user"],
|
|
85
72
|
data: { userId: 1, name: "John" },
|
|
86
73
|
});
|
|
87
74
|
|
|
88
|
-
// Verify token
|
|
89
|
-
const payload = await
|
|
75
|
+
// Verify token (throws on expiry or invalid signature)
|
|
76
|
+
const payload = await verifyJwt("my-secret-key", token);
|
|
90
77
|
// payload.roles: ["admin", "user"]
|
|
91
78
|
// payload.data: { userId: 1, name: "John" }
|
|
79
|
+
|
|
80
|
+
// Decode token without verification (synchronous, no secret needed)
|
|
81
|
+
const decoded = decodeJwt(token);
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
| Function | Returns | Description |
|
|
85
|
+
|----------|---------|------|
|
|
86
|
+
| `signJwt<TAuthInfo>(jwtSecret, payload)` | `Promise<string>` | Generate a JWT token (HS256, 12-hour expiration) |
|
|
87
|
+
| `verifyJwt<TAuthInfo>(jwtSecret, token)` | `Promise<AuthTokenPayload<TAuthInfo>>` | Verify token signature and expiration, return payload. Throws on invalid or expired tokens |
|
|
88
|
+
| `decodeJwt<TAuthInfo>(token)` | `AuthTokenPayload<TAuthInfo>` | Decode token without verification (synchronous) |
|
|
89
|
+
|
|
90
|
+
In most cases, use `ServiceServer` methods instead of calling these functions directly:
|
|
91
|
+
|
|
92
|
+
```typescript
|
|
93
|
+
// Generate token via server (preferred)
|
|
94
|
+
const token = await server.generateAuthToken({
|
|
95
|
+
roles: ["admin"],
|
|
96
|
+
data: { userId: 1 },
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
// Verify token via server (preferred)
|
|
100
|
+
const payload = await server.verifyAuthToken(token);
|
|
92
101
|
```
|
|
93
102
|
|
|
94
|
-
|
|
103
|
+
## AuthTokenPayload
|
|
95
104
|
|
|
96
105
|
```typescript
|
|
97
106
|
import type { AuthTokenPayload } from "@simplysm/service-server";
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
## OrmService
|
|
4
4
|
|
|
5
|
-
Provides database connection/query/transaction via WebSocket. `auth()` wrapper is applied, requiring login.
|
|
5
|
+
Provides database connection/query/transaction via WebSocket. The `auth()` wrapper is applied, requiring login.
|
|
6
6
|
|
|
7
7
|
```typescript
|
|
8
8
|
import { createServiceServer, OrmService } from "@simplysm/service-server";
|
|
@@ -48,39 +48,16 @@ Methods provided by `OrmService`:
|
|
|
48
48
|
|
|
49
49
|
When a WebSocket connection is closed, all DB connections opened from that socket are automatically cleaned up.
|
|
50
50
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
Provides SHA256 hash and AES-256-CBC symmetric key encryption/decryption.
|
|
51
|
+
Use `OrmServiceType` to share method signatures with the client:
|
|
54
52
|
|
|
55
53
|
```typescript
|
|
56
|
-
import {
|
|
57
|
-
|
|
58
|
-
const server = createServiceServer({
|
|
59
|
-
port: 8080,
|
|
60
|
-
rootPath: "/app/data",
|
|
61
|
-
services: [CryptoService],
|
|
62
|
-
});
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
`.config.json` config:
|
|
66
|
-
|
|
67
|
-
```json
|
|
68
|
-
{
|
|
69
|
-
"crypto": {
|
|
70
|
-
"key": "your-32-byte-secret-key-here!!"
|
|
71
|
-
}
|
|
72
|
-
}
|
|
54
|
+
import type { OrmServiceType } from "@simplysm/service-server";
|
|
55
|
+
// OrmServiceType = ServiceMethods<typeof OrmService>
|
|
73
56
|
```
|
|
74
57
|
|
|
75
|
-
| Method | Returns | Description |
|
|
76
|
-
|--------|---------|------|
|
|
77
|
-
| `encrypt(data)` | `Promise<string>` | Generate SHA256 HMAC hash (one-way). `data` is `string \| Uint8Array` |
|
|
78
|
-
| `encryptAes(data)` | `Promise<string>` | AES-256-CBC encryption. `data` is `Uint8Array`. Returns hex string in `iv:encrypted` format |
|
|
79
|
-
| `decryptAes(encText)` | `Promise<Uint8Array>` | AES-256-CBC decryption. Returns original binary |
|
|
80
|
-
|
|
81
58
|
## AutoUpdateService
|
|
82
59
|
|
|
83
|
-
Supports auto-update for client apps. Searches for latest version files by platform in the client directory.
|
|
60
|
+
Supports auto-update for client apps. Searches for the latest version files by platform in the client directory. No auth is required.
|
|
84
61
|
|
|
85
62
|
```typescript
|
|
86
63
|
import { createServiceServer, AutoUpdateService } from "@simplysm/service-server";
|
|
@@ -104,7 +81,7 @@ rootPath/www/{clientName}/{platform}/updates/
|
|
|
104
81
|
|
|
105
82
|
| Method | Returns | Description |
|
|
106
83
|
|--------|---------|------|
|
|
107
|
-
| `getLastVersion(platform)` | `Promise<{ version: string; downloadPath: string } \| undefined>` | Returns latest version and download path for the platform. Returns `undefined` if no update |
|
|
84
|
+
| `getLastVersion(platform)` | `Promise<{ version: string; downloadPath: string } \| undefined>` | Returns the latest version and download path for the platform. Returns `undefined` if no update files exist |
|
|
108
85
|
|
|
109
86
|
Return value example:
|
|
110
87
|
|
|
@@ -114,3 +91,10 @@ Return value example:
|
|
|
114
91
|
downloadPath: "/my-app/android/updates/1.0.1.apk",
|
|
115
92
|
}
|
|
116
93
|
```
|
|
94
|
+
|
|
95
|
+
Use `AutoUpdateServiceType` to share method signatures with the client:
|
|
96
|
+
|
|
97
|
+
```typescript
|
|
98
|
+
import type { AutoUpdateServiceType } from "@simplysm/service-server";
|
|
99
|
+
// AutoUpdateServiceType = ServiceMethods<typeof AutoUpdateService>
|
|
100
|
+
```
|
package/docs/server.md
CHANGED
|
@@ -133,6 +133,7 @@ The `ctx` parameter provides access to server resources within service methods.
|
|
|
133
133
|
| `ctx.server` | `ServiceServer<TAuthInfo>` | Server instance reference |
|
|
134
134
|
| `ctx.socket` | `ServiceSocket \| undefined` | WebSocket connection (`undefined` for HTTP calls) |
|
|
135
135
|
| `ctx.http` | `{ clientName: string; authTokenPayload?: AuthTokenPayload<TAuthInfo> } \| undefined` | HTTP request context |
|
|
136
|
+
| `ctx.legacy` | `{ clientName?: string } \| undefined` | V1 legacy context (auto-update only) |
|
|
136
137
|
| `ctx.authInfo` | `TAuthInfo \| undefined` | Authenticated user's custom data (from JWT `data` field) |
|
|
137
138
|
| `ctx.clientName` | `string \| undefined` | Client app name (validated against path traversal) |
|
|
138
139
|
| `ctx.clientPath` | `string \| undefined` | Resolved per-client directory path (`rootPath/www/{clientName}`) |
|
|
@@ -143,6 +144,16 @@ The `ctx` parameter provides access to server resources within service methods.
|
|
|
143
144
|
|--------|---------|------|
|
|
144
145
|
| `ctx.getConfig<T>(section)` | `Promise<T>` | Read a section from `.config.json` (root + client configs merged) |
|
|
145
146
|
|
|
147
|
+
### createServiceContext
|
|
148
|
+
|
|
149
|
+
Factory function that creates a `ServiceContext` object. Used internally by the server and exported for advanced use cases (e.g., calling services programmatically without an active connection).
|
|
150
|
+
|
|
151
|
+
```typescript
|
|
152
|
+
import { createServiceContext } from "@simplysm/service-server";
|
|
153
|
+
|
|
154
|
+
const ctx = createServiceContext(server, socket, httpContext, legacyContext);
|
|
155
|
+
```
|
|
156
|
+
|
|
146
157
|
## Config File Reference
|
|
147
158
|
|
|
148
159
|
Read sections from `.config.json` files using `ctx.getConfig()`. Root and per-client configs are automatically merged.
|
|
@@ -217,7 +228,7 @@ The following routes are automatically registered when `ServiceServer.listen()`
|
|
|
217
228
|
## Full Server Example
|
|
218
229
|
|
|
219
230
|
```typescript
|
|
220
|
-
import { createServiceServer, defineService, auth, OrmService
|
|
231
|
+
import { createServiceServer, defineService, auth, OrmService } from "@simplysm/service-server";
|
|
221
232
|
import { defineEvent } from "@simplysm/service-common";
|
|
222
233
|
|
|
223
234
|
// Define a custom service with auth
|
|
@@ -244,7 +255,7 @@ const server = createServiceServer({
|
|
|
244
255
|
port: 8080,
|
|
245
256
|
rootPath: "/app/data",
|
|
246
257
|
auth: { jwtSecret: "my-secret-key" },
|
|
247
|
-
services: [UserService, PublicService, OrmService
|
|
258
|
+
services: [UserService, PublicService, OrmService],
|
|
248
259
|
});
|
|
249
260
|
|
|
250
261
|
server.on("ready", () => {
|
package/docs/transport.md
CHANGED
|
@@ -1,8 +1,23 @@
|
|
|
1
1
|
# Transport Layer
|
|
2
2
|
|
|
3
|
+
## WebSocketHandler
|
|
4
|
+
|
|
5
|
+
`WebSocketHandler` is an interface that manages multiple WebSocket connections, routes messages to services, and handles event broadcasting. Create an instance with `createWebSocketHandler`.
|
|
6
|
+
|
|
7
|
+
**Methods:**
|
|
8
|
+
|
|
9
|
+
| Method | Returns | Description |
|
|
10
|
+
|--------|---------|------|
|
|
11
|
+
| `addSocket(socket, clientId, clientName, connReq)` | `void` | Add a new WebSocket connection. If a connection with the same `clientId` already exists, it is closed first |
|
|
12
|
+
| `closeAll()` | `void` | Close all active connections |
|
|
13
|
+
| `broadcastReload(clientName, changedFileSet)` | `Promise<void>` | Send a reload message to all connected clients |
|
|
14
|
+
| `emitToServer(eventDef, infoSelector, data)` | `Promise<void>` | Emit an event to clients whose registered event listeners match the `infoSelector` |
|
|
15
|
+
|
|
16
|
+
`WebSocketHandler` is created and managed internally by `ServiceServer`. Access its functionality through `ServiceServer` methods (`emitEvent`, `broadcastReload`).
|
|
17
|
+
|
|
3
18
|
## ServiceSocket
|
|
4
19
|
|
|
5
|
-
`ServiceSocket`
|
|
20
|
+
`ServiceSocket` is an interface wrapping a single WebSocket connection. It is available in service methods as `ctx.socket` when the request comes via WebSocket. Create an instance with `createServiceSocket`.
|
|
6
21
|
|
|
7
22
|
**Properties:**
|
|
8
23
|
|
|
@@ -22,6 +37,8 @@
|
|
|
22
37
|
| `addEventListener(key, eventName, info)` | `void` | Register an event listener for this socket |
|
|
23
38
|
| `removeEventListener(key)` | `void` | Remove an event listener by key |
|
|
24
39
|
| `getEventListeners(eventName)` | `{ key, info }[]` | Get all event listeners for a given event name |
|
|
40
|
+
| `filterEventTargetKeys(targetKeys)` | `string[]` | Filter the given keys to only those registered on this socket |
|
|
41
|
+
| `on(event, handler)` | `void` | Register an event handler (`error`, `close`, or `message`) |
|
|
25
42
|
|
|
26
43
|
**Events:**
|
|
27
44
|
|
|
@@ -57,6 +74,16 @@ Body: ["World"]
|
|
|
57
74
|
- Parameters are passed in array form (in the order of method arguments).
|
|
58
75
|
- For GET requests, pass a JSON-serialized array in the `json` query parameter.
|
|
59
76
|
|
|
77
|
+
### handleHttpRequest
|
|
78
|
+
|
|
79
|
+
The internal handler function registered at `/api/:service/:method`. Exported for advanced use cases.
|
|
80
|
+
|
|
81
|
+
```typescript
|
|
82
|
+
import { handleHttpRequest } from "@simplysm/service-server";
|
|
83
|
+
|
|
84
|
+
await handleHttpRequest(req, reply, jwtSecret, runMethod);
|
|
85
|
+
```
|
|
86
|
+
|
|
60
87
|
## File Upload
|
|
61
88
|
|
|
62
89
|
Upload files via multipart request to the `/upload` endpoint. Auth token is required.
|
|
@@ -81,6 +108,31 @@ const results = await response.json();
|
|
|
81
108
|
|
|
82
109
|
Uploaded files are stored in the `rootPath/www/uploads/` directory with UUID-based filenames.
|
|
83
110
|
|
|
111
|
+
### handleUpload
|
|
112
|
+
|
|
113
|
+
The internal handler function registered at `/upload`. Exported for advanced use cases.
|
|
114
|
+
|
|
115
|
+
```typescript
|
|
116
|
+
import { handleUpload } from "@simplysm/service-server";
|
|
117
|
+
|
|
118
|
+
await handleUpload(req, reply, rootPath, jwtSecret);
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### handleStaticFile
|
|
122
|
+
|
|
123
|
+
The internal handler function for static file serving. Exported for advanced use cases.
|
|
124
|
+
|
|
125
|
+
```typescript
|
|
126
|
+
import { handleStaticFile } from "@simplysm/service-server";
|
|
127
|
+
|
|
128
|
+
await handleStaticFile(req, reply, rootPath, urlPath);
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Security behavior:
|
|
132
|
+
- Blocks path traversal (`..`, outside `rootPath/www/`)
|
|
133
|
+
- Returns 403 for files starting with `.` (hidden files)
|
|
134
|
+
- Redirects directory paths without trailing slash to path with trailing slash
|
|
135
|
+
|
|
84
136
|
## Real-time Event Publishing
|
|
85
137
|
|
|
86
138
|
Publish events to connected clients from the server using `defineEvent` from `@simplysm/service-common`.
|
|
@@ -108,7 +160,7 @@ await server.broadcastReload("my-app", new Set(["main.js"]));
|
|
|
108
160
|
|
|
109
161
|
## ProtocolWrapper
|
|
110
162
|
|
|
111
|
-
|
|
163
|
+
`ProtocolWrapper` is an interface for encoding/decoding WebSocket messages. Create an instance with `createProtocolWrapper`. Automatically branches between main thread and worker thread based on message size.
|
|
112
164
|
|
|
113
165
|
```typescript
|
|
114
166
|
import { createProtocolWrapper } from "@simplysm/service-server";
|
|
@@ -138,7 +190,7 @@ Worker thread branching:
|
|
|
138
190
|
| 30KB or less | Processed directly in main thread |
|
|
139
191
|
| Over 30KB | Processed in worker thread (max 4GB memory allocation) |
|
|
140
192
|
|
|
141
|
-
Messages containing large binary data (Uint8Array) also branch to worker thread.
|
|
193
|
+
Messages containing large binary data (Uint8Array) also branch to worker thread regardless of size.
|
|
142
194
|
|
|
143
195
|
## Legacy: handleV1Connection
|
|
144
196
|
|
|
@@ -148,5 +200,11 @@ Handles V1 protocol WebSocket clients. Only supports the `SdAutoUpdateService.ge
|
|
|
148
200
|
import { handleV1Connection, AutoUpdateService } from "@simplysm/service-server";
|
|
149
201
|
|
|
150
202
|
// Used internally by ServiceServer for WebSocket connections without ver=2 query parameter
|
|
151
|
-
handleV1Connection(webSocket,
|
|
203
|
+
handleV1Connection(webSocket, autoUpdateMethods, clientNameSetter);
|
|
152
204
|
```
|
|
205
|
+
|
|
206
|
+
| Parameter | Type | Description |
|
|
207
|
+
|-----------|------|------|
|
|
208
|
+
| `socket` | `WebSocket` | The raw WebSocket connection |
|
|
209
|
+
| `autoUpdateMethods` | `{ getLastVersion: (platform: string) => Promise<any> }` | Auto-update service methods |
|
|
210
|
+
| `clientNameSetter` | `((clientName: string \| undefined) => void) \| undefined` | Optional callback to set the client name from the V1 request |
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@simplysm/service-server",
|
|
3
|
-
"version": "13.0.
|
|
3
|
+
"version": "13.0.30",
|
|
4
4
|
"description": "심플리즘 패키지 - 서비스 모듈 (server)",
|
|
5
5
|
"author": "김석래",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -34,11 +34,11 @@
|
|
|
34
34
|
"semver": "^7.7.4",
|
|
35
35
|
"utf-8-validate": "^6.0.6",
|
|
36
36
|
"ws": "^8.19.0",
|
|
37
|
-
"@simplysm/core-common": "13.0.
|
|
38
|
-
"@simplysm/core-node": "13.0.
|
|
39
|
-
"@simplysm/orm-common": "13.0.
|
|
40
|
-
"@simplysm/orm-node": "13.0.
|
|
41
|
-
"@simplysm/service-common": "13.0.
|
|
37
|
+
"@simplysm/core-common": "13.0.30",
|
|
38
|
+
"@simplysm/core-node": "13.0.30",
|
|
39
|
+
"@simplysm/orm-common": "13.0.30",
|
|
40
|
+
"@simplysm/orm-node": "13.0.30",
|
|
41
|
+
"@simplysm/service-common": "13.0.30"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"@types/semver": "^7.7.1",
|
|
@@ -39,7 +39,9 @@ export function createServiceContext<TAuthInfo = unknown>(
|
|
|
39
39
|
legacy,
|
|
40
40
|
|
|
41
41
|
get authInfo(): TAuthInfo | undefined {
|
|
42
|
-
return (socket?.authTokenPayload?.data ?? http?.authTokenPayload?.data) as
|
|
42
|
+
return (socket?.authTokenPayload?.data ?? http?.authTokenPayload?.data) as
|
|
43
|
+
| TAuthInfo
|
|
44
|
+
| undefined;
|
|
43
45
|
},
|
|
44
46
|
|
|
45
47
|
get clientName(): string | undefined {
|
|
@@ -101,7 +103,10 @@ export function getServiceAuthPermissions(fn: Function): string[] | undefined {
|
|
|
101
103
|
* - Method-level with roles: `auth(["admin"], () => result)`
|
|
102
104
|
*/
|
|
103
105
|
export function auth<TFunction extends (...args: any[]) => any>(fn: TFunction): TFunction;
|
|
104
|
-
export function auth<TFunction extends (...args: any[]) => any>(
|
|
106
|
+
export function auth<TFunction extends (...args: any[]) => any>(
|
|
107
|
+
permissions: string[],
|
|
108
|
+
fn: TFunction,
|
|
109
|
+
): TFunction;
|
|
105
110
|
export function auth(permissionsOrFn: string[] | Function, maybeFn?: Function): Function {
|
|
106
111
|
const permissions = Array.isArray(permissionsOrFn) ? permissionsOrFn : [];
|
|
107
112
|
const fn = Array.isArray(permissionsOrFn) ? maybeFn! : permissionsOrFn;
|
|
@@ -156,4 +161,5 @@ export function defineService<TMethods extends Record<string, (...args: any[]) =
|
|
|
156
161
|
* export type UserServiceType = ServiceMethods<typeof UserService>;
|
|
157
162
|
* // Client: client.getService<UserServiceType>("User");
|
|
158
163
|
*/
|
|
159
|
-
export type ServiceMethods<TDefinition> =
|
|
164
|
+
export type ServiceMethods<TDefinition> =
|
|
165
|
+
TDefinition extends ServiceDefinition<infer M> ? M : never;
|
|
@@ -86,7 +86,10 @@ export function createProtocolWrapper(): ProtocolWrapper {
|
|
|
86
86
|
// -------------------------------------------------------------------
|
|
87
87
|
|
|
88
88
|
return {
|
|
89
|
-
async encode(
|
|
89
|
+
async encode(
|
|
90
|
+
uuid: string,
|
|
91
|
+
message: ServiceMessage,
|
|
92
|
+
): Promise<{ chunks: Bytes[]; totalSize: number }> {
|
|
90
93
|
if (shouldUseWorkerForEncode(message)) {
|
|
91
94
|
return getWorker().encode(uuid, message);
|
|
92
95
|
} else {
|
package/src/service-server.ts
CHANGED
|
@@ -45,7 +45,10 @@ export class ServiceServer<TAuthInfo = unknown> extends EventEmitter<{
|
|
|
45
45
|
|
|
46
46
|
this.fastify = fastify({ https: httpsConf });
|
|
47
47
|
|
|
48
|
-
this._wsHandler = createWebSocketHandler(
|
|
48
|
+
this._wsHandler = createWebSocketHandler(
|
|
49
|
+
(def) => runServiceMethod(this, def),
|
|
50
|
+
options.auth?.jwtSecret,
|
|
51
|
+
);
|
|
49
52
|
}
|
|
50
53
|
|
|
51
54
|
async listen(): Promise<void> {
|
|
@@ -95,23 +98,29 @@ export class ServiceServer<TAuthInfo = unknown> extends EventEmitter<{
|
|
|
95
98
|
});
|
|
96
99
|
|
|
97
100
|
// JSON 파서
|
|
98
|
-
this.fastify.addContentTypeParser(
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
101
|
+
this.fastify.addContentTypeParser(
|
|
102
|
+
"application/json",
|
|
103
|
+
{ parseAs: "string" },
|
|
104
|
+
(req, body, done) => {
|
|
105
|
+
try {
|
|
106
|
+
const json = jsonParse(body as string);
|
|
107
|
+
done(null, json);
|
|
108
|
+
} catch (err: unknown) {
|
|
109
|
+
const error = err as Error & { statusCode?: number };
|
|
110
|
+
error.statusCode = 400;
|
|
111
|
+
done(error, undefined);
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
);
|
|
108
115
|
|
|
109
116
|
// JSON 생성기
|
|
110
117
|
this.fastify.setSerializerCompiler(() => (data) => jsonStringify(data));
|
|
111
118
|
|
|
112
119
|
// API 라우트
|
|
113
120
|
this.fastify.all("/api/:service/:method", async (req, reply) => {
|
|
114
|
-
await handleHttpRequest(req, reply, this.options.auth?.jwtSecret, (def) =>
|
|
121
|
+
await handleHttpRequest(req, reply, this.options.auth?.jwtSecret, (def) =>
|
|
122
|
+
runServiceMethod(this, def),
|
|
123
|
+
);
|
|
115
124
|
});
|
|
116
125
|
|
|
117
126
|
// 업로드 라우트
|
|
@@ -245,6 +254,8 @@ export class ServiceServer<TAuthInfo = unknown> extends EventEmitter<{
|
|
|
245
254
|
}
|
|
246
255
|
}
|
|
247
256
|
|
|
248
|
-
export function createServiceServer<TAuthInfo = unknown>(
|
|
257
|
+
export function createServiceServer<TAuthInfo = unknown>(
|
|
258
|
+
options: ServiceServerOptions,
|
|
259
|
+
): ServiceServer<TAuthInfo> {
|
|
249
260
|
return new ServiceServer<TAuthInfo>(options);
|
|
250
261
|
}
|
|
@@ -41,7 +41,8 @@ export const AutoUpdateService = defineService("AutoUpdate", (ctx) => ({
|
|
|
41
41
|
const versionItem = versions.find((item) => item.version === version);
|
|
42
42
|
if (versionItem == null) return undefined;
|
|
43
43
|
|
|
44
|
-
const downloadPath =
|
|
44
|
+
const downloadPath =
|
|
45
|
+
"/" + path.join(ctx.clientName ?? "", platform, "updates", versionItem.fileName);
|
|
45
46
|
|
|
46
47
|
return {
|
|
47
48
|
version: version.toString(),
|
|
@@ -30,7 +30,9 @@ export const OrmService = defineService(
|
|
|
30
30
|
};
|
|
31
31
|
|
|
32
32
|
const getConf = async (opt: DbConnOptions & { configName: string }): Promise<DbConnConfig> => {
|
|
33
|
-
const config = (await ctx.getConfig<Record<string, DbConnConfig | undefined>>("orm"))[
|
|
33
|
+
const config = (await ctx.getConfig<Record<string, DbConnConfig | undefined>>("orm"))[
|
|
34
|
+
opt.configName
|
|
35
|
+
];
|
|
34
36
|
if (config == null) {
|
|
35
37
|
throw new Error(`ORM 설정을 찾을 수 없습니다: ${opt.configName}`);
|
|
36
38
|
}
|
|
@@ -127,14 +129,23 @@ export const OrmService = defineService(
|
|
|
127
129
|
await conn.rollbackTransaction();
|
|
128
130
|
},
|
|
129
131
|
|
|
130
|
-
async executeParametrized(
|
|
132
|
+
async executeParametrized(
|
|
133
|
+
connId: number,
|
|
134
|
+
query: string,
|
|
135
|
+
params?: unknown[],
|
|
136
|
+
): Promise<unknown[][]> {
|
|
131
137
|
const conn = getConn(connId);
|
|
132
138
|
return conn.executeParametrized(query, params);
|
|
133
139
|
},
|
|
134
140
|
|
|
135
|
-
async executeDefs(
|
|
141
|
+
async executeDefs(
|
|
142
|
+
connId: number,
|
|
143
|
+
defs: QueryDef[],
|
|
144
|
+
options?: (ResultMeta | undefined)[],
|
|
145
|
+
): Promise<unknown[][]> {
|
|
136
146
|
const conn = getConn(connId);
|
|
137
|
-
const dialect: Dialect =
|
|
147
|
+
const dialect: Dialect =
|
|
148
|
+
conn.config.dialect === "mssql-azure" ? "mssql" : conn.config.dialect;
|
|
138
149
|
const queryBuilder = createQueryBuilder(dialect);
|
|
139
150
|
|
|
140
151
|
if (options != null && options.every((item) => item == null)) {
|
|
@@ -148,7 +159,10 @@ export const OrmService = defineService(
|
|
|
148
159
|
for (let i = 0; i < result.length; i++) {
|
|
149
160
|
const opt = options?.[i];
|
|
150
161
|
if (opt != null) {
|
|
151
|
-
const parsedResult = await parseQueryResult(
|
|
162
|
+
const parsedResult = await parseQueryResult(
|
|
163
|
+
result[i] as Record<string, unknown>[],
|
|
164
|
+
opt,
|
|
165
|
+
);
|
|
152
166
|
parsed.push(parsedResult ?? []);
|
|
153
167
|
} else {
|
|
154
168
|
parsed.push(result[i]);
|
|
@@ -6,7 +6,11 @@ import consola from "consola";
|
|
|
6
6
|
import { WebSocket } from "ws";
|
|
7
7
|
import type { AuthTokenPayload } from "../../auth/auth-token-payload";
|
|
8
8
|
import { createProtocolWrapper } from "../../protocol/protocol-wrapper";
|
|
9
|
-
import type {
|
|
9
|
+
import type {
|
|
10
|
+
ServiceClientMessage,
|
|
11
|
+
ServiceServerMessage,
|
|
12
|
+
ServiceServerRawMessage,
|
|
13
|
+
} from "@simplysm/service-common";
|
|
10
14
|
|
|
11
15
|
const logger = consola.withTag("service-server:ServiceSocket");
|
|
12
16
|
|
|
@@ -92,7 +92,9 @@ export function createWebSocketHandler(
|
|
|
92
92
|
return await serviceSocket.send(uuid, { name: "response" });
|
|
93
93
|
} else if (message.name === "evt:gets") {
|
|
94
94
|
const { name } = message.body as { name: string };
|
|
95
|
-
const infos = Array.from(socketMap.values()).flatMap((subSock) =>
|
|
95
|
+
const infos = Array.from(socketMap.values()).flatMap((subSock) =>
|
|
96
|
+
subSock.getEventListeners(name),
|
|
97
|
+
);
|
|
96
98
|
return await serviceSocket.send(uuid, { name: "response", body: infos });
|
|
97
99
|
} else if (message.name === "evt:emit") {
|
|
98
100
|
const { keys, data } = message.body as { keys: string[]; data: unknown };
|
|
@@ -132,7 +134,9 @@ export function createWebSocketHandler(
|
|
|
132
134
|
}
|
|
133
135
|
} catch (err) {
|
|
134
136
|
const error =
|
|
135
|
-
err instanceof Error
|
|
137
|
+
err instanceof Error
|
|
138
|
+
? err
|
|
139
|
+
: new Error(typeof err === "string" ? err : "알 수 없는 오류가 발생하였습니다.");
|
|
136
140
|
|
|
137
141
|
return serviceSocket.send(uuid, {
|
|
138
142
|
name: "error",
|
|
@@ -151,7 +155,12 @@ export function createWebSocketHandler(
|
|
|
151
155
|
// -------------------------------------------------------------------
|
|
152
156
|
|
|
153
157
|
return {
|
|
154
|
-
addSocket(
|
|
158
|
+
addSocket(
|
|
159
|
+
socket: WebSocket,
|
|
160
|
+
clientId: string,
|
|
161
|
+
clientName: string,
|
|
162
|
+
connReq: FastifyRequest,
|
|
163
|
+
): void {
|
|
155
164
|
try {
|
|
156
165
|
const serviceSocket = createServiceSocket(socket, clientId, clientName, connReq);
|
|
157
166
|
|
|
@@ -197,7 +206,10 @@ export function createWebSocketHandler(
|
|
|
197
206
|
}
|
|
198
207
|
},
|
|
199
208
|
|
|
200
|
-
async broadcastReload(
|
|
209
|
+
async broadcastReload(
|
|
210
|
+
clientName: string | undefined,
|
|
211
|
+
changedFileSet: Set<string>,
|
|
212
|
+
): Promise<void> {
|
|
201
213
|
for (const serviceSocket of socketMap.values()) {
|
|
202
214
|
await serviceSocket.send(Uuid.new().toString(), {
|
|
203
215
|
name: "reload",
|