target-supabase-sdk 0.2.0 → 0.2.2
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 +130 -11
- package/dist/browser.d.ts +44 -36
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +6 -45
- package/dist/browser.js.map +1 -1
- package/dist/chunks/create-logger-DyH3mZ8p.js +1028 -0
- package/dist/chunks/create-logger-DyH3mZ8p.js.map +1 -0
- package/dist/chunks/enable-log-persist-BH-tbKEj.js +1481 -0
- package/dist/chunks/enable-log-persist-BH-tbKEj.js.map +1 -0
- package/dist/chunks/word.interface-DLgRobKV.js +1973 -0
- package/dist/chunks/word.interface-DLgRobKV.js.map +1 -0
- package/dist/command/command.api.d.ts +1 -1
- package/dist/command/command.api.d.ts.map +1 -1
- package/dist/command/command.interface.d.ts +1 -1
- package/dist/command/command.interface.d.ts.map +1 -1
- package/dist/core.api.d.ts +10 -6
- package/dist/core.api.d.ts.map +1 -1
- package/dist/core.interface.d.ts +3 -2
- package/dist/core.interface.d.ts.map +1 -1
- package/dist/core.utils.d.ts +1 -1
- package/dist/core.utils.d.ts.map +1 -1
- package/dist/idea/idea.interface.d.ts +1 -1
- package/dist/idea/idea.interface.d.ts.map +1 -1
- package/dist/link/link.api.d.ts +1 -1
- package/dist/link/link.api.d.ts.map +1 -1
- package/dist/link/link.interface.d.ts +2 -2
- package/dist/link/link.interface.d.ts.map +1 -1
- package/dist/list/list.api.d.ts +3 -1
- package/dist/list/list.api.d.ts.map +1 -1
- package/dist/list/list.interface.d.ts +2 -2
- package/dist/list/list.interface.d.ts.map +1 -1
- package/dist/node/env/env-parsers.d.ts +19 -0
- package/dist/node/env/env-parsers.d.ts.map +1 -0
- package/dist/node/env/index.d.ts +11 -0
- package/dist/node/env/index.d.ts.map +1 -0
- package/dist/node/env/init-supabase-from-env.d.ts +17 -0
- package/dist/node/env/init-supabase-from-env.d.ts.map +1 -0
- package/dist/node/env/load-env.d.ts +20 -0
- package/dist/node/env/load-env.d.ts.map +1 -0
- package/dist/node/env/project-root.d.ts +11 -0
- package/dist/node/env/project-root.d.ts.map +1 -0
- package/dist/node/env/public-base-url.d.ts +10 -0
- package/dist/node/env/public-base-url.d.ts.map +1 -0
- package/dist/node/env/require-env.d.ts +3 -0
- package/dist/node/env/require-env.d.ts.map +1 -0
- package/dist/node/fs/json-state-store.d.ts +19 -0
- package/dist/node/fs/json-state-store.d.ts.map +1 -0
- package/dist/node/fs/read-source-file.d.ts +19 -0
- package/dist/node/fs/read-source-file.d.ts.map +1 -0
- package/dist/node/node-liveness.d.ts +30 -0
- package/dist/node/node-liveness.d.ts.map +1 -0
- package/dist/node/node-runtime.base.d.ts +21 -3
- package/dist/node/node-runtime.base.d.ts.map +1 -1
- package/dist/node/node.api.d.ts +1 -1
- package/dist/node/node.api.d.ts.map +1 -1
- package/dist/node/node.interface.d.ts +1 -6
- package/dist/node/node.interface.d.ts.map +1 -1
- package/dist/node/preload/run-service-preload.d.ts +14 -0
- package/dist/node/preload/run-service-preload.d.ts.map +1 -0
- package/dist/node/preload/service-preload.interface.d.ts +15 -0
- package/dist/node/preload/service-preload.interface.d.ts.map +1 -0
- package/dist/node/process/index.d.ts +5 -0
- package/dist/node/process/index.d.ts.map +1 -0
- package/dist/node/process/managed-child-processes.d.ts +37 -0
- package/dist/node/process/managed-child-processes.d.ts.map +1 -0
- package/dist/node/process/process-spawn.d.ts +27 -0
- package/dist/node/process/process-spawn.d.ts.map +1 -0
- package/dist/node/readiness/index.d.ts +9 -0
- package/dist/node/readiness/index.d.ts.map +1 -0
- package/dist/node/readiness/poll-until.d.ts +11 -0
- package/dist/node/readiness/poll-until.d.ts.map +1 -0
- package/dist/node/readiness/readiness-checks.d.ts +22 -0
- package/dist/node/readiness/readiness-checks.d.ts.map +1 -0
- package/dist/node/readiness/readiness.types.d.ts +12 -0
- package/dist/node/readiness/readiness.types.d.ts.map +1 -0
- package/dist/node/readiness/run-readiness-checks.d.ts +4 -0
- package/dist/node/readiness/run-readiness-checks.d.ts.map +1 -0
- package/dist/node/readiness/service-ready-gate.d.ts +26 -0
- package/dist/node/readiness/service-ready-gate.d.ts.map +1 -0
- package/dist/node.d.ts +26 -12
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +2482 -18
- package/dist/node.js.map +1 -1
- package/dist/parcel/chunk-fetch-registry.d.ts +14 -0
- package/dist/parcel/chunk-fetch-registry.d.ts.map +1 -0
- package/dist/parcel/chunk-url.utils.d.ts +9 -0
- package/dist/parcel/chunk-url.utils.d.ts.map +1 -0
- package/dist/parcel/parcel-manager.d.ts +44 -20
- package/dist/parcel/parcel-manager.d.ts.map +1 -1
- package/dist/parcel/parcel.api.d.ts +306 -0
- package/dist/parcel/parcel.api.d.ts.map +1 -0
- package/dist/parcel/parcel.interface.d.ts +26 -5
- package/dist/parcel/parcel.interface.d.ts.map +1 -1
- package/dist/parcel/parcel.service.d.ts +38 -0
- package/dist/parcel/parcel.service.d.ts.map +1 -0
- package/dist/parcel/storage-provider-registry.d.ts +17 -0
- package/dist/parcel/storage-provider-registry.d.ts.map +1 -0
- package/dist/parcel/storage-provider.types.d.ts +31 -0
- package/dist/parcel/storage-provider.types.d.ts.map +1 -0
- package/dist/preload.d.ts +7 -0
- package/dist/preload.d.ts.map +1 -0
- package/dist/preload.js +47 -0
- package/dist/preload.js.map +1 -0
- package/dist/repo/repo-context.utils.d.ts.map +1 -1
- package/dist/repo/repo-manager.d.ts +1 -1
- package/dist/repo/repo-manager.d.ts.map +1 -1
- package/dist/repo/repo.api.d.ts +1 -1
- package/dist/repo/repo.api.d.ts.map +1 -1
- package/dist/repo/repo.interface.d.ts +1 -1
- package/dist/repo/repo.interface.d.ts.map +1 -1
- package/dist/repo/repo.script-loader.d.ts +3 -3
- package/dist/repo/repo.script-loader.d.ts.map +1 -1
- package/dist/service/base.interface.d.ts +54 -57
- package/dist/service/base.interface.d.ts.map +1 -1
- package/dist/service/index.d.ts +21 -0
- package/dist/service/index.d.ts.map +1 -0
- package/dist/service/service.api.d.ts +503 -0
- package/dist/service/service.api.d.ts.map +1 -0
- package/dist/service/service.interface.d.ts +36 -9
- package/dist/service/service.interface.d.ts.map +1 -1
- package/dist/shared/http/fetch-retry.d.ts +21 -0
- package/dist/shared/http/fetch-retry.d.ts.map +1 -0
- package/dist/shared/log/create-logger.d.ts +27 -0
- package/dist/shared/log/create-logger.d.ts.map +1 -0
- package/dist/shared/log/enable-log-persist.d.ts +28 -0
- package/dist/shared/log/enable-log-persist.d.ts.map +1 -0
- package/dist/shared/log/index.d.ts +6 -6
- package/dist/shared/log/index.d.ts.map +1 -1
- package/dist/shared/log/log-manager.d.ts +25 -27
- package/dist/shared/log/log-manager.d.ts.map +1 -1
- package/dist/shared/log/log-persist-batch-id.d.ts +13 -0
- package/dist/shared/log/log-persist-batch-id.d.ts.map +1 -0
- package/dist/shared/log/log-persist-flush.d.ts +8 -0
- package/dist/shared/log/log-persist-flush.d.ts.map +1 -0
- package/dist/shared/log/log-persist-hook.d.ts +6 -0
- package/dist/shared/log/log-persist-hook.d.ts.map +1 -0
- package/dist/shared/log/log-persist-logger.d.ts +15 -0
- package/dist/shared/log/log-persist-logger.d.ts.map +1 -0
- package/dist/shared/log/log-persist-registry.d.ts +18 -0
- package/dist/shared/log/log-persist-registry.d.ts.map +1 -0
- package/dist/shared/log/log-persist.config.d.ts +10 -0
- package/dist/shared/log/log-persist.config.d.ts.map +1 -0
- package/dist/shared/log/log-persist.d.ts +55 -0
- package/dist/shared/log/log-persist.d.ts.map +1 -0
- package/dist/shared/log/log-persist.interface.d.ts +116 -0
- package/dist/shared/log/log-persist.interface.d.ts.map +1 -0
- package/dist/shared/log/log-scope.d.ts +25 -18
- package/dist/shared/log/log-scope.d.ts.map +1 -1
- package/dist/shared/utils/fetch-url.d.ts +3 -0
- package/dist/shared/utils/fetch-url.d.ts.map +1 -0
- package/dist/shared/utils/network-error.d.ts +14 -0
- package/dist/shared/utils/network-error.d.ts.map +1 -0
- package/dist/shared/utils/safe-file-name.d.ts +14 -0
- package/dist/shared/utils/safe-file-name.d.ts.map +1 -0
- package/dist/shared/utils/sha256.d.ts +3 -0
- package/dist/shared/utils/sha256.d.ts.map +1 -0
- package/dist/supabase.d.ts +7 -2
- package/dist/supabase.d.ts.map +1 -1
- package/dist/task/index.d.ts +8 -7
- package/dist/task/index.d.ts.map +1 -1
- package/dist/task/local-task-registry.d.ts +1 -1
- package/dist/task/local-task-registry.d.ts.map +1 -1
- package/dist/task/task-manager.d.ts +7 -9
- package/dist/task/task-manager.d.ts.map +1 -1
- package/dist/{node → task}/task-node.d.ts +2 -3
- package/dist/task/task-node.d.ts.map +1 -0
- package/dist/task/task-post-validated.api.d.ts +19 -0
- package/dist/task/task-post-validated.api.d.ts.map +1 -0
- package/dist/task/task-post.api.d.ts +10 -5
- package/dist/task/task-post.api.d.ts.map +1 -1
- package/dist/task/task-queue.d.ts +7 -0
- package/dist/task/task-queue.d.ts.map +1 -0
- package/dist/task/task-repo-context.d.ts.map +1 -1
- package/dist/task/task-repo-validation.d.ts +2 -2
- package/dist/task/task-repo-validation.d.ts.map +1 -1
- package/dist/task/task.api.d.ts +13 -13
- package/dist/task/task.api.d.ts.map +1 -1
- package/dist/task/task.constant.d.ts +4 -0
- package/dist/task/task.constant.d.ts.map +1 -0
- package/dist/task/task.interface.d.ts +1 -1
- package/dist/task/task.interface.d.ts.map +1 -1
- package/dist/trigger/trigger-manager.d.ts +25 -0
- package/dist/trigger/trigger-manager.d.ts.map +1 -0
- package/dist/trigger/trigger-node.d.ts +23 -0
- package/dist/trigger/trigger-node.d.ts.map +1 -0
- package/dist/trigger/trigger.api.d.ts +4 -4
- package/dist/trigger/trigger.api.d.ts.map +1 -1
- package/dist/trigger/trigger.constant.d.ts +8 -0
- package/dist/trigger/trigger.constant.d.ts.map +1 -0
- package/dist/trigger/trigger.interface.d.ts +46 -2
- package/dist/trigger/trigger.interface.d.ts.map +1 -1
- package/dist/word/word.api.d.ts +1 -1
- package/dist/word/word.api.d.ts.map +1 -1
- package/dist/word/word.interface.d.ts +2 -2
- package/dist/word/word.interface.d.ts.map +1 -1
- package/package.json +84 -74
- package/src/browser.ts +144 -79
- package/src/command/command.api.ts +19 -17
- package/src/command/command.interface.ts +2 -3
- package/src/core.api.ts +466 -477
- package/src/core.interface.ts +63 -62
- package/src/core.utils.ts +64 -64
- package/src/idea/idea.interface.ts +3 -3
- package/src/link/link.api.ts +28 -30
- package/src/link/link.interface.ts +3 -4
- package/src/list/list.api.ts +50 -29
- package/src/list/list.interface.ts +3 -4
- package/src/node/env/env-parsers.ts +77 -0
- package/src/node/env/index.ts +10 -0
- package/src/node/env/init-supabase-from-env.ts +38 -0
- package/src/node/env/load-env.ts +67 -0
- package/src/node/env/project-root.ts +34 -0
- package/src/node/env/public-base-url.ts +18 -0
- package/src/node/env/require-env.ts +15 -0
- package/src/node/fs/json-state-store.ts +97 -0
- package/src/node/fs/read-source-file.ts +75 -0
- package/src/node/node-liveness.ts +80 -0
- package/src/node/node-runtime.base.ts +135 -104
- package/src/node/node.api.ts +11 -10
- package/src/node/node.interface.ts +1 -8
- package/src/node/node.utils.ts +1 -1
- package/src/node/preload/run-service-preload.ts +48 -0
- package/src/node/preload/service-preload.interface.ts +14 -0
- package/src/node/process/index.ts +8 -0
- package/src/node/process/managed-child-processes.ts +121 -0
- package/src/node/process/process-spawn.ts +61 -0
- package/src/node/readiness/index.ts +20 -0
- package/src/node/readiness/poll-until.ts +27 -0
- package/src/node/readiness/readiness-checks.ts +79 -0
- package/src/node/readiness/readiness.types.ts +13 -0
- package/src/node/readiness/run-readiness-checks.ts +20 -0
- package/src/node/readiness/service-ready-gate.ts +65 -0
- package/src/node.ts +138 -47
- package/src/parcel/chunk-fetch-registry.ts +96 -0
- package/src/parcel/chunk-url.utils.ts +30 -0
- package/src/parcel/parcel-manager.ts +431 -173
- package/src/parcel/parcel.api.ts +103 -0
- package/src/parcel/parcel.interface.ts +44 -23
- package/src/parcel/parcel.service.ts +79 -0
- package/src/parcel/storage-provider-registry.ts +49 -0
- package/src/parcel/storage-provider.types.ts +45 -0
- package/src/preload.ts +7 -0
- package/src/repo/repo-context.utils.ts +3 -4
- package/src/repo/repo-manager.ts +7 -20
- package/src/repo/repo.api.ts +5 -5
- package/src/repo/repo.interface.ts +1 -2
- package/src/repo/repo.script-loader.ts +4 -8
- package/src/service/base.interface.ts +81 -90
- package/src/service/index.ts +173 -0
- package/src/service/service.api.ts +294 -0
- package/src/service/service.interface.ts +49 -17
- package/src/shared/http/fetch-retry.ts +145 -0
- package/src/shared/log/create-logger.ts +51 -0
- package/src/shared/log/enable-log-persist.ts +225 -0
- package/src/shared/log/index.ts +19 -11
- package/src/shared/log/log-manager.ts +65 -69
- package/src/shared/log/log-persist-batch-id.ts +43 -0
- package/src/shared/log/log-persist-flush.ts +128 -0
- package/src/shared/log/log-persist-hook.ts +13 -0
- package/src/shared/log/log-persist-logger.ts +33 -0
- package/src/shared/log/log-persist-registry.ts +252 -0
- package/src/shared/log/log-persist.config.ts +97 -0
- package/src/shared/log/log-persist.interface.ts +132 -0
- package/src/shared/log/log-persist.ts +704 -0
- package/src/shared/log/log-scope.ts +46 -46
- package/src/shared/utils/config-path.utils.ts +1 -1
- package/src/shared/utils/fetch-url.ts +13 -0
- package/src/shared/utils/network-error.ts +152 -0
- package/src/shared/utils/safe-file-name.ts +37 -0
- package/src/shared/utils/sha256.ts +15 -0
- package/src/supabase.ts +125 -119
- package/src/task/index.ts +31 -34
- package/src/task/local-task-registry.ts +9 -17
- package/src/task/task-manager.ts +34 -35
- package/src/{node → task}/task-node.ts +91 -73
- package/src/task/task-post-validated.api.ts +47 -0
- package/src/task/task-post.api.ts +81 -98
- package/src/task/task-queue.ts +18 -0
- package/src/task/task-repo-context.ts +2 -1
- package/src/task/task-repo-validation.ts +6 -8
- package/src/task/task.api.ts +61 -25
- package/src/task/task.constant.ts +4 -0
- package/src/task/task.interface.ts +4 -7
- package/src/trigger/trigger-manager.ts +287 -0
- package/src/trigger/trigger-node.ts +80 -0
- package/src/trigger/trigger.api.ts +11 -11
- package/src/trigger/trigger.constant.ts +10 -0
- package/src/trigger/trigger.interface.ts +52 -2
- package/src/trigger/trigger.utils.ts +1 -1
- package/src/word/word.api.ts +28 -30
- package/src/word/word.interface.ts +3 -4
- package/dist/auth/auth.api.d.ts +0 -28
- package/dist/auth/auth.api.d.ts.map +0 -1
- package/dist/auth/auth.api.js +0 -51
- package/dist/auth/auth.api.js.map +0 -1
- package/dist/command/command.api.js +0 -58
- package/dist/command/command.api.js.map +0 -1
- package/dist/command/command.interface.js +0 -9
- package/dist/command/command.interface.js.map +0 -1
- package/dist/core.api.js +0 -412
- package/dist/core.api.js.map +0 -1
- package/dist/core.interface.js +0 -46
- package/dist/core.interface.js.map +0 -1
- package/dist/core.utils.js +0 -81
- package/dist/core.utils.js.map +0 -1
- package/dist/feed/feed.interface.d.ts +0 -27
- package/dist/feed/feed.interface.d.ts.map +0 -1
- package/dist/feed/feed.interface.js +0 -17
- package/dist/feed/feed.interface.js.map +0 -1
- package/dist/file/file-manager.d.ts +0 -24
- package/dist/file/file-manager.d.ts.map +0 -1
- package/dist/file/file-manager.js +0 -109
- package/dist/file/file-manager.js.map +0 -1
- package/dist/file/file.api.d.ts +0 -15
- package/dist/file/file.api.d.ts.map +0 -1
- package/dist/file/file.api.js +0 -30
- package/dist/file/file.api.js.map +0 -1
- package/dist/file/file.interface.d.ts +0 -25
- package/dist/file/file.interface.d.ts.map +0 -1
- package/dist/file/file.interface.js +0 -9
- package/dist/file/file.interface.js.map +0 -1
- package/dist/file-list/file-list.api.d.ts +0 -15
- package/dist/file-list/file-list.api.d.ts.map +0 -1
- package/dist/file-list/file-list.api.js +0 -54
- package/dist/file-list/file-list.api.js.map +0 -1
- package/dist/file-list/file-list.interface.d.ts +0 -22
- package/dist/file-list/file-list.interface.d.ts.map +0 -1
- package/dist/file-list/file-list.interface.js +0 -5
- package/dist/file-list/file-list.interface.js.map +0 -1
- package/dist/idea/idea.interface.js +0 -15
- package/dist/idea/idea.interface.js.map +0 -1
- package/dist/index.js +0 -3
- package/dist/index.js.map +0 -1
- package/dist/link/link.api.js +0 -30
- package/dist/link/link.api.js.map +0 -1
- package/dist/link/link.interface.js +0 -7
- package/dist/link/link.interface.js.map +0 -1
- package/dist/list/list.api.js +0 -30
- package/dist/list/list.api.js.map +0 -1
- package/dist/list/list.interface.js +0 -6
- package/dist/list/list.interface.js.map +0 -1
- package/dist/node/node-log-scope.d.ts +0 -11
- package/dist/node/node-log-scope.d.ts.map +0 -1
- package/dist/node/node-log-scope.js +0 -7
- package/dist/node/node-log-scope.js.map +0 -1
- package/dist/node/node-runtime.base.js +0 -397
- package/dist/node/node-runtime.base.js.map +0 -1
- package/dist/node/node-task.preset.d.ts +0 -1
- package/dist/node/node-task.preset.d.ts.map +0 -1
- package/dist/node/node-task.preset.js +0 -14
- package/dist/node/node-task.preset.js.map +0 -1
- package/dist/node/node.api.js +0 -100
- package/dist/node/node.api.js.map +0 -1
- package/dist/node/node.interface.js +0 -19
- package/dist/node/node.interface.js.map +0 -1
- package/dist/node/node.utils.js +0 -36
- package/dist/node/node.utils.js.map +0 -1
- package/dist/node/task-node.d.ts.map +0 -1
- package/dist/node/task-node.js +0 -245
- package/dist/node/task-node.js.map +0 -1
- package/dist/node/trigger-node.d.ts +0 -18
- package/dist/node/trigger-node.d.ts.map +0 -1
- package/dist/node/trigger-node.js +0 -150
- package/dist/node/trigger-node.js.map +0 -1
- package/dist/parcel/parcel-manager.js +0 -156
- package/dist/parcel/parcel-manager.js.map +0 -1
- package/dist/parcel/parcel.interface.js +0 -11
- package/dist/parcel/parcel.interface.js.map +0 -1
- package/dist/question-list/question-list.api.d.ts +0 -13
- package/dist/question-list/question-list.api.d.ts.map +0 -1
- package/dist/question-list/question-list.api.js +0 -35
- package/dist/question-list/question-list.api.js.map +0 -1
- package/dist/question-list/question-list.interface.d.ts +0 -18
- package/dist/question-list/question-list.interface.d.ts.map +0 -1
- package/dist/question-list/question-list.interface.js +0 -5
- package/dist/question-list/question-list.interface.js.map +0 -1
- package/dist/repo/repo-context.utils.js +0 -81
- package/dist/repo/repo-context.utils.js.map +0 -1
- package/dist/repo/repo-manager.js +0 -166
- package/dist/repo/repo-manager.js.map +0 -1
- package/dist/repo/repo.api.js +0 -40
- package/dist/repo/repo.api.js.map +0 -1
- package/dist/repo/repo.interface.js +0 -8
- package/dist/repo/repo.interface.js.map +0 -1
- package/dist/repo/repo.script-loader.js +0 -108
- package/dist/repo/repo.script-loader.js.map +0 -1
- package/dist/review/review.api.d.ts +0 -14
- package/dist/review/review.api.d.ts.map +0 -1
- package/dist/review/review.api.js +0 -133
- package/dist/review/review.api.js.map +0 -1
- package/dist/review/review.interface.d.ts +0 -24
- package/dist/review/review.interface.d.ts.map +0 -1
- package/dist/review/review.interface.js +0 -10
- package/dist/review/review.interface.js.map +0 -1
- package/dist/review-v2/apis/post-review-setting.api.d.ts +0 -12
- package/dist/review-v2/apis/post-review-setting.api.d.ts.map +0 -1
- package/dist/review-v2/apis/post-review-setting.api.js +0 -27
- package/dist/review-v2/apis/post-review-setting.api.js.map +0 -1
- package/dist/review-v2/apis/post-review.api.d.ts +0 -13
- package/dist/review-v2/apis/post-review.api.d.ts.map +0 -1
- package/dist/review-v2/apis/post-review.api.js +0 -46
- package/dist/review-v2/apis/post-review.api.js.map +0 -1
- package/dist/review-v2/review-setting.interface.d.ts +0 -23
- package/dist/review-v2/review-setting.interface.d.ts.map +0 -1
- package/dist/review-v2/review-setting.interface.js +0 -5
- package/dist/review-v2/review-setting.interface.js.map +0 -1
- package/dist/review-v2/review.interface.d.ts +0 -20
- package/dist/review-v2/review.interface.d.ts.map +0 -1
- package/dist/review-v2/review.interface.js +0 -5
- package/dist/review-v2/review.interface.js.map +0 -1
- package/dist/service/api.interface.d.ts +0 -35
- package/dist/service/api.interface.d.ts.map +0 -1
- package/dist/service/api.interface.js +0 -12
- package/dist/service/api.interface.js.map +0 -1
- package/dist/service/base.interface.js +0 -7
- package/dist/service/base.interface.js.map +0 -1
- package/dist/service/service.interface.js +0 -11
- package/dist/service/service.interface.js.map +0 -1
- package/dist/shared/log/create-api-logger.d.ts +0 -21
- package/dist/shared/log/create-api-logger.d.ts.map +0 -1
- package/dist/shared/log/create-api-logger.js +0 -19
- package/dist/shared/log/create-api-logger.js.map +0 -1
- package/dist/shared/log/index.js +0 -10
- package/dist/shared/log/index.js.map +0 -1
- package/dist/shared/log/log-manager.js +0 -237
- package/dist/shared/log/log-manager.js.map +0 -1
- package/dist/shared/log/log-scope.js +0 -70
- package/dist/shared/log/log-scope.js.map +0 -1
- package/dist/shared/utils/config-path.utils.js +0 -85
- package/dist/shared/utils/config-path.utils.js.map +0 -1
- package/dist/shared/utils/error.utils.js +0 -15
- package/dist/shared/utils/error.utils.js.map +0 -1
- package/dist/shared/utils/id.utils.js +0 -5
- package/dist/shared/utils/id.utils.js.map +0 -1
- package/dist/supabase.js +0 -100
- package/dist/supabase.js.map +0 -1
- package/dist/task/index.js +0 -14
- package/dist/task/index.js.map +0 -1
- package/dist/task/local-task-registry.js +0 -214
- package/dist/task/local-task-registry.js.map +0 -1
- package/dist/task/task-manager.js +0 -196
- package/dist/task/task-manager.js.map +0 -1
- package/dist/task/task-post.api.js +0 -91
- package/dist/task/task-post.api.js.map +0 -1
- package/dist/task/task-repo-context.js +0 -12
- package/dist/task/task-repo-context.js.map +0 -1
- package/dist/task/task-repo-validation.js +0 -96
- package/dist/task/task-repo-validation.js.map +0 -1
- package/dist/task/task.api.js +0 -303
- package/dist/task/task.api.js.map +0 -1
- package/dist/task/task.interface.js +0 -36
- package/dist/task/task.interface.js.map +0 -1
- package/dist/task/task.utils.js +0 -2
- package/dist/task/task.utils.js.map +0 -1
- package/dist/trigger/trigger.api.js +0 -125
- package/dist/trigger/trigger.api.js.map +0 -1
- package/dist/trigger/trigger.interface.js +0 -11
- package/dist/trigger/trigger.interface.js.map +0 -1
- package/dist/trigger/trigger.utils.js +0 -39
- package/dist/trigger/trigger.utils.js.map +0 -1
- package/dist/word/word.api.js +0 -30
- package/dist/word/word.api.js.map +0 -1
- package/dist/word/word.interface.js +0 -6
- package/dist/word/word.interface.js.map +0 -1
- package/src/auth/auth.api.ts +0 -87
- package/src/feed/feed.interface.ts +0 -33
- package/src/file/file-manager.ts +0 -145
- package/src/file/file.api.ts +0 -43
- package/src/file/file.interface.ts +0 -30
- package/src/file-list/file-list.api.ts +0 -64
- package/src/file-list/file-list.interface.ts +0 -24
- package/src/node/node-log-scope.ts +0 -15
- package/src/node/node-task.preset.ts +0 -13
- package/src/node/trigger-node.ts +0 -180
- package/src/question-list/question-list.api.ts +0 -42
- package/src/question-list/question-list.interface.ts +0 -21
- package/src/review/review.api.ts +0 -145
- package/src/review/review.interface.ts +0 -26
- package/src/review-v2/apis/post-review-setting.api.ts +0 -35
- package/src/review-v2/apis/post-review.api.ts +0 -59
- package/src/review-v2/review-setting.interface.ts +0 -26
- package/src/review-v2/review.interface.ts +0 -23
- package/src/service/api.interface.ts +0 -47
- package/src/shared/log/create-api-logger.ts +0 -36
|
@@ -1,26 +1,38 @@
|
|
|
1
|
-
import { MAX_POLL_TARGET_LIST_SIZE } from "../core.api";
|
|
2
1
|
import { getPollCommandList } from "../command/command.api";
|
|
3
2
|
import { CommandType } from "../command/command.interface";
|
|
3
|
+
import { MAX_POLL_TARGET_LIST_SIZE } from "../core.api";
|
|
4
4
|
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
createRootScope,
|
|
8
|
-
logManager,
|
|
5
|
+
createLogger,
|
|
6
|
+
createScope,
|
|
9
7
|
type LoggerWithScope,
|
|
8
|
+
LogLevel,
|
|
10
9
|
type LogScope,
|
|
10
|
+
logManager,
|
|
11
|
+
patchScope,
|
|
11
12
|
} from "../shared/log";
|
|
12
|
-
import { scopeForNodeLoop } from "./node-log-scope";
|
|
13
13
|
import { getErrorMessage } from "../shared/utils/error.utils";
|
|
14
14
|
import { patchChangeNodeStatus, patchNodeHeartBeat, patchStopNode, postRegisterNode } from "./node.api";
|
|
15
|
-
import {
|
|
15
|
+
import { NodeStatus } from "./node.interface";
|
|
16
16
|
import { formatHeartbeat, getRandomInterval } from "./node.utils";
|
|
17
17
|
|
|
18
|
+
/** 主循环单轮运行时上下文 — 由 start() 创建并向下传递 */
|
|
19
|
+
export interface NodeLoopContext {
|
|
20
|
+
loopTraceId: string;
|
|
21
|
+
nodeId: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export const LOG_TOPIC_NODE = "node";
|
|
25
|
+
const LOG_TOPIC_COMMAND = "command";
|
|
26
|
+
const LOG_TOPIC_PROCESS = "process";
|
|
27
|
+
|
|
18
28
|
/**
|
|
19
29
|
* Shared node process runtime: bootstrap, main-loop frame, heartbeat, commands, shutdown.
|
|
20
30
|
* Subclasses implement {@link onBeforeRegisterNode} and {@link runLoopSteps}.
|
|
21
31
|
*/
|
|
22
32
|
abstract class BaseNodeRuntime {
|
|
23
33
|
protected static readonly HEARTBEAT_FAILURE_THRESHOLD = 3;
|
|
34
|
+
/** Log `nodeId` label while startup has not yet received an assigned id from Supabase. */
|
|
35
|
+
private static readonly NODE_ID_PENDING_ASSIGNMENT = "pending-node-id";
|
|
24
36
|
|
|
25
37
|
protected readonly runtimeModule: string;
|
|
26
38
|
|
|
@@ -53,10 +65,10 @@ abstract class BaseNodeRuntime {
|
|
|
53
65
|
|
|
54
66
|
protected constructor(runtimeModule: string) {
|
|
55
67
|
this.runtimeModule = runtimeModule;
|
|
56
|
-
this.isRunning =
|
|
68
|
+
this.isRunning = false;
|
|
57
69
|
this.loopCount = 0;
|
|
58
70
|
this.startupTraceId = logManager.generateTraceId();
|
|
59
|
-
this.startupScope =
|
|
71
|
+
this.startupScope = createScope({ module: runtimeModule, traceId: this.startupTraceId });
|
|
60
72
|
}
|
|
61
73
|
|
|
62
74
|
/** Hook: task registration, trigger config load, etc. Throw to abort bootstrap. */
|
|
@@ -65,8 +77,18 @@ abstract class BaseNodeRuntime {
|
|
|
65
77
|
/** Hook: one iteration body after commands + heartbeat gate. */
|
|
66
78
|
protected abstract runLoopSteps(ctx: NodeLoopContext, heartbeatOk: boolean): Promise<void>;
|
|
67
79
|
|
|
80
|
+
/** Hook: minimum log level for main-loop scoped loggers (heartbeat, batchCommand, iteration). */
|
|
81
|
+
protected loopLoggerMinLevel(): LogLevel {
|
|
82
|
+
return LogLevel.INFO;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** Hook: ms to wait between loop iterations. Default: random 15–60s. */
|
|
86
|
+
protected getLoopIntervalMs(): number {
|
|
87
|
+
return getRandomInterval();
|
|
88
|
+
}
|
|
89
|
+
|
|
68
90
|
private getLogNodeId(): string {
|
|
69
|
-
return this.localNodeId ??
|
|
91
|
+
return this.localNodeId ?? BaseNodeRuntime.NODE_ID_PENDING_ASSIGNMENT;
|
|
70
92
|
}
|
|
71
93
|
|
|
72
94
|
protected isShuttingDown(): boolean {
|
|
@@ -79,17 +101,17 @@ abstract class BaseNodeRuntime {
|
|
|
79
101
|
|
|
80
102
|
private registerProcessLifecycle(logger: LoggerWithScope): void {
|
|
81
103
|
process.on("SIGTERM", () => {
|
|
82
|
-
logger.warn("收到 SIGTERM 信號,準備關閉節點", { topic:
|
|
104
|
+
logger.warn("收到 SIGTERM 信號,準備關閉節點", { topic: LOG_TOPIC_PROCESS });
|
|
83
105
|
this.requestShutdown("SIGTERM");
|
|
84
106
|
});
|
|
85
107
|
process.on("SIGINT", () => {
|
|
86
|
-
logger.warn("收到 SIGINT 信號,準備關閉節點", { topic:
|
|
108
|
+
logger.warn("收到 SIGINT 信號,準備關閉節點", { topic: LOG_TOPIC_PROCESS });
|
|
87
109
|
this.requestShutdown("SIGINT");
|
|
88
110
|
});
|
|
89
111
|
process.on("uncaughtException", (error) => {
|
|
90
112
|
if (this.shutdownPromise != null) {
|
|
91
|
-
logger.critical("shutdown
|
|
92
|
-
topic:
|
|
113
|
+
logger.critical("shutdown 進行中發生未捕獲異常,立即關閉節點", {
|
|
114
|
+
topic: LOG_TOPIC_PROCESS,
|
|
93
115
|
data: {
|
|
94
116
|
name: error.name,
|
|
95
117
|
message: error.message,
|
|
@@ -99,8 +121,8 @@ abstract class BaseNodeRuntime {
|
|
|
99
121
|
process.exit(1);
|
|
100
122
|
return;
|
|
101
123
|
}
|
|
102
|
-
logger.
|
|
103
|
-
topic:
|
|
124
|
+
logger.critical("未捕獲的異常,準備關閉節點", {
|
|
125
|
+
topic: LOG_TOPIC_PROCESS,
|
|
104
126
|
data: {
|
|
105
127
|
name: error.name,
|
|
106
128
|
message: error.message,
|
|
@@ -112,7 +134,7 @@ abstract class BaseNodeRuntime {
|
|
|
112
134
|
process.on("unhandledRejection", (reason) => {
|
|
113
135
|
if (this.shutdownPromise != null) {
|
|
114
136
|
logger.error("shutdown 進行中發生未處理的 Promise 拒絕", {
|
|
115
|
-
topic:
|
|
137
|
+
topic: LOG_TOPIC_PROCESS,
|
|
116
138
|
data: {
|
|
117
139
|
reason: getErrorMessage(reason),
|
|
118
140
|
stack: reason instanceof Error ? reason.stack : undefined,
|
|
@@ -121,7 +143,7 @@ abstract class BaseNodeRuntime {
|
|
|
121
143
|
return;
|
|
122
144
|
}
|
|
123
145
|
logger.error("未處理的 Promise 拒絕,準備關閉節點", {
|
|
124
|
-
topic:
|
|
146
|
+
topic: LOG_TOPIC_PROCESS,
|
|
125
147
|
data: {
|
|
126
148
|
reason: getErrorMessage(reason),
|
|
127
149
|
stack: reason instanceof Error ? reason.stack : undefined,
|
|
@@ -140,12 +162,12 @@ abstract class BaseNodeRuntime {
|
|
|
140
162
|
}
|
|
141
163
|
|
|
142
164
|
private async runStart(): Promise<void> {
|
|
143
|
-
const
|
|
144
|
-
|
|
145
|
-
);
|
|
165
|
+
const logger = createLogger({
|
|
166
|
+
scope: patchScope({ scope: this.startupScope, patch: { labels: { nodeId: this.getLogNodeId() } } }),
|
|
167
|
+
});
|
|
146
168
|
|
|
147
|
-
logger.
|
|
148
|
-
topic:
|
|
169
|
+
logger.debug("節點進程啟動中", {
|
|
170
|
+
topic: LOG_TOPIC_NODE,
|
|
149
171
|
data: {
|
|
150
172
|
pid: process.pid,
|
|
151
173
|
env: process.env.NODE_ENV ?? "development",
|
|
@@ -158,14 +180,14 @@ abstract class BaseNodeRuntime {
|
|
|
158
180
|
await this.onBeforeRegisterNode(logger);
|
|
159
181
|
} catch (error) {
|
|
160
182
|
logger.error("節點啟動前置步驟失敗", {
|
|
161
|
-
topic:
|
|
183
|
+
topic: LOG_TOPIC_NODE,
|
|
162
184
|
data: { error: getErrorMessage(error) },
|
|
163
185
|
});
|
|
164
186
|
this.requestShutdown("bootstrap:pre-register");
|
|
165
187
|
return;
|
|
166
188
|
}
|
|
167
189
|
|
|
168
|
-
logger.
|
|
190
|
+
logger.debug("開始向 Supabase 註冊節點", { topic: LOG_TOPIC_NODE });
|
|
169
191
|
try {
|
|
170
192
|
const { data, error } = await postRegisterNode({ traceId: this.startupTraceId });
|
|
171
193
|
if (data == null || error) {
|
|
@@ -174,7 +196,7 @@ abstract class BaseNodeRuntime {
|
|
|
174
196
|
this.localNodeId = data.id;
|
|
175
197
|
logger.resetScope({ labels: { nodeId: data.id } });
|
|
176
198
|
logger.success("節點註冊成功", {
|
|
177
|
-
topic:
|
|
199
|
+
topic: LOG_TOPIC_NODE,
|
|
178
200
|
data: {
|
|
179
201
|
nodeId: data.id,
|
|
180
202
|
details: data.details,
|
|
@@ -182,7 +204,7 @@ abstract class BaseNodeRuntime {
|
|
|
182
204
|
});
|
|
183
205
|
} catch (error) {
|
|
184
206
|
logger.error("節點註冊失敗", {
|
|
185
|
-
topic:
|
|
207
|
+
topic: LOG_TOPIC_NODE,
|
|
186
208
|
data: { error: getErrorMessage(error) },
|
|
187
209
|
});
|
|
188
210
|
this.requestShutdown("bootstrap:register-node");
|
|
@@ -190,7 +212,7 @@ abstract class BaseNodeRuntime {
|
|
|
190
212
|
}
|
|
191
213
|
|
|
192
214
|
const nodeId = this.localNodeId!;
|
|
193
|
-
logger.
|
|
215
|
+
logger.debug("節點準備進入主循環", { topic: LOG_TOPIC_NODE });
|
|
194
216
|
const { error: enterBusyError } = await patchChangeNodeStatus({
|
|
195
217
|
nodeId,
|
|
196
218
|
status: NodeStatus.BUSY,
|
|
@@ -199,54 +221,62 @@ abstract class BaseNodeRuntime {
|
|
|
199
221
|
});
|
|
200
222
|
if (enterBusyError) {
|
|
201
223
|
logger.error("節點進入主循環失敗,無法更新節點狀態為 BUSY", {
|
|
202
|
-
topic:
|
|
224
|
+
topic: LOG_TOPIC_NODE,
|
|
203
225
|
data: { error: enterBusyError.message },
|
|
204
226
|
});
|
|
205
227
|
this.requestShutdown("bootstrap:enter-busy");
|
|
206
228
|
return;
|
|
207
229
|
}
|
|
208
|
-
logger.
|
|
230
|
+
logger.debug("節點狀態已設為 BUSY 進入主循環", { topic: LOG_TOPIC_NODE, data: { nodeId } });
|
|
231
|
+
await this.runLoop(nodeId);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
private async runLoop(nodeId: string): Promise<void> {
|
|
235
|
+
this.isRunning = true;
|
|
209
236
|
|
|
210
237
|
while (this.isRunning) {
|
|
211
238
|
this.loopCount++;
|
|
212
239
|
const loopTraceId = logManager.generateTraceId();
|
|
213
|
-
const loopScope =
|
|
240
|
+
const loopScope = createScope({
|
|
214
241
|
module: `${this.runtimeModule}-loop-iteration`,
|
|
215
|
-
parent: applyScopePatch(this.startupScope, { labels: { nodeId } }),
|
|
216
242
|
traceId: loopTraceId,
|
|
243
|
+
labels: { nodeId },
|
|
217
244
|
});
|
|
218
245
|
const loopCtx: NodeLoopContext = { loopTraceId, nodeId };
|
|
219
|
-
const
|
|
246
|
+
const iterLogger = createLogger({
|
|
247
|
+
scope: loopScope,
|
|
248
|
+
minLevel: this.loopLoggerMinLevel(),
|
|
249
|
+
});
|
|
220
250
|
|
|
221
|
-
iterLogger.
|
|
222
|
-
topic:
|
|
251
|
+
iterLogger.debug(`主循環第 ${this.loopCount} 輪開始`, {
|
|
252
|
+
topic: LOG_TOPIC_NODE,
|
|
223
253
|
data: { nodeId, loopCount: this.loopCount },
|
|
224
254
|
});
|
|
225
255
|
try {
|
|
226
256
|
await this.batchCommand(loopCtx);
|
|
227
257
|
if (this.isShuttingDown()) {
|
|
228
|
-
iterLogger.
|
|
258
|
+
iterLogger.debug("節點關閉中,跳過本輪剩餘步驟", { topic: LOG_TOPIC_NODE });
|
|
229
259
|
break;
|
|
230
260
|
}
|
|
231
261
|
const heartbeatOk = await this.heartbeat(loopCtx);
|
|
232
262
|
if (this.isShuttingDown()) {
|
|
233
|
-
iterLogger.
|
|
263
|
+
iterLogger.debug("節點關閉中,跳過本輪剩餘步驟", { topic: LOG_TOPIC_NODE });
|
|
234
264
|
break;
|
|
235
265
|
}
|
|
236
266
|
await this.runLoopSteps(loopCtx, heartbeatOk);
|
|
237
267
|
} catch (error) {
|
|
238
268
|
iterLogger.critical(`主循環第 ${this.loopCount} 輪遇到未知錯誤`, {
|
|
239
|
-
topic:
|
|
269
|
+
topic: LOG_TOPIC_NODE,
|
|
240
270
|
data: { error: getErrorMessage(error) },
|
|
241
271
|
});
|
|
242
272
|
}
|
|
243
273
|
if (this.isShuttingDown()) {
|
|
244
|
-
iterLogger.debug("節點關閉中,跳過等待間隔", { topic:
|
|
274
|
+
iterLogger.debug("節點關閉中,跳過等待間隔", { topic: LOG_TOPIC_NODE });
|
|
245
275
|
break;
|
|
246
276
|
}
|
|
247
|
-
const interval =
|
|
277
|
+
const interval = this.getLoopIntervalMs();
|
|
248
278
|
iterLogger.debug(`主循環第 ${this.loopCount} 輪完成,等待下一輪`, {
|
|
249
|
-
topic:
|
|
279
|
+
topic: LOG_TOPIC_NODE,
|
|
250
280
|
data: { intervalMs: interval },
|
|
251
281
|
});
|
|
252
282
|
await new Promise((resolve) => setTimeout(resolve, interval));
|
|
@@ -255,11 +285,11 @@ abstract class BaseNodeRuntime {
|
|
|
255
285
|
|
|
256
286
|
async shutdown(options?: { trigger?: string }): Promise<void> {
|
|
257
287
|
if (this.shutdownPromise != null) {
|
|
258
|
-
const
|
|
259
|
-
|
|
260
|
-
);
|
|
288
|
+
const logger = createLogger({
|
|
289
|
+
scope: patchScope({ scope: this.startupScope, patch: { labels: { nodeId: this.getLogNodeId() } } }),
|
|
290
|
+
});
|
|
261
291
|
logger.debug("shutdown 已在進行,跳過重複調用", {
|
|
262
|
-
topic:
|
|
292
|
+
topic: LOG_TOPIC_NODE,
|
|
263
293
|
data: { trigger: options?.trigger ?? "unknown" },
|
|
264
294
|
});
|
|
265
295
|
return this.shutdownPromise;
|
|
@@ -267,11 +297,11 @@ abstract class BaseNodeRuntime {
|
|
|
267
297
|
|
|
268
298
|
this.isRunning = false;
|
|
269
299
|
this.shutdownPromise = this.runShutdown(options?.trigger).catch((error) => {
|
|
270
|
-
const
|
|
271
|
-
|
|
272
|
-
);
|
|
300
|
+
const logger = createLogger({
|
|
301
|
+
scope: patchScope({ scope: this.startupScope, patch: { labels: { nodeId: this.getLogNodeId() } } }),
|
|
302
|
+
});
|
|
273
303
|
logger.error("shutdown 流程異常", {
|
|
274
|
-
topic:
|
|
304
|
+
topic: LOG_TOPIC_NODE,
|
|
275
305
|
data: {
|
|
276
306
|
trigger: options?.trigger ?? "explicit",
|
|
277
307
|
error: getErrorMessage(error),
|
|
@@ -283,22 +313,22 @@ abstract class BaseNodeRuntime {
|
|
|
283
313
|
}
|
|
284
314
|
|
|
285
315
|
private async runShutdown(trigger?: string): Promise<void> {
|
|
286
|
-
const
|
|
287
|
-
|
|
288
|
-
);
|
|
316
|
+
const logger = createLogger({
|
|
317
|
+
scope: patchScope({ scope: this.startupScope, patch: { labels: { nodeId: this.getLogNodeId() } } }),
|
|
318
|
+
});
|
|
289
319
|
|
|
290
|
-
logger.
|
|
291
|
-
topic:
|
|
320
|
+
logger.debug("正在關閉節點進程", {
|
|
321
|
+
topic: LOG_TOPIC_NODE,
|
|
292
322
|
data: { trigger: trigger ?? "explicit" },
|
|
293
323
|
});
|
|
294
324
|
|
|
295
325
|
if (this.localNodeId == null) {
|
|
296
|
-
logger.
|
|
326
|
+
logger.warn("本地節點未註冊,進程退出", { topic: LOG_TOPIC_NODE });
|
|
297
327
|
process.exit(0);
|
|
298
328
|
return;
|
|
299
329
|
}
|
|
300
330
|
|
|
301
|
-
logger.
|
|
331
|
+
logger.debug("正在登出節點", { topic: LOG_TOPIC_NODE, data: { nodeId: this.localNodeId } });
|
|
302
332
|
try {
|
|
303
333
|
const { error } = await patchStopNode({
|
|
304
334
|
nodeId: this.localNodeId,
|
|
@@ -307,30 +337,29 @@ abstract class BaseNodeRuntime {
|
|
|
307
337
|
if (error) {
|
|
308
338
|
throw new Error(`patchStopNode 失敗: ${error.message}`);
|
|
309
339
|
}
|
|
310
|
-
logger.success("
|
|
340
|
+
logger.success("節點正常關閉,進程退出", { topic: LOG_TOPIC_NODE });
|
|
311
341
|
} catch (error) {
|
|
312
|
-
logger.critical("
|
|
313
|
-
topic:
|
|
342
|
+
logger.critical("登出節點失敗,進程退出", {
|
|
343
|
+
topic: LOG_TOPIC_NODE,
|
|
314
344
|
data: { error: getErrorMessage(error) },
|
|
315
345
|
});
|
|
316
346
|
} finally {
|
|
317
|
-
logger.info("節點進程退出", { topic: "node" });
|
|
318
347
|
process.exit(0);
|
|
319
348
|
}
|
|
320
349
|
}
|
|
321
350
|
|
|
322
351
|
async heartbeat(ctx: NodeLoopContext): Promise<boolean> {
|
|
323
352
|
const { loopTraceId, nodeId } = ctx;
|
|
324
|
-
const
|
|
325
|
-
|
|
353
|
+
const logger = createLogger({
|
|
354
|
+
scope: createScope({
|
|
326
355
|
module: "heartbeat",
|
|
327
356
|
traceId: loopTraceId,
|
|
328
|
-
nodeId,
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
);
|
|
357
|
+
labels: { nodeId },
|
|
358
|
+
}),
|
|
359
|
+
minLevel: this.loopLoggerMinLevel(),
|
|
360
|
+
});
|
|
332
361
|
|
|
333
|
-
logger.
|
|
362
|
+
logger.debug("開始發送心跳", { topic: LOG_TOPIC_NODE });
|
|
334
363
|
let error: { message: string } | undefined;
|
|
335
364
|
let lastHeartBeat: number | null | undefined;
|
|
336
365
|
try {
|
|
@@ -351,19 +380,19 @@ abstract class BaseNodeRuntime {
|
|
|
351
380
|
};
|
|
352
381
|
if (failureCount >= BaseNodeRuntime.HEARTBEAT_FAILURE_THRESHOLD) {
|
|
353
382
|
logger.critical("連續心跳失敗達上限,準備關閉節點", {
|
|
354
|
-
topic:
|
|
383
|
+
topic: LOG_TOPIC_NODE,
|
|
355
384
|
data: logData,
|
|
356
385
|
});
|
|
357
386
|
this.requestShutdown("heartbeat:consecutive-failures");
|
|
358
387
|
} else {
|
|
359
|
-
logger.warn("心跳更新失敗", { topic:
|
|
388
|
+
logger.warn("心跳更新失敗", { topic: LOG_TOPIC_NODE, data: logData });
|
|
360
389
|
}
|
|
361
390
|
return false;
|
|
362
391
|
}
|
|
363
392
|
|
|
364
393
|
this.consecutiveHeartbeatFailures = 0;
|
|
365
394
|
logger.success("心跳更新成功", {
|
|
366
|
-
topic:
|
|
395
|
+
topic: LOG_TOPIC_NODE,
|
|
367
396
|
data: { lastHeartBeat: formatHeartbeat(lastHeartBeat) },
|
|
368
397
|
});
|
|
369
398
|
return true;
|
|
@@ -371,54 +400,52 @@ abstract class BaseNodeRuntime {
|
|
|
371
400
|
|
|
372
401
|
async batchCommand(ctx: NodeLoopContext): Promise<void> {
|
|
373
402
|
const { loopTraceId, nodeId } = ctx;
|
|
374
|
-
const
|
|
375
|
-
|
|
403
|
+
const cmdLogger = createLogger({
|
|
404
|
+
scope: createScope({
|
|
376
405
|
module: "batchCommand",
|
|
377
406
|
traceId: loopTraceId,
|
|
378
|
-
nodeId,
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
);
|
|
382
|
-
|
|
383
|
-
logger.debug("開始檢查控制指令", { topic: "node" });
|
|
407
|
+
labels: { nodeId },
|
|
408
|
+
}),
|
|
409
|
+
minLevel: this.loopLoggerMinLevel(),
|
|
410
|
+
});
|
|
384
411
|
|
|
412
|
+
cmdLogger.debug("開始檢查控制指令", { topic: LOG_TOPIC_COMMAND });
|
|
385
413
|
const { data: commandList = [], error: pollError } = await getPollCommandList({
|
|
386
414
|
nodeId,
|
|
387
415
|
traceId: loopTraceId,
|
|
388
416
|
size: MAX_POLL_TARGET_LIST_SIZE,
|
|
389
417
|
});
|
|
390
418
|
if (pollError) {
|
|
391
|
-
|
|
392
|
-
topic:
|
|
419
|
+
cmdLogger.warn("獲取指令失敗", {
|
|
420
|
+
topic: LOG_TOPIC_COMMAND,
|
|
393
421
|
data: { error: pollError.message },
|
|
394
422
|
});
|
|
395
423
|
return;
|
|
396
424
|
}
|
|
397
425
|
if (commandList.length === 0) {
|
|
398
|
-
|
|
426
|
+
cmdLogger.debug("獲取指令數量為0 無需執行", { topic: LOG_TOPIC_COMMAND });
|
|
399
427
|
return;
|
|
400
428
|
}
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
data: { count: commandList.length },
|
|
429
|
+
cmdLogger.debug(`獲取到控制指令數量為${commandList.length}`, {
|
|
430
|
+
topic: LOG_TOPIC_COMMAND,
|
|
431
|
+
data: { count: commandList.length, commandList: commandList.map((command) => command.name) },
|
|
405
432
|
});
|
|
406
433
|
|
|
407
434
|
for (const command of commandList) {
|
|
408
435
|
const cmd = command.name;
|
|
409
|
-
|
|
410
|
-
topic:
|
|
436
|
+
cmdLogger.info("執行控制指令", {
|
|
437
|
+
topic: LOG_TOPIC_COMMAND,
|
|
411
438
|
data: { commandId: command.id, cmd },
|
|
412
439
|
});
|
|
413
440
|
try {
|
|
414
|
-
await this.executeCommand(cmd);
|
|
415
|
-
|
|
416
|
-
topic:
|
|
441
|
+
await this.executeCommand(cmd, ctx);
|
|
442
|
+
cmdLogger.success("控制指令執行成功", {
|
|
443
|
+
topic: LOG_TOPIC_COMMAND,
|
|
417
444
|
data: { commandId: command.id, cmd },
|
|
418
445
|
});
|
|
419
446
|
} catch (error) {
|
|
420
|
-
|
|
421
|
-
topic:
|
|
447
|
+
cmdLogger.warn("控制指令執行失敗", {
|
|
448
|
+
topic: LOG_TOPIC_COMMAND,
|
|
422
449
|
data: {
|
|
423
450
|
commandId: command.id,
|
|
424
451
|
cmd,
|
|
@@ -428,22 +455,26 @@ abstract class BaseNodeRuntime {
|
|
|
428
455
|
}
|
|
429
456
|
}
|
|
430
457
|
|
|
431
|
-
|
|
432
|
-
topic:
|
|
433
|
-
data: { totalDequeued: commandList.length },
|
|
458
|
+
cmdLogger.debug("控制指令批次處理完成", {
|
|
459
|
+
topic: LOG_TOPIC_COMMAND,
|
|
434
460
|
});
|
|
435
461
|
}
|
|
436
462
|
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
default: {
|
|
443
|
-
const unknownCmd: never = cmd;
|
|
444
|
-
throw new Error(`無法解析的cmd: ${unknownCmd}`);
|
|
445
|
-
}
|
|
463
|
+
/** Shared commands, then {@link resolveNodeCommand} for subclass-specific handling. */
|
|
464
|
+
protected async executeCommand(cmd: CommandType, ctx: NodeLoopContext): Promise<void> {
|
|
465
|
+
if (cmd === CommandType.STOP_NODE) {
|
|
466
|
+
this.requestShutdown("cmd:STOP_NODE");
|
|
467
|
+
return;
|
|
446
468
|
}
|
|
469
|
+
await this.resolveNodeCommand(cmd, ctx);
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
/**
|
|
473
|
+
* Hook: handle node-type-specific {@link CommandType} values.
|
|
474
|
+
* Default rejects anything not handled in {@link executeCommand}.
|
|
475
|
+
*/
|
|
476
|
+
protected async resolveNodeCommand(cmd: CommandType, _ctx: NodeLoopContext): Promise<void> {
|
|
477
|
+
throw new Error(`無法解析的 cmd: ${cmd}`);
|
|
447
478
|
}
|
|
448
479
|
}
|
|
449
480
|
|
package/src/node/node.api.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { createTarget, QueryFilter, updateTargetDetails, validateWithSchema } from "../core.api";
|
|
2
|
-
import { generateResponse } from "../core.interface";
|
|
3
|
-
import { createApiLogger } from "../shared/log";
|
|
4
1
|
import { z } from "zod";
|
|
5
|
-
import {
|
|
2
|
+
import { createTarget, type QueryFilter, updateTargetDetails, validateWithSchema } from "../core.api";
|
|
3
|
+
import { generateResponse } from "../core.interface";
|
|
4
|
+
import { createLogger } from "../shared/log";
|
|
5
|
+
import { CategoryNode, type Node, type NodeDetails, NodeStatus } from "./node.interface";
|
|
6
6
|
|
|
7
7
|
const NODE_STATUS_FIELD = "details->>status" as const;
|
|
8
|
+
const LOG_TOPIC_NODE = "node";
|
|
8
9
|
|
|
9
10
|
const nodeIdSchema = z.string().trim().min(1);
|
|
10
11
|
const traceIdSchema = z.string().trim().min(1).optional();
|
|
@@ -51,7 +52,7 @@ function lockOnNodeStatus(status: NodeStatus): QueryFilter[] {
|
|
|
51
52
|
|
|
52
53
|
export const postRegisterNode = validateWithSchema(
|
|
53
54
|
postRegisterNodeSchema,
|
|
54
|
-
"postRegisterNodeSchema"
|
|
55
|
+
"postRegisterNodeSchema",
|
|
55
56
|
)(async (payload) => {
|
|
56
57
|
return createTarget<Node, PostRegisterNodePayload>({
|
|
57
58
|
payload,
|
|
@@ -76,7 +77,7 @@ export const postRegisterNode = validateWithSchema(
|
|
|
76
77
|
|
|
77
78
|
export const patchNodeHeartBeat = validateWithSchema(
|
|
78
79
|
patchNodeHeartBeatSchema,
|
|
79
|
-
"patchNodeHeartBeatSchema"
|
|
80
|
+
"patchNodeHeartBeatSchema",
|
|
80
81
|
)(async ({ nodeId }) => {
|
|
81
82
|
const lastHeartBeat = Date.now();
|
|
82
83
|
await updateTargetDetails<Node, NodeDetails>({
|
|
@@ -93,7 +94,7 @@ export const patchNodeHeartBeat = validateWithSchema(
|
|
|
93
94
|
|
|
94
95
|
export const patchStopNode = validateWithSchema(
|
|
95
96
|
patchStopNodeSchema,
|
|
96
|
-
"patchStopNodeSchema"
|
|
97
|
+
"patchStopNodeSchema",
|
|
97
98
|
)(async ({ nodeId }) => {
|
|
98
99
|
const lastHeartBeat = Date.now();
|
|
99
100
|
// TODO 等待任務全部完成才下綫 應該先使用NodeStatus.DRAINING
|
|
@@ -112,9 +113,9 @@ export const patchStopNode = validateWithSchema(
|
|
|
112
113
|
|
|
113
114
|
export const patchChangeNodeStatus = validateWithSchema(
|
|
114
115
|
patchChangeNodeStatusSchema,
|
|
115
|
-
"patchChangeNodeStatusSchema"
|
|
116
|
+
"patchChangeNodeStatusSchema",
|
|
116
117
|
)(async ({ nodeId, status, fromStatus, traceId }) => {
|
|
117
|
-
const logger =
|
|
118
|
+
const logger = createLogger({ module: "patchChangeNodeStatus", traceId, labels: { nodeId } });
|
|
118
119
|
|
|
119
120
|
const data = await updateTargetDetails<Node, NodeDetails>({
|
|
120
121
|
id: nodeId,
|
|
@@ -127,7 +128,7 @@ export const patchChangeNodeStatus = validateWithSchema(
|
|
|
127
128
|
});
|
|
128
129
|
|
|
129
130
|
logger.info("节点状态更新成功", {
|
|
130
|
-
topic:
|
|
131
|
+
topic: LOG_TOPIC_NODE,
|
|
131
132
|
data: {
|
|
132
133
|
nodeId,
|
|
133
134
|
status,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Target } from "../core.interface";
|
|
1
|
+
import type { Target } from "../core.interface";
|
|
2
2
|
|
|
3
3
|
export enum NodeStatus {
|
|
4
4
|
/** Registered, not yet in worker loop. */
|
|
@@ -30,11 +30,4 @@ export interface NodeDetails {
|
|
|
30
30
|
manifestVersion: number;
|
|
31
31
|
status: NodeStatus;
|
|
32
32
|
lastHeartBeat: number;
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
/** 主循环单轮运行时上下文 — 由 start() 创建并向下传递 */
|
|
36
|
-
export interface NodeLoopContext {
|
|
37
|
-
loopTraceId: string;
|
|
38
|
-
nodeId: string;
|
|
39
33
|
}
|
|
40
|
-
|
package/src/node/node.utils.ts
CHANGED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { resolve } from "node:path";
|
|
2
|
+
import { validateLogPersistPreloadEnv } from "../../shared/log/enable-log-persist";
|
|
3
|
+
import { logPersistEnabledFromEnv } from "../../shared/log/log-persist.config";
|
|
4
|
+
import { loadEnvFiles } from "../env/load-env";
|
|
5
|
+
import { resolveProjectRootByPackageName } from "../env/project-root";
|
|
6
|
+
import type { ServicePreloadOptions } from "./service-preload.interface";
|
|
7
|
+
|
|
8
|
+
function applyServiceEnvDefaults(projectRoot: string, options: ServicePreloadOptions): void {
|
|
9
|
+
if (!logPersistEnabledFromEnv()) {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const service = process.env.LOG_PERSIST_SERVICE?.trim();
|
|
14
|
+
if (service == null || service === "") {
|
|
15
|
+
process.env.LOG_PERSIST_SERVICE = options.serviceValue;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const runtimeDir = process.env.RUNTIME_DATA_DIR?.trim();
|
|
19
|
+
if (runtimeDir == null || runtimeDir === "") {
|
|
20
|
+
const relative = options.runtimeDataDirRelative ?? "data/runtime";
|
|
21
|
+
process.env.RUNTIME_DATA_DIR = resolve(projectRoot, relative);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Unified Node `--import` preload runner (sync only).
|
|
27
|
+
*
|
|
28
|
+
* Phase 1 — Resolve project root from service package name
|
|
29
|
+
* Phase 2 — Load `.env.local` / `.env`
|
|
30
|
+
* Phase 3 — Apply SDK service env defaults + optional L3 hook
|
|
31
|
+
* Phase 4 — Validate log-persist env when enabled
|
|
32
|
+
* Phase 5 — Process diagnostics (TODO)
|
|
33
|
+
*
|
|
34
|
+
* Supabase init and log-persist enable stay in app `main()` (async).
|
|
35
|
+
*/
|
|
36
|
+
export function runServicePreload(options: ServicePreloadOptions): void {
|
|
37
|
+
const projectRoot = resolveProjectRootByPackageName(options.callerImportMetaUrl, options.packageName);
|
|
38
|
+
|
|
39
|
+
loadEnvFiles(projectRoot, { afterLoad: options.afterLoadEnv });
|
|
40
|
+
|
|
41
|
+
applyServiceEnvDefaults(projectRoot, options);
|
|
42
|
+
options.applyEnvDefaults?.(projectRoot);
|
|
43
|
+
|
|
44
|
+
validateLogPersistPreloadEnv();
|
|
45
|
+
|
|
46
|
+
// TODO: Phase 5 — optional unhandledRejection / uncaughtException formatters
|
|
47
|
+
// (formerly watch-service preload-diagnostics.mjs)
|
|
48
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface ServicePreloadOptions {
|
|
2
|
+
/** `import.meta.url` from the service `scripts/preload.mjs`. */
|
|
3
|
+
callerImportMetaUrl: string;
|
|
4
|
+
/** package.json `name` — for resolveProjectRootByPackageName. */
|
|
5
|
+
packageName: string;
|
|
6
|
+
/** LOG_PERSIST_SERVICE default when persistence enabled. */
|
|
7
|
+
serviceValue: string;
|
|
8
|
+
/** Relative to project root; default `data/runtime`. */
|
|
9
|
+
runtimeDataDirRelative?: string;
|
|
10
|
+
/** Passed to loadEnvFiles `afterLoad`. */
|
|
11
|
+
afterLoadEnv?: () => void;
|
|
12
|
+
/** L3 hook after SDK defaults (legacy aliases, etc.). */
|
|
13
|
+
applyEnvDefaults?: (projectRoot: string) => void;
|
|
14
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type {
|
|
2
|
+
ManagedChildProcessesOptions,
|
|
3
|
+
SpawnChildResult,
|
|
4
|
+
StopAllChildrenOptions,
|
|
5
|
+
} from "./managed-child-processes";
|
|
6
|
+
export { ManagedChildProcesses } from "./managed-child-processes";
|
|
7
|
+
export type { BuildNodeImportArgsInput, SpawnTsxChildOptions } from "./process-spawn";
|
|
8
|
+
export { buildNodeImportArgs, isChildProcessRunning, spawnTsxChild } from "./process-spawn";
|