@simplysm/service-server 13.0.0-beta.6 → 13.0.1
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 +117 -433
- package/dist/auth/auth-token-payload.d.ts.map +1 -0
- package/dist/auth/auth-token-payload.js.map +0 -1
- package/dist/auth/jwt-manager.d.ts +5 -0
- package/dist/auth/jwt-manager.d.ts.map +1 -0
- package/dist/auth/jwt-manager.js +19 -28
- package/dist/auth/jwt-manager.js.map +1 -2
- package/dist/core/define-service.d.ts +67 -0
- package/dist/core/define-service.d.ts.map +1 -0
- package/dist/core/define-service.js +70 -0
- package/dist/core/define-service.js.map +6 -0
- package/dist/core/service-executor.d.ts +14 -0
- package/dist/core/service-executor.d.ts.map +1 -0
- package/dist/core/service-executor.js +29 -35
- package/dist/core/service-executor.js.map +1 -2
- package/dist/{service-server/src/index.d.ts → index.d.ts} +4 -5
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -19
- package/dist/index.js.map +1 -2
- package/dist/{service-server/src/legacy → legacy}/v1-auto-update-handler.d.ts +3 -2
- package/dist/legacy/v1-auto-update-handler.d.ts.map +1 -0
- package/dist/legacy/v1-auto-update-handler.js +5 -5
- package/dist/legacy/v1-auto-update-handler.js.map +1 -2
- package/dist/protocol/protocol-wrapper.d.ts +33 -0
- package/dist/protocol/protocol-wrapper.d.ts.map +1 -0
- package/dist/protocol/protocol-wrapper.js +37 -48
- package/dist/protocol/protocol-wrapper.js.map +1 -2
- package/dist/{service-server/src/service-server.d.ts → service-server.d.ts} +3 -8
- package/dist/service-server.d.ts.map +1 -0
- package/dist/service-server.js +40 -29
- package/dist/service-server.js.map +1 -2
- package/dist/services/auto-update-service.d.ts +9 -0
- package/dist/services/auto-update-service.d.ts.map +1 -0
- package/dist/services/auto-update-service.js +5 -5
- package/dist/services/auto-update-service.js.map +1 -2
- package/dist/services/crypto-service.d.ts +9 -0
- package/dist/services/crypto-service.d.ts.map +1 -0
- package/dist/services/crypto-service.js +8 -11
- package/dist/services/crypto-service.js.map +1 -2
- package/dist/{service-server/src/services → services}/orm-service.d.ts +5 -9
- package/dist/services/orm-service.d.ts.map +1 -0
- package/dist/services/orm-service.js +125 -174
- package/dist/services/orm-service.js.map +1 -2
- package/dist/services/smtp-service.d.ts +8 -0
- package/dist/services/smtp-service.d.ts.map +1 -0
- package/dist/services/smtp-service.js +22 -19
- package/dist/services/smtp-service.js.map +1 -2
- package/dist/transport/http/http-request-handler.d.ts +12 -0
- package/dist/transport/http/http-request-handler.d.ts.map +1 -0
- package/dist/transport/http/http-request-handler.js +42 -47
- package/dist/transport/http/http-request-handler.js.map +1 -2
- package/dist/transport/http/static-file-handler.d.ts +3 -0
- package/dist/transport/http/static-file-handler.d.ts.map +1 -0
- package/dist/transport/http/static-file-handler.js +34 -39
- package/dist/transport/http/static-file-handler.js.map +1 -2
- package/dist/transport/http/upload-handler.d.ts +3 -0
- package/dist/transport/http/upload-handler.d.ts.map +1 -0
- package/dist/transport/http/upload-handler.js +52 -54
- package/dist/transport/http/upload-handler.js.map +1 -2
- package/dist/transport/socket/service-socket.d.ts +61 -0
- package/dist/transport/socket/service-socket.d.ts.map +1 -0
- package/dist/transport/socket/service-socket.js +86 -71
- package/dist/transport/socket/service-socket.js.map +1 -2
- package/dist/transport/socket/websocket-handler.d.ts +41 -0
- package/dist/transport/socket/websocket-handler.d.ts.map +1 -0
- package/dist/transport/socket/websocket-handler.js +77 -77
- package/dist/transport/socket/websocket-handler.js.map +1 -2
- package/dist/{service-server/src/types → types}/server-options.d.ts +2 -3
- package/dist/types/server-options.d.ts.map +1 -0
- package/dist/types/server-options.js.map +0 -1
- package/dist/utils/config-manager.d.ts +2 -0
- package/dist/utils/config-manager.d.ts.map +1 -0
- package/dist/utils/config-manager.js +49 -52
- package/dist/utils/config-manager.js.map +1 -2
- package/dist/workers/service-protocol.worker.d.ts.map +1 -0
- package/dist/workers/service-protocol.worker.js +2 -2
- package/dist/workers/service-protocol.worker.js.map +1 -2
- package/docs/authentication.md +105 -0
- package/docs/built-in-services.md +172 -0
- package/docs/server.md +288 -0
- package/docs/transport.md +152 -0
- package/package.json +18 -13
- package/src/auth/jwt-manager.ts +28 -36
- package/src/core/define-service.ts +159 -0
- package/src/core/service-executor.ts +46 -49
- package/src/index.ts +4 -5
- package/src/legacy/v1-auto-update-handler.ts +9 -6
- package/src/protocol/protocol-wrapper.ts +79 -44
- package/src/service-server.ts +49 -34
- package/src/services/auto-update-service.ts +8 -7
- package/src/services/crypto-service.ts +11 -13
- package/src/services/orm-service.ts +163 -157
- package/src/services/smtp-service.ts +27 -26
- package/src/transport/http/http-request-handler.ts +58 -55
- package/src/transport/http/static-file-handler.ts +43 -43
- package/src/transport/http/upload-handler.ts +62 -62
- package/src/transport/socket/service-socket.ts +187 -89
- package/src/transport/socket/websocket-handler.ts +159 -103
- package/src/types/server-options.ts +2 -3
- package/src/utils/config-manager.ts +51 -53
- package/src/workers/service-protocol.worker.ts +2 -2
- package/.cache/typecheck-node.tsbuildinfo +0 -1
- package/dist/auth/auth.decorators.js +0 -46
- package/dist/auth/auth.decorators.js.map +0 -7
- package/dist/core/service-base.js +0 -47
- package/dist/core/service-base.js.map +0 -7
- package/dist/core-common/src/common.types.d.ts +0 -74
- package/dist/core-common/src/common.types.d.ts.map +0 -1
- package/dist/core-common/src/env.d.ts +0 -6
- package/dist/core-common/src/env.d.ts.map +0 -1
- package/dist/core-common/src/errors/argument-error.d.ts +0 -25
- package/dist/core-common/src/errors/argument-error.d.ts.map +0 -1
- package/dist/core-common/src/errors/not-implemented-error.d.ts +0 -29
- package/dist/core-common/src/errors/not-implemented-error.d.ts.map +0 -1
- package/dist/core-common/src/errors/sd-error.d.ts +0 -27
- package/dist/core-common/src/errors/sd-error.d.ts.map +0 -1
- package/dist/core-common/src/errors/timeout-error.d.ts +0 -31
- package/dist/core-common/src/errors/timeout-error.d.ts.map +0 -1
- package/dist/core-common/src/extensions/arr-ext.d.ts +0 -15
- package/dist/core-common/src/extensions/arr-ext.d.ts.map +0 -1
- package/dist/core-common/src/extensions/arr-ext.helpers.d.ts +0 -19
- package/dist/core-common/src/extensions/arr-ext.helpers.d.ts.map +0 -1
- package/dist/core-common/src/extensions/arr-ext.types.d.ts +0 -215
- package/dist/core-common/src/extensions/arr-ext.types.d.ts.map +0 -1
- package/dist/core-common/src/extensions/map-ext.d.ts +0 -57
- package/dist/core-common/src/extensions/map-ext.d.ts.map +0 -1
- package/dist/core-common/src/extensions/set-ext.d.ts +0 -36
- package/dist/core-common/src/extensions/set-ext.d.ts.map +0 -1
- package/dist/core-common/src/features/debounce-queue.d.ts +0 -53
- package/dist/core-common/src/features/debounce-queue.d.ts.map +0 -1
- package/dist/core-common/src/features/event-emitter.d.ts +0 -66
- package/dist/core-common/src/features/event-emitter.d.ts.map +0 -1
- package/dist/core-common/src/features/serial-queue.d.ts +0 -47
- package/dist/core-common/src/features/serial-queue.d.ts.map +0 -1
- package/dist/core-common/src/index.d.ts +0 -32
- package/dist/core-common/src/index.d.ts.map +0 -1
- package/dist/core-common/src/types/date-only.d.ts +0 -152
- package/dist/core-common/src/types/date-only.d.ts.map +0 -1
- package/dist/core-common/src/types/date-time.d.ts +0 -96
- package/dist/core-common/src/types/date-time.d.ts.map +0 -1
- package/dist/core-common/src/types/lazy-gc-map.d.ts +0 -80
- package/dist/core-common/src/types/lazy-gc-map.d.ts.map +0 -1
- package/dist/core-common/src/types/time.d.ts +0 -68
- package/dist/core-common/src/types/time.d.ts.map +0 -1
- package/dist/core-common/src/types/uuid.d.ts +0 -35
- package/dist/core-common/src/types/uuid.d.ts.map +0 -1
- package/dist/core-common/src/utils/bytes.d.ts +0 -51
- package/dist/core-common/src/utils/bytes.d.ts.map +0 -1
- package/dist/core-common/src/utils/date-format.d.ts +0 -90
- package/dist/core-common/src/utils/date-format.d.ts.map +0 -1
- package/dist/core-common/src/utils/json.d.ts +0 -34
- package/dist/core-common/src/utils/json.d.ts.map +0 -1
- package/dist/core-common/src/utils/num.d.ts +0 -60
- package/dist/core-common/src/utils/num.d.ts.map +0 -1
- package/dist/core-common/src/utils/obj.d.ts +0 -258
- package/dist/core-common/src/utils/obj.d.ts.map +0 -1
- package/dist/core-common/src/utils/path.d.ts +0 -23
- package/dist/core-common/src/utils/path.d.ts.map +0 -1
- package/dist/core-common/src/utils/primitive.d.ts +0 -18
- package/dist/core-common/src/utils/primitive.d.ts.map +0 -1
- package/dist/core-common/src/utils/str.d.ts +0 -103
- package/dist/core-common/src/utils/str.d.ts.map +0 -1
- package/dist/core-common/src/utils/template-strings.d.ts +0 -84
- package/dist/core-common/src/utils/template-strings.d.ts.map +0 -1
- package/dist/core-common/src/utils/transferable.d.ts +0 -47
- package/dist/core-common/src/utils/transferable.d.ts.map +0 -1
- package/dist/core-common/src/utils/wait.d.ts +0 -19
- package/dist/core-common/src/utils/wait.d.ts.map +0 -1
- package/dist/core-common/src/utils/xml.d.ts +0 -36
- package/dist/core-common/src/utils/xml.d.ts.map +0 -1
- package/dist/core-common/src/zip/sd-zip.d.ts +0 -80
- package/dist/core-common/src/zip/sd-zip.d.ts.map +0 -1
- package/dist/core-node/src/features/fs-watcher.d.ts +0 -70
- package/dist/core-node/src/features/fs-watcher.d.ts.map +0 -1
- package/dist/core-node/src/index.d.ts +0 -7
- package/dist/core-node/src/index.d.ts.map +0 -1
- package/dist/core-node/src/utils/fs.d.ts +0 -197
- package/dist/core-node/src/utils/fs.d.ts.map +0 -1
- package/dist/core-node/src/utils/path.d.ts +0 -75
- package/dist/core-node/src/utils/path.d.ts.map +0 -1
- package/dist/core-node/src/worker/create-worker.d.ts +0 -23
- package/dist/core-node/src/worker/create-worker.d.ts.map +0 -1
- package/dist/core-node/src/worker/types.d.ts +0 -67
- package/dist/core-node/src/worker/types.d.ts.map +0 -1
- package/dist/core-node/src/worker/worker.d.ts +0 -27
- package/dist/core-node/src/worker/worker.d.ts.map +0 -1
- package/dist/orm-common/src/db-context.d.ts +0 -669
- package/dist/orm-common/src/db-context.d.ts.map +0 -1
- package/dist/orm-common/src/errors/db-transaction-error.d.ts +0 -51
- package/dist/orm-common/src/errors/db-transaction-error.d.ts.map +0 -1
- package/dist/orm-common/src/exec/executable.d.ts +0 -79
- package/dist/orm-common/src/exec/executable.d.ts.map +0 -1
- package/dist/orm-common/src/exec/queryable.d.ts +0 -708
- package/dist/orm-common/src/exec/queryable.d.ts.map +0 -1
- package/dist/orm-common/src/exec/search-parser.d.ts +0 -72
- package/dist/orm-common/src/exec/search-parser.d.ts.map +0 -1
- package/dist/orm-common/src/expr/expr-unit.d.ts +0 -25
- package/dist/orm-common/src/expr/expr-unit.d.ts.map +0 -1
- package/dist/orm-common/src/expr/expr.d.ts +0 -1369
- package/dist/orm-common/src/expr/expr.d.ts.map +0 -1
- package/dist/orm-common/src/index.d.ts +0 -32
- package/dist/orm-common/src/index.d.ts.map +0 -1
- package/dist/orm-common/src/models/system-migration.d.ts +0 -10
- package/dist/orm-common/src/models/system-migration.d.ts.map +0 -1
- package/dist/orm-common/src/query-builder/base/expr-renderer-base.d.ts +0 -95
- package/dist/orm-common/src/query-builder/base/expr-renderer-base.d.ts.map +0 -1
- package/dist/orm-common/src/query-builder/base/query-builder-base.d.ts +0 -66
- package/dist/orm-common/src/query-builder/base/query-builder-base.d.ts.map +0 -1
- package/dist/orm-common/src/query-builder/mssql/mssql-expr-renderer.d.ts +0 -84
- package/dist/orm-common/src/query-builder/mssql/mssql-expr-renderer.d.ts.map +0 -1
- package/dist/orm-common/src/query-builder/mssql/mssql-query-builder.d.ts +0 -45
- package/dist/orm-common/src/query-builder/mssql/mssql-query-builder.d.ts.map +0 -1
- package/dist/orm-common/src/query-builder/mysql/mysql-expr-renderer.d.ts +0 -84
- package/dist/orm-common/src/query-builder/mysql/mysql-expr-renderer.d.ts.map +0 -1
- package/dist/orm-common/src/query-builder/mysql/mysql-query-builder.d.ts +0 -54
- package/dist/orm-common/src/query-builder/mysql/mysql-query-builder.d.ts.map +0 -1
- package/dist/orm-common/src/query-builder/postgresql/postgresql-expr-renderer.d.ts +0 -84
- package/dist/orm-common/src/query-builder/postgresql/postgresql-expr-renderer.d.ts.map +0 -1
- package/dist/orm-common/src/query-builder/postgresql/postgresql-query-builder.d.ts +0 -52
- package/dist/orm-common/src/query-builder/postgresql/postgresql-query-builder.d.ts.map +0 -1
- package/dist/orm-common/src/query-builder/query-builder.d.ts +0 -7
- package/dist/orm-common/src/query-builder/query-builder.d.ts.map +0 -1
- package/dist/orm-common/src/schema/factory/column-builder.d.ts +0 -394
- package/dist/orm-common/src/schema/factory/column-builder.d.ts.map +0 -1
- package/dist/orm-common/src/schema/factory/index-builder.d.ts +0 -151
- package/dist/orm-common/src/schema/factory/index-builder.d.ts.map +0 -1
- package/dist/orm-common/src/schema/factory/relation-builder.d.ts +0 -337
- package/dist/orm-common/src/schema/factory/relation-builder.d.ts.map +0 -1
- package/dist/orm-common/src/schema/procedure-builder.d.ts +0 -202
- package/dist/orm-common/src/schema/procedure-builder.d.ts.map +0 -1
- package/dist/orm-common/src/schema/table-builder.d.ts +0 -259
- package/dist/orm-common/src/schema/table-builder.d.ts.map +0 -1
- package/dist/orm-common/src/schema/view-builder.d.ts +0 -183
- package/dist/orm-common/src/schema/view-builder.d.ts.map +0 -1
- package/dist/orm-common/src/types/column.d.ts +0 -172
- package/dist/orm-common/src/types/column.d.ts.map +0 -1
- package/dist/orm-common/src/types/db.d.ts +0 -175
- package/dist/orm-common/src/types/db.d.ts.map +0 -1
- package/dist/orm-common/src/types/expr.d.ts +0 -474
- package/dist/orm-common/src/types/expr.d.ts.map +0 -1
- package/dist/orm-common/src/types/query-def.d.ts +0 -351
- package/dist/orm-common/src/types/query-def.d.ts.map +0 -1
- package/dist/orm-common/src/utils/result-parser.d.ts +0 -38
- package/dist/orm-common/src/utils/result-parser.d.ts.map +0 -1
- package/dist/orm-node/src/connections/mssql-db-conn.d.ts +0 -44
- package/dist/orm-node/src/connections/mssql-db-conn.d.ts.map +0 -1
- package/dist/orm-node/src/connections/mysql-db-conn.d.ts +0 -38
- package/dist/orm-node/src/connections/mysql-db-conn.d.ts.map +0 -1
- package/dist/orm-node/src/connections/postgresql-db-conn.d.ts +0 -39
- package/dist/orm-node/src/connections/postgresql-db-conn.d.ts.map +0 -1
- package/dist/orm-node/src/db-conn-factory.d.ts +0 -25
- package/dist/orm-node/src/db-conn-factory.d.ts.map +0 -1
- package/dist/orm-node/src/index.d.ts +0 -9
- package/dist/orm-node/src/index.d.ts.map +0 -1
- package/dist/orm-node/src/node-db-context-executor.d.ts +0 -77
- package/dist/orm-node/src/node-db-context-executor.d.ts.map +0 -1
- package/dist/orm-node/src/pooled-db-conn.d.ts +0 -79
- package/dist/orm-node/src/pooled-db-conn.d.ts.map +0 -1
- package/dist/orm-node/src/sd-orm.d.ts +0 -78
- package/dist/orm-node/src/sd-orm.d.ts.map +0 -1
- package/dist/orm-node/src/types/db-conn.d.ts +0 -159
- package/dist/orm-node/src/types/db-conn.d.ts.map +0 -1
- package/dist/service-common/src/index.d.ts +0 -8
- package/dist/service-common/src/index.d.ts.map +0 -1
- package/dist/service-common/src/protocol/protocol.types.d.ts +0 -100
- package/dist/service-common/src/protocol/protocol.types.d.ts.map +0 -1
- package/dist/service-common/src/protocol/service-protocol.d.ts +0 -63
- package/dist/service-common/src/protocol/service-protocol.d.ts.map +0 -1
- package/dist/service-common/src/service-types/auto-update-service.types.d.ts +0 -17
- package/dist/service-common/src/service-types/auto-update-service.types.d.ts.map +0 -1
- package/dist/service-common/src/service-types/crypto-service.types.d.ts +0 -22
- package/dist/service-common/src/service-types/crypto-service.types.d.ts.map +0 -1
- package/dist/service-common/src/service-types/orm-service.types.d.ts +0 -30
- package/dist/service-common/src/service-types/orm-service.types.d.ts.map +0 -1
- package/dist/service-common/src/service-types/smtp-service.types.d.ts +0 -55
- package/dist/service-common/src/service-types/smtp-service.types.d.ts.map +0 -1
- package/dist/service-common/src/types.d.ts +0 -43
- package/dist/service-common/src/types.d.ts.map +0 -1
- package/dist/service-server/src/auth/auth-token-payload.d.ts.map +0 -1
- package/dist/service-server/src/auth/auth.decorators.d.ts +0 -19
- package/dist/service-server/src/auth/auth.decorators.d.ts.map +0 -1
- package/dist/service-server/src/auth/jwt-manager.d.ts +0 -10
- package/dist/service-server/src/auth/jwt-manager.d.ts.map +0 -1
- package/dist/service-server/src/core/service-base.d.ts +0 -19
- package/dist/service-server/src/core/service-base.d.ts.map +0 -1
- package/dist/service-server/src/core/service-executor.d.ts +0 -18
- package/dist/service-server/src/core/service-executor.d.ts.map +0 -1
- package/dist/service-server/src/index.d.ts.map +0 -1
- package/dist/service-server/src/legacy/v1-auto-update-handler.d.ts.map +0 -1
- package/dist/service-server/src/protocol/protocol-wrapper.d.ts +0 -25
- package/dist/service-server/src/protocol/protocol-wrapper.d.ts.map +0 -1
- package/dist/service-server/src/service-server.d.ts.map +0 -1
- package/dist/service-server/src/services/auto-update-service.d.ts +0 -9
- package/dist/service-server/src/services/auto-update-service.d.ts.map +0 -1
- package/dist/service-server/src/services/crypto-service.d.ts +0 -10
- package/dist/service-server/src/services/crypto-service.d.ts.map +0 -1
- package/dist/service-server/src/services/orm-service.d.ts.map +0 -1
- package/dist/service-server/src/services/smtp-service.d.ts +0 -7
- package/dist/service-server/src/services/smtp-service.d.ts.map +0 -1
- package/dist/service-server/src/transport/http/http-request-handler.d.ts +0 -12
- package/dist/service-server/src/transport/http/http-request-handler.d.ts.map +0 -1
- package/dist/service-server/src/transport/http/static-file-handler.d.ts +0 -9
- package/dist/service-server/src/transport/http/static-file-handler.d.ts.map +0 -1
- package/dist/service-server/src/transport/http/upload-handler.d.ts +0 -10
- package/dist/service-server/src/transport/http/upload-handler.d.ts.map +0 -1
- package/dist/service-server/src/transport/socket/service-socket.d.ts +0 -41
- package/dist/service-server/src/transport/socket/service-socket.d.ts.map +0 -1
- package/dist/service-server/src/transport/socket/websocket-handler.d.ts +0 -18
- package/dist/service-server/src/transport/socket/websocket-handler.d.ts.map +0 -1
- package/dist/service-server/src/types/server-options.d.ts.map +0 -1
- package/dist/service-server/src/utils/config-manager.d.ts +0 -7
- package/dist/service-server/src/utils/config-manager.d.ts.map +0 -1
- package/dist/service-server/src/workers/service-protocol.worker.d.ts.map +0 -1
- package/src/auth/auth.decorators.ts +0 -71
- package/src/core/service-base.ts +0 -66
- /package/dist/{service-server/src/auth → auth}/auth-token-payload.d.ts +0 -0
- /package/dist/{service-server/src/workers → workers}/service-protocol.worker.d.ts +0 -0
package/README.md
CHANGED
|
@@ -14,72 +14,58 @@ pnpm add @simplysm/service-server
|
|
|
14
14
|
|
|
15
15
|
## Main Modules
|
|
16
16
|
|
|
17
|
-
### Core Classes
|
|
17
|
+
### Core Functions and Classes
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
| `ServiceExecutor` | `core/service-executor.ts` | Internal executor that handles service method discovery, auth checks, and execution |
|
|
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
|
|
21
|
+
- [`defineService`](#custom-services) - Defines a service with a factory function pattern
|
|
22
|
+
- `ServiceExecutor` - Internal executor that handles service method discovery, auth checks, and execution
|
|
24
23
|
|
|
25
24
|
### Authentication
|
|
26
25
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
| `AuthTokenPayload` | `auth/auth-token-payload.ts` | JWT payload interface (includes `roles`, `data`) |
|
|
26
|
+
- [`auth`](#authentication) - Function wrapper that sets authentication permissions at service or method level
|
|
27
|
+
- [`getServiceAuthPermissions`](#authentication) - Queries auth permissions for a service or method (used internally by `ServiceExecutor`)
|
|
28
|
+
- [`JwtManager`](docs/authentication.md#jwtmanager) - JWT token generation/verification/decoding based on jose library (HS256, 12-hour expiration)
|
|
29
|
+
- [`AuthTokenPayload`](docs/authentication.md#authtokenpayload) - JWT payload interface (includes `roles`, `data`)
|
|
32
30
|
|
|
33
31
|
### Transport Layer - WebSocket
|
|
34
32
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
| `WebSocketHandler` | `transport/socket/websocket-handler.ts` | Handles WebSocket connection management, message routing, and event distribution |
|
|
38
|
-
| `ServiceSocket` | `transport/socket/service-socket.ts` | Wraps individual WebSocket connections. Manages ping/pong, protocol encoding/decoding, event listener management |
|
|
33
|
+
- `WebSocketHandler` - Handles WebSocket connection management, message routing, and event distribution
|
|
34
|
+
- [`ServiceSocket`](docs/transport.md#servicesocket) - Wraps individual WebSocket connections. Manages ping/pong, protocol encoding/decoding, event listener management
|
|
39
35
|
|
|
40
36
|
### Transport Layer - HTTP
|
|
41
37
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
| `UploadHandler` | `transport/http/upload-handler.ts` | Handles multipart file upload at `/upload` route (auth required) |
|
|
46
|
-
| `StaticFileHandler` | `transport/http/static-file-handler.ts` | Serves static files. Prevents path traversal and blocks hidden files |
|
|
38
|
+
- `HttpRequestHandler` - Calls service methods via HTTP at `/api/:service/:method` route
|
|
39
|
+
- [`UploadHandler`](docs/transport.md#file-upload) - Handles multipart file upload at `/upload` route (auth required)
|
|
40
|
+
- `StaticFileHandler` - Serves static files. Prevents path traversal and blocks hidden files
|
|
47
41
|
|
|
48
42
|
### Protocol
|
|
49
43
|
|
|
50
|
-
|
|
51
|
-
|------|------|------|
|
|
52
|
-
| `ProtocolWrapper` | `protocol/protocol-wrapper.ts` | Message encoding/decoding wrapper. Messages over 30KB are processed in worker threads |
|
|
44
|
+
- [`ProtocolWrapper`](docs/transport.md#protocolwrapper) - Message encoding/decoding wrapper. Messages over 30KB are processed in worker threads
|
|
53
45
|
|
|
54
46
|
### Built-in Services
|
|
55
47
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
| `SmtpService` | `services/smtp-service.ts` | nodemailer-based email sending |
|
|
61
|
-
| `AutoUpdateService` | `services/auto-update-service.ts` | App auto-update (provides latest version query and download path) |
|
|
48
|
+
- [`OrmService`](docs/built-in-services.md#ormservice) - DB connection/transaction/query execution (WebSocket only, auth required)
|
|
49
|
+
- [`CryptoService`](docs/built-in-services.md#cryptoservice) - SHA256 hash and AES-256-CBC encryption/decryption
|
|
50
|
+
- [`SmtpService`](docs/built-in-services.md#smtpservice) - nodemailer-based email sending
|
|
51
|
+
- [`AutoUpdateService`](docs/built-in-services.md#autoupdateservice) - App auto-update (provides latest version query and download path)
|
|
62
52
|
|
|
63
53
|
### Utilities
|
|
64
54
|
|
|
65
|
-
|
|
66
|
-
|------|------|------|
|
|
67
|
-
| `ConfigManager` | `utils/config-manager.ts` | JSON config file loading/caching/real-time monitoring (auto expiration based on LazyGcMap) |
|
|
55
|
+
- [`ConfigManager`](docs/server.md#configmanager) - JSON config file loading/caching/real-time monitoring (auto expiration based on LazyGcMap)
|
|
68
56
|
|
|
69
57
|
### Legacy
|
|
70
58
|
|
|
71
|
-
|
|
72
|
-
|------|------|------|
|
|
73
|
-
| `handleV1Connection` | `legacy/v1-auto-update-handler.ts` | V1 protocol client compatibility handling (supports auto-update only) |
|
|
59
|
+
- [`handleV1Connection`](docs/transport.md#legacy-handlev1connection) - V1 protocol client compatibility handling (supports auto-update only)
|
|
74
60
|
|
|
75
61
|
## Usage
|
|
76
62
|
|
|
77
63
|
### Basic Server Configuration
|
|
78
64
|
|
|
79
65
|
```typescript
|
|
80
|
-
import {
|
|
66
|
+
import { createServiceServer } from "@simplysm/service-server";
|
|
81
67
|
|
|
82
|
-
const server =
|
|
68
|
+
const server = createServiceServer({
|
|
83
69
|
port: 8080,
|
|
84
70
|
rootPath: "/app/data",
|
|
85
71
|
services: [MyService],
|
|
@@ -101,486 +87,184 @@ server.on("close", () => {
|
|
|
101
87
|
await server.close();
|
|
102
88
|
```
|
|
103
89
|
|
|
104
|
-
### Server Options
|
|
90
|
+
### Server Options
|
|
105
91
|
|
|
106
|
-
|
|
107
|
-
interface ServiceServerOptions {
|
|
108
|
-
/** Server root path (base directory for static files and config files) */
|
|
109
|
-
rootPath: string;
|
|
110
|
-
/** Listen port */
|
|
111
|
-
port: number;
|
|
112
|
-
/** SSL/TLS config (enables HTTPS) */
|
|
113
|
-
ssl?: {
|
|
114
|
-
pfxBytes: Uint8Array;
|
|
115
|
-
passphrase: string;
|
|
116
|
-
};
|
|
117
|
-
/** JWT authentication config */
|
|
118
|
-
auth?: {
|
|
119
|
-
jwtSecret: string;
|
|
120
|
-
};
|
|
121
|
-
/** List of service classes to register */
|
|
122
|
-
services: Type<ServiceBase>[];
|
|
123
|
-
}
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
The following structure is expected under `rootPath`:
|
|
92
|
+
See [`ServiceServerOptions`](docs/server.md#server-options-serviceserveroptions) for detailed configuration options including SSL, authentication, and directory structure.
|
|
127
93
|
|
|
128
|
-
|
|
129
|
-
rootPath/
|
|
130
|
-
.config.json # Root config file
|
|
131
|
-
www/ # Static file root
|
|
132
|
-
uploads/ # Upload file storage directory
|
|
133
|
-
{clientName}/ # Per-client directory
|
|
134
|
-
.config.json # Per-client config file
|
|
135
|
-
index.html
|
|
136
|
-
```
|
|
94
|
+
### Custom Services
|
|
137
95
|
|
|
138
|
-
|
|
96
|
+
Services are defined using the `defineService` function. Service methods are called via RPC from the client.
|
|
139
97
|
|
|
140
98
|
```typescript
|
|
141
|
-
import {
|
|
99
|
+
import { defineService } from "@simplysm/service-server";
|
|
142
100
|
|
|
143
|
-
const
|
|
101
|
+
export const MyService = defineService("MyService", (ctx) => ({
|
|
102
|
+
hello: async (name: string): Promise<string> => {
|
|
103
|
+
return `Hello, ${name}!`;
|
|
104
|
+
},
|
|
144
105
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
rootPath: "/app/data",
|
|
148
|
-
ssl: {
|
|
149
|
-
pfxBytes,
|
|
150
|
-
passphrase: "certificate-password",
|
|
106
|
+
getServerTime: async (): Promise<Date> => {
|
|
107
|
+
return new Date();
|
|
151
108
|
},
|
|
152
|
-
|
|
153
|
-
services: [],
|
|
154
|
-
});
|
|
109
|
+
}));
|
|
155
110
|
|
|
156
|
-
|
|
111
|
+
// Export type for client-side type sharing
|
|
112
|
+
export type MyServiceMethods = import("@simplysm/service-server").ServiceMethods<typeof MyService>;
|
|
157
113
|
```
|
|
158
114
|
|
|
159
|
-
|
|
115
|
+
#### ServiceContext
|
|
160
116
|
|
|
161
|
-
|
|
117
|
+
The `ctx` parameter provides access to server resources:
|
|
162
118
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
}
|
|
119
|
+
- `ctx.server` - ServiceServer instance
|
|
120
|
+
- `ctx.socket` - ServiceSocket instance (WebSocket only, undefined for HTTP)
|
|
121
|
+
- `ctx.http` - HTTP request/reply objects (HTTP only, undefined for WebSocket)
|
|
122
|
+
- `ctx.authInfo` - Authentication info (set via JWT token)
|
|
123
|
+
- `ctx.clientName` - Client identifier
|
|
124
|
+
- `ctx.getConfig(name)` - Get server config by name
|
|
170
125
|
|
|
171
|
-
|
|
172
|
-
return new Date();
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
```
|
|
176
|
-
|
|
177
|
-
Context accessible within services:
|
|
178
|
-
|
|
179
|
-
| Property | Type | Description |
|
|
180
|
-
|------|------|------|
|
|
181
|
-
| `this.server` | `ServiceServer` | Server instance reference |
|
|
182
|
-
| `this.socket` | `ServiceSocket \| undefined` | WebSocket connection (`undefined` for HTTP calls) |
|
|
183
|
-
| `this.http` | `{ clientName, authTokenPayload? }` | HTTP request context |
|
|
184
|
-
| `this.authInfo` | `TAuthInfo \| undefined` | Authenticated user info |
|
|
185
|
-
| `this.clientName` | `string \| undefined` | Client app name |
|
|
186
|
-
| `this.clientPath` | `string \| undefined` | Per-client directory path |
|
|
187
|
-
|
|
188
|
-
### Config File Reference
|
|
126
|
+
### Authentication
|
|
189
127
|
|
|
190
|
-
|
|
128
|
+
Use the `auth()` wrapper to set authentication requirements at service or method level:
|
|
191
129
|
|
|
192
130
|
```typescript
|
|
193
|
-
|
|
194
|
-
async getDbHost(): Promise<string> {
|
|
195
|
-
// Read "mySection" key from rootPath/.config.json or clientPath/.config.json
|
|
196
|
-
const config = await this.getConfig<{ host: string }>("mySection");
|
|
197
|
-
return config.host;
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
```
|
|
131
|
+
import { defineService, auth } from "@simplysm/service-server";
|
|
201
132
|
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
{
|
|
206
|
-
"mySection": {
|
|
207
|
-
"host": "localhost"
|
|
208
|
-
},
|
|
209
|
-
"orm": {
|
|
210
|
-
"default": {
|
|
211
|
-
"dialect": "mysql",
|
|
212
|
-
"host": "localhost",
|
|
213
|
-
"port": 3306,
|
|
214
|
-
"database": "mydb",
|
|
215
|
-
"user": "root",
|
|
216
|
-
"password": "password"
|
|
217
|
-
}
|
|
218
|
-
}
|
|
133
|
+
interface UserAuthInfo {
|
|
134
|
+
userId: number;
|
|
135
|
+
role: string;
|
|
219
136
|
}
|
|
220
|
-
```
|
|
221
|
-
|
|
222
|
-
`ConfigManager` caches config files and automatically refreshes the cache on file changes (LazyGcMap-based, auto expires after 1 hour).
|
|
223
137
|
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
```typescript
|
|
229
|
-
import { ServiceBase, Authorize } from "@simplysm/service-server";
|
|
230
|
-
|
|
231
|
-
// Class level: all methods require login
|
|
232
|
-
@Authorize()
|
|
233
|
-
class UserService extends ServiceBase<{ userId: number; role: string }> {
|
|
234
|
-
// Login only required (inherits from class level)
|
|
235
|
-
async getProfile(): Promise<unknown> {
|
|
236
|
-
const userId = this.authInfo?.userId;
|
|
138
|
+
// Service-level auth: all methods require authentication
|
|
139
|
+
export const UserService = defineService("UserService", auth((ctx) => ({
|
|
140
|
+
getProfile: async (): Promise<unknown> => {
|
|
141
|
+
const userId = (ctx.authInfo as UserAuthInfo)?.userId;
|
|
237
142
|
// ...
|
|
238
|
-
}
|
|
143
|
+
},
|
|
239
144
|
|
|
240
|
-
|
|
241
|
-
@Authorize(["admin"])
|
|
242
|
-
async deleteUser(targetId: number): Promise<void> {
|
|
145
|
+
deleteUser: auth(["admin"], async (targetId: number): Promise<void> => {
|
|
243
146
|
// Only users with admin role can call
|
|
244
|
-
}
|
|
245
|
-
}
|
|
147
|
+
}),
|
|
148
|
+
})));
|
|
246
149
|
|
|
247
|
-
|
|
248
|
-
class PublicService extends ServiceBase {
|
|
249
|
-
async healthCheck(): Promise<string> {
|
|
250
|
-
return "OK";
|
|
251
|
-
}
|
|
252
|
-
}
|
|
150
|
+
export type UserServiceMethods = import("@simplysm/service-server").ServiceMethods<typeof UserService>;
|
|
253
151
|
```
|
|
254
152
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
| Target | `@Authorize()` | `@Authorize(["admin"])` |
|
|
258
|
-
|-----------|----------------|-------------------------|
|
|
259
|
-
| Class | All methods require login | All methods require admin role |
|
|
260
|
-
| Method | Method requires login | Method requires admin role |
|
|
261
|
-
| None | No auth required (Public) | - |
|
|
262
|
-
|
|
263
|
-
Method-level decorators override class-level settings.
|
|
264
|
-
|
|
265
|
-
### JWT Token Management
|
|
266
|
-
|
|
267
|
-
Generate and verify JWT tokens through the `ServiceServer` instance.
|
|
153
|
+
#### Auth Patterns
|
|
268
154
|
|
|
155
|
+
**Method-level auth only:**
|
|
269
156
|
```typescript
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
});
|
|
157
|
+
export const MyService = defineService("MyService", (ctx) => ({
|
|
158
|
+
publicMethod: async (): Promise<void> => {
|
|
159
|
+
// No auth required
|
|
160
|
+
},
|
|
275
161
|
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
// payload.data: { userId: 1, name: "홍길동" }
|
|
280
|
-
```
|
|
162
|
+
protectedMethod: auth(async (): Promise<void> => {
|
|
163
|
+
// Auth required
|
|
164
|
+
}),
|
|
281
165
|
|
|
282
|
-
|
|
166
|
+
adminMethod: auth(["admin"], async (): Promise<void> => {
|
|
167
|
+
// Auth + admin role required
|
|
168
|
+
}),
|
|
169
|
+
}));
|
|
170
|
+
```
|
|
283
171
|
|
|
172
|
+
**Service-level auth with method override:**
|
|
284
173
|
```typescript
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
174
|
+
// All methods require authentication by default
|
|
175
|
+
export const SecureService = defineService("SecureService", auth((ctx) => ({
|
|
176
|
+
normalMethod: async (): Promise<void> => {
|
|
177
|
+
// Auth required (inherited from service level)
|
|
178
|
+
},
|
|
179
|
+
|
|
180
|
+
adminMethod: auth(["admin"], async (): Promise<void> => {
|
|
181
|
+
// Auth + admin role required
|
|
182
|
+
}),
|
|
183
|
+
})));
|
|
291
184
|
```
|
|
292
185
|
|
|
293
|
-
|
|
186
|
+
See [Authentication](docs/authentication.md) for JWT token management and permission handling.
|
|
294
187
|
|
|
295
|
-
|
|
188
|
+
### HTTP/WebSocket Communication
|
|
296
189
|
|
|
297
|
-
|
|
190
|
+
Service methods can be called via HTTP or WebSocket:
|
|
298
191
|
|
|
299
192
|
```
|
|
300
193
|
GET /api/MyService/hello?json=["World"]
|
|
301
|
-
Header: x-sd-client-name: my-app
|
|
302
|
-
Header: Authorization: Bearer <token> (optional)
|
|
303
|
-
```
|
|
304
|
-
|
|
305
|
-
**POST Request:**
|
|
306
|
-
|
|
307
|
-
```
|
|
308
194
|
POST /api/MyService/hello
|
|
309
|
-
Header: Content-Type: application/json
|
|
310
|
-
Header: x-sd-client-name: my-app
|
|
311
|
-
Header: Authorization: Bearer <token> (optional)
|
|
312
|
-
Body: ["World"]
|
|
313
195
|
```
|
|
314
196
|
|
|
315
|
-
|
|
316
|
-
- Parameters are passed in array form (in the order of method arguments).
|
|
317
|
-
- For GET requests, pass a JSON-serialized array in the `json` query parameter.
|
|
197
|
+
See [HTTP API Call](docs/transport.md#http-api-call) and [ServiceSocket](docs/transport.md#servicesocket) for transport layer details.
|
|
318
198
|
|
|
319
199
|
### File Upload
|
|
320
200
|
|
|
321
|
-
Upload files via multipart request to the `/upload` endpoint
|
|
201
|
+
Upload files via multipart request to the `/upload` endpoint:
|
|
322
202
|
|
|
323
203
|
```typescript
|
|
324
|
-
// Client-side example
|
|
325
204
|
const formData = new FormData();
|
|
326
205
|
formData.append("file", file);
|
|
327
206
|
|
|
328
207
|
const response = await fetch("/upload", {
|
|
329
208
|
method: "POST",
|
|
330
|
-
headers: {
|
|
331
|
-
Authorization: `Bearer ${token}`,
|
|
332
|
-
},
|
|
209
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
333
210
|
body: formData,
|
|
334
211
|
});
|
|
335
|
-
|
|
336
|
-
// Response: ServiceUploadResult[]
|
|
337
|
-
const results = await response.json();
|
|
338
|
-
// [{ path: "uploads/uuid.ext", filename: "original-filename.ext", size: 12345 }]
|
|
339
212
|
```
|
|
340
213
|
|
|
341
|
-
|
|
214
|
+
See [File Upload](docs/transport.md#file-upload) for more details.
|
|
342
215
|
|
|
343
|
-
###
|
|
216
|
+
### Event Publishing
|
|
344
217
|
|
|
345
|
-
Publish events to connected clients
|
|
218
|
+
Publish real-time events to connected WebSocket clients:
|
|
346
219
|
|
|
347
220
|
```typescript
|
|
348
|
-
import {
|
|
221
|
+
import { defineEvent } from "@simplysm/service-common";
|
|
349
222
|
|
|
350
|
-
|
|
351
|
-
class OrderUpdatedEvent extends ServiceEventListener<
|
|
223
|
+
export const OrderUpdatedEvent = defineEvent<
|
|
352
224
|
{ orderId: number },
|
|
353
225
|
{ status: string }
|
|
354
|
-
>
|
|
355
|
-
readonly eventName = "OrderUpdatedEvent";
|
|
356
|
-
}
|
|
226
|
+
>("OrderUpdatedEvent");
|
|
357
227
|
|
|
358
|
-
// Publish event from server
|
|
359
228
|
await server.emitEvent(
|
|
360
229
|
OrderUpdatedEvent,
|
|
361
|
-
(info) => info.orderId === 123,
|
|
362
|
-
{ status: "completed" },
|
|
230
|
+
(info) => info.orderId === 123,
|
|
231
|
+
{ status: "completed" },
|
|
363
232
|
);
|
|
364
|
-
|
|
365
|
-
// Send reload command to all clients
|
|
366
|
-
await server.broadcastReload("my-app", new Set(["main.js"]));
|
|
367
233
|
```
|
|
368
234
|
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
Provides database connection/query/transaction via WebSocket. `@Authorize()` decorator is applied, requiring login.
|
|
372
|
-
|
|
373
|
-
```typescript
|
|
374
|
-
const server = new ServiceServer({
|
|
375
|
-
port: 8080,
|
|
376
|
-
rootPath: "/app/data",
|
|
377
|
-
auth: { jwtSecret: "secret" },
|
|
378
|
-
services: [OrmService],
|
|
379
|
-
});
|
|
380
|
-
```
|
|
235
|
+
See [Real-time Event Publishing](docs/transport.md#real-time-event-publishing) for more details.
|
|
381
236
|
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
```json
|
|
385
|
-
{
|
|
386
|
-
"orm": {
|
|
387
|
-
"default": {
|
|
388
|
-
"dialect": "mysql",
|
|
389
|
-
"host": "localhost",
|
|
390
|
-
"port": 3306,
|
|
391
|
-
"database": "mydb",
|
|
392
|
-
"user": "root",
|
|
393
|
-
"password": "password"
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
```
|
|
398
|
-
|
|
399
|
-
Methods provided by `OrmService`:
|
|
400
|
-
|
|
401
|
-
| Method | Description |
|
|
402
|
-
|--------|------|
|
|
403
|
-
| `getInfo(opt)` | Query DB connection info (dialect, database, schema) |
|
|
404
|
-
| `connect(opt)` | Create DB connection. Returns connection ID |
|
|
405
|
-
| `close(connId)` | Close DB connection |
|
|
406
|
-
| `beginTransaction(connId, isolationLevel?)` | Begin transaction |
|
|
407
|
-
| `commitTransaction(connId)` | Commit transaction |
|
|
408
|
-
| `rollbackTransaction(connId)` | Rollback transaction |
|
|
409
|
-
| `executeParametrized(connId, query, params?)` | Execute parameterized query |
|
|
410
|
-
| `executeDefs(connId, defs, options?)` | Execute QueryDef-based queries |
|
|
411
|
-
| `bulkInsert(connId, tableName, columnDefs, records)` | Bulk INSERT |
|
|
412
|
-
|
|
413
|
-
When a WebSocket connection is closed, all DB connections opened from that socket are automatically cleaned up.
|
|
414
|
-
|
|
415
|
-
### Built-in Service: CryptoService
|
|
416
|
-
|
|
417
|
-
Provides SHA256 hash and AES-256-CBC symmetric key encryption/decryption.
|
|
418
|
-
|
|
419
|
-
```typescript
|
|
420
|
-
const server = new ServiceServer({
|
|
421
|
-
port: 8080,
|
|
422
|
-
rootPath: "/app/data",
|
|
423
|
-
services: [CryptoService],
|
|
424
|
-
});
|
|
425
|
-
```
|
|
426
|
-
|
|
427
|
-
`.config.json` config:
|
|
428
|
-
|
|
429
|
-
```json
|
|
430
|
-
{
|
|
431
|
-
"crypto": {
|
|
432
|
-
"key": "your-32-byte-secret-key-here!!"
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
```
|
|
436
|
-
|
|
437
|
-
| Method | Description |
|
|
438
|
-
|--------|------|
|
|
439
|
-
| `encrypt(data)` | Generate SHA256 HMAC hash (one-way) |
|
|
440
|
-
| `encryptAes(data)` | AES-256-CBC encryption. Returns hex string in `iv:encrypted` format |
|
|
441
|
-
| `decryptAes(encText)` | AES-256-CBC decryption. Returns original binary |
|
|
442
|
-
|
|
443
|
-
### Built-in Service: SmtpService
|
|
444
|
-
|
|
445
|
-
A nodemailer-based email sending service. Can pass SMTP config directly or reference server config file.
|
|
446
|
-
|
|
447
|
-
```typescript
|
|
448
|
-
const server = new ServiceServer({
|
|
449
|
-
port: 8080,
|
|
450
|
-
rootPath: "/app/data",
|
|
451
|
-
services: [SmtpService],
|
|
452
|
-
});
|
|
453
|
-
```
|
|
237
|
+
### Built-in Services
|
|
454
238
|
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
```json
|
|
458
|
-
{
|
|
459
|
-
"smtp": {
|
|
460
|
-
"default": {
|
|
461
|
-
"host": "smtp.example.com",
|
|
462
|
-
"port": 587,
|
|
463
|
-
"secure": false,
|
|
464
|
-
"user": "user@example.com",
|
|
465
|
-
"pass": "password",
|
|
466
|
-
"senderName": "My App",
|
|
467
|
-
"senderEmail": "noreply@example.com"
|
|
468
|
-
}
|
|
469
|
-
}
|
|
470
|
-
}
|
|
471
|
-
```
|
|
239
|
+
The package provides several built-in services:
|
|
472
240
|
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
241
|
+
- [`OrmService`](docs/built-in-services.md#ormservice) - Database operations (MySQL, MSSQL, PostgreSQL)
|
|
242
|
+
- [`CryptoService`](docs/built-in-services.md#cryptoservice) - Hashing and encryption
|
|
243
|
+
- [`SmtpService`](docs/built-in-services.md#smtpservice) - Email sending
|
|
244
|
+
- [`AutoUpdateService`](docs/built-in-services.md#autoupdateservice) - Client app auto-updates
|
|
477
245
|
|
|
478
|
-
|
|
246
|
+
Register them like any other service:
|
|
479
247
|
|
|
480
248
|
```typescript
|
|
481
|
-
|
|
482
|
-
host: string;
|
|
483
|
-
port?: number;
|
|
484
|
-
secure?: boolean;
|
|
485
|
-
user?: string;
|
|
486
|
-
pass?: string;
|
|
487
|
-
from: string;
|
|
488
|
-
to: string;
|
|
489
|
-
cc?: string;
|
|
490
|
-
bcc?: string;
|
|
491
|
-
subject: string;
|
|
492
|
-
html: string;
|
|
493
|
-
attachments?: SmtpSendAttachment[];
|
|
494
|
-
}
|
|
495
|
-
```
|
|
496
|
-
|
|
497
|
-
### Built-in Service: AutoUpdateService
|
|
249
|
+
import { createServiceServer, OrmService, CryptoService, SmtpService } from "@simplysm/service-server";
|
|
498
250
|
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
```typescript
|
|
502
|
-
const server = new ServiceServer({
|
|
251
|
+
const server = createServiceServer({
|
|
503
252
|
port: 8080,
|
|
504
253
|
rootPath: "/app/data",
|
|
505
|
-
|
|
254
|
+
auth: { jwtSecret: "secret" },
|
|
255
|
+
services: [OrmService, CryptoService, SmtpService],
|
|
506
256
|
});
|
|
507
257
|
```
|
|
508
258
|
|
|
509
|
-
Update file structure:
|
|
510
|
-
|
|
511
|
-
```
|
|
512
|
-
rootPath/www/{clientName}/{platform}/updates/
|
|
513
|
-
1.0.0.exe (Windows)
|
|
514
|
-
1.0.1.exe
|
|
515
|
-
1.0.0.apk (Android)
|
|
516
|
-
1.0.1.apk
|
|
517
|
-
```
|
|
518
|
-
|
|
519
|
-
| Method | Description |
|
|
520
|
-
|--------|------|
|
|
521
|
-
| `getLastVersion(platform)` | Returns latest version and download path for the platform. Returns `undefined` if no update |
|
|
522
|
-
|
|
523
|
-
Return value:
|
|
524
|
-
|
|
525
|
-
```typescript
|
|
526
|
-
{
|
|
527
|
-
version: string; // e.g., "1.0.1"
|
|
528
|
-
downloadPath: string; // e.g., "/my-app/android/updates/1.0.1.apk"
|
|
529
|
-
}
|
|
530
|
-
```
|
|
531
|
-
|
|
532
|
-
### ConfigManager
|
|
533
|
-
|
|
534
|
-
A static utility class that manages loading, caching, and real-time monitoring of JSON config files. Used internally by `ServiceBase.getConfig()`.
|
|
535
|
-
|
|
536
|
-
```typescript
|
|
537
|
-
import { ConfigManager } from "@simplysm/service-server";
|
|
538
|
-
|
|
539
|
-
const config = await ConfigManager.getConfig<MyConfig>("/path/to/.config.json");
|
|
540
|
-
```
|
|
541
|
-
|
|
542
|
-
Behavior:
|
|
543
|
-
- Caches file in `LazyGcMap` on first load.
|
|
544
|
-
- Registers file change watch (`FsWatcher`) to auto-refresh cache on changes.
|
|
545
|
-
- Cache auto-expires after 1 hour of no access, and associated watch is released.
|
|
546
|
-
|
|
547
|
-
### ProtocolWrapper
|
|
548
|
-
|
|
549
|
-
Handles encoding/decoding of WebSocket messages. Automatically branches between main thread and worker thread based on message size.
|
|
550
|
-
|
|
551
|
-
| Condition | Processing Method |
|
|
552
|
-
|------|-----------|
|
|
553
|
-
| 30KB or less | Processed directly in main thread |
|
|
554
|
-
| Over 30KB | Processed in worker thread (max 4GB memory allocation) |
|
|
555
|
-
|
|
556
|
-
Messages containing large binary data (Uint8Array) also branch to worker thread.
|
|
557
|
-
|
|
558
|
-
## Server Route Structure
|
|
559
|
-
|
|
560
|
-
The following routes are automatically registered when `ServiceServer.listen()` is called:
|
|
561
|
-
|
|
562
|
-
| Route | Method | Description |
|
|
563
|
-
|--------|--------|------|
|
|
564
|
-
| `/api/:service/:method` | GET, POST | Service method call via HTTP |
|
|
565
|
-
| `/upload` | POST | Multipart file upload (auth required) |
|
|
566
|
-
| `/` | WebSocket | WebSocket connection endpoint |
|
|
567
|
-
| `/ws` | WebSocket | WebSocket connection endpoint (alias) |
|
|
568
|
-
| `/*` | GET, etc. | Static file serving (based on `rootPath/www/`) |
|
|
569
|
-
|
|
570
259
|
## Security
|
|
571
260
|
|
|
572
|
-
- **Helmet**: `@fastify/helmet` plugin automatically sets security headers like CSP, HSTS
|
|
573
|
-
- **CORS**: `@fastify/cors` plugin configures CORS
|
|
574
|
-
- **Path Traversal Prevention**: Static file handler and client name validation block `..`, `/`, `\` characters
|
|
575
|
-
- **Hidden File Blocking**: Files starting with `.` return a 403 response
|
|
576
|
-
- **Graceful Shutdown**: Detects `SIGINT`/`SIGTERM` signals to safely close
|
|
577
|
-
|
|
578
|
-
## Caveats
|
|
261
|
+
- **Helmet**: `@fastify/helmet` plugin automatically sets security headers like CSP, HSTS
|
|
262
|
+
- **CORS**: `@fastify/cors` plugin configures CORS
|
|
263
|
+
- **Path Traversal Prevention**: Static file handler and client name validation block `..`, `/`, `\` characters
|
|
264
|
+
- **Hidden File Blocking**: Files starting with `.` return a 403 response
|
|
265
|
+
- **Graceful Shutdown**: Detects `SIGINT`/`SIGTERM` signals to safely close WebSocket connections and server (10-second timeout)
|
|
579
266
|
|
|
580
|
-
|
|
581
|
-
- Config files (`.config.json`) contain sensitive information (DB passwords, JWT secrets, etc.), so hidden files (starting with `.`) are automatically blocked by the static file handler.
|
|
582
|
-
- WebSocket connection requires query parameters `ver=2`, `clientId`, `clientName`. Without these parameters, it operates in V1 legacy mode.
|
|
583
|
-
- If SSL is not configured, the `upgrade-insecure-requests` CSP directive is disabled.
|
|
267
|
+
See [Security](docs/server.md#security) for more details.
|
|
584
268
|
|
|
585
269
|
## License
|
|
586
270
|
|