nvent 0.4.0 → 0.4.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/dist/module.mjs +59 -14
- package/dist/runtime/app/assets/vueflow.css +1 -0
- package/dist/runtime/app/plugins/vueflow.client.d.ts +0 -4
- package/dist/runtime/app/plugins/vueflow.client.js +0 -4
- package/dist/runtime/server/api/_flows/[name]/runs.get.js +2 -2
- package/dist/runtime/server/api/_flows/ws.js +9 -4
- package/dist/runtime/server/api/_queues/index.get.js +2 -2
- package/dist/runtime/server/api/_queues/ws.js +9 -4
- package/dist/runtime/server/plugins/00.event-store.js +1 -1
- package/dist/runtime/server/plugins/00.ws-lifecycle.js +10 -7
- package/dist/runtime/server/plugins/flow-management.js +2 -2
- package/dist/runtime/server/plugins/queue-management.js +4 -4
- package/dist/runtime/server/plugins/state-cleanup.js +3 -3
- package/dist/runtime/server/plugins/worker-management.js +1 -1
- package/dist/runtime/{server → server-utils}/events/adapters/redis/redisAdapter.js +2 -2
- package/dist/runtime/{server → server-utils}/events/adapters/redis/redisPubSubGateway.d.ts +1 -0
- package/dist/runtime/{server → server-utils}/events/adapters/redis/redisPubSubGateway.js +5 -5
- package/dist/runtime/{server → server-utils}/events/eventBus.d.ts +1 -1
- package/dist/runtime/{server → server-utils}/events/eventStoreFactory.js +2 -2
- package/dist/runtime/{server → server-utils}/events/types.d.ts +1 -1
- package/dist/runtime/{server → server-utils}/events/wiring/flowWiring.d.ts +1 -1
- package/dist/runtime/{server → server-utils}/events/wiring/flowWiring.js +5 -2
- package/dist/runtime/{server → server-utils}/queue/adapters/bullmq.d.ts +1 -0
- package/dist/runtime/{server → server-utils}/queue/adapters/bullmq.js +4 -4
- package/dist/runtime/{server → server-utils}/utils/useEventManager.d.ts +1 -1
- package/dist/runtime/{server → server-utils}/utils/useEventManager.js +2 -2
- package/dist/runtime/{server → server-utils}/utils/useEventStore.d.ts +1 -1
- package/dist/runtime/{server → server-utils}/utils/useEventStore.js +2 -2
- package/dist/runtime/{server → server-utils}/utils/useFlowEngine.js +2 -2
- package/dist/runtime/{server/utils/useServerLogger.d.ts → server-utils/utils/useNventLogger.d.ts} +4 -4
- package/dist/runtime/{server/utils/useServerLogger.js → server-utils/utils/useNventLogger.js} +1 -1
- package/dist/runtime/server-utils/utils/wsPeerManager.d.ts +44 -0
- package/dist/runtime/server-utils/utils/wsPeerManager.js +32 -0
- package/dist/runtime/{server → server-utils}/worker/adapter.js +3 -2
- package/dist/runtime/{server → server-utils}/worker/runner/node.js +4 -4
- package/package.json +1 -1
- package/dist/runtime/server/utils/wsPeerManager.d.ts +0 -34
- package/dist/runtime/server/utils/wsPeerManager.js +0 -23
- /package/dist/runtime/{server → server-utils}/events/adapters/fileAdapter.d.ts +0 -0
- /package/dist/runtime/{server → server-utils}/events/adapters/fileAdapter.js +0 -0
- /package/dist/runtime/{server → server-utils}/events/adapters/memoryAdapter.d.ts +0 -0
- /package/dist/runtime/{server → server-utils}/events/adapters/memoryAdapter.js +0 -0
- /package/dist/runtime/{server → server-utils}/events/adapters/redis/redisAdapter.d.ts +0 -0
- /package/dist/runtime/{server → server-utils}/events/eventBus.js +0 -0
- /package/dist/runtime/{server → server-utils}/events/eventStoreFactory.d.ts +0 -0
- /package/dist/runtime/{server → server-utils}/events/streamNames.d.ts +0 -0
- /package/dist/runtime/{server → server-utils}/events/streamNames.js +0 -0
- /package/dist/runtime/{server → server-utils}/events/types.js +0 -0
- /package/dist/runtime/{server → server-utils}/events/wiring/registry.d.ts +0 -0
- /package/dist/runtime/{server → server-utils}/events/wiring/registry.js +0 -0
- /package/dist/runtime/{server → server-utils}/queue/queueFactory.d.ts +0 -0
- /package/dist/runtime/{server → server-utils}/queue/queueFactory.js +0 -0
- /package/dist/runtime/{server → server-utils}/queue/types.d.ts +0 -0
- /package/dist/runtime/{server → server-utils}/queue/types.js +0 -0
- /package/dist/runtime/{server → server-utils}/state/adapters/redis.d.ts +0 -0
- /package/dist/runtime/{server → server-utils}/state/adapters/redis.js +0 -0
- /package/dist/runtime/{server → server-utils}/state/stateFactory.d.ts +0 -0
- /package/dist/runtime/{server → server-utils}/state/stateFactory.js +0 -0
- /package/dist/runtime/{server → server-utils}/state/types.d.ts +0 -0
- /package/dist/runtime/{server → server-utils}/state/types.js +0 -0
- /package/dist/runtime/{server → server-utils}/utils/defineQueueConfig.d.ts +0 -0
- /package/dist/runtime/{server → server-utils}/utils/defineQueueConfig.js +0 -0
- /package/dist/runtime/{server → server-utils}/utils/defineQueueWorker.d.ts +0 -0
- /package/dist/runtime/{server → server-utils}/utils/defineQueueWorker.js +0 -0
- /package/dist/runtime/{server → server-utils}/utils/useFlowEngine.d.ts +0 -0
- /package/dist/runtime/{server → server-utils}/utils/useLogs.d.ts +0 -0
- /package/dist/runtime/{server → server-utils}/utils/useLogs.js +0 -0
- /package/dist/runtime/{server → server-utils}/utils/useQueue.d.ts +0 -0
- /package/dist/runtime/{server → server-utils}/utils/useQueue.js +0 -0
- /package/dist/runtime/{server → server-utils}/worker/adapter.d.ts +0 -0
- /package/dist/runtime/{server → server-utils}/worker/runner/node.d.ts +0 -0
package/dist/module.mjs
CHANGED
|
@@ -837,8 +837,10 @@ const module = defineNuxtModule({
|
|
|
837
837
|
addImportsDir(resolve("./runtime/shared/utils"));
|
|
838
838
|
addImportsDir(resolve("./runtime/app/composables"));
|
|
839
839
|
if (config.ui) {
|
|
840
|
+
nuxt.options.css = nuxt.options.css || [];
|
|
841
|
+
nuxt.options.css.push(resolve("./runtime/app/assets/vueflow.css"));
|
|
840
842
|
addPlugin({
|
|
841
|
-
src: resolve("./runtime/app/plugins/vueflow.client
|
|
843
|
+
src: resolve("./runtime/app/plugins/vueflow.client"),
|
|
842
844
|
mode: "client"
|
|
843
845
|
});
|
|
844
846
|
addComponentsDir({
|
|
@@ -917,19 +919,62 @@ const module = defineNuxtModule({
|
|
|
917
919
|
write: true,
|
|
918
920
|
getContents: () => generateAnalyzedFlowsTemplate(lastCompiledRegistry)
|
|
919
921
|
});
|
|
920
|
-
addServerImports([
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
922
|
+
addServerImports([
|
|
923
|
+
// Generated templates
|
|
924
|
+
{
|
|
925
|
+
name: "useQueueRegistry",
|
|
926
|
+
as: "$useQueueRegistry",
|
|
927
|
+
from: resolve(nuxt.options.buildDir, "queue-registry")
|
|
928
|
+
},
|
|
929
|
+
{
|
|
930
|
+
name: "useWorkerHandlers",
|
|
931
|
+
as: "$useWorkerHandlers",
|
|
932
|
+
from: resolve(nuxt.options.buildDir, "worker-handlers")
|
|
933
|
+
},
|
|
934
|
+
{
|
|
935
|
+
name: "useAnalyzedFlows",
|
|
936
|
+
as: "$useAnalyzedFlows",
|
|
937
|
+
from: resolve(nuxt.options.buildDir, "analyzed-flows")
|
|
938
|
+
},
|
|
939
|
+
// Core utilities for user code (moved to server-utils to avoid bundling issues)
|
|
940
|
+
{
|
|
941
|
+
name: "defineQueueConfig",
|
|
942
|
+
from: resolve("./runtime/server-utils/utils/defineQueueConfig")
|
|
943
|
+
},
|
|
944
|
+
{
|
|
945
|
+
name: "defineQueueWorker",
|
|
946
|
+
from: resolve("./runtime/server-utils/utils/defineQueueWorker")
|
|
947
|
+
},
|
|
948
|
+
// Composables users may need in server code
|
|
949
|
+
{
|
|
950
|
+
name: "useQueue",
|
|
951
|
+
from: resolve("./runtime/server-utils/utils/useQueue")
|
|
952
|
+
},
|
|
953
|
+
{
|
|
954
|
+
name: "useFlowEngine",
|
|
955
|
+
from: resolve("./runtime/server-utils/utils/useFlowEngine")
|
|
956
|
+
},
|
|
957
|
+
{
|
|
958
|
+
name: "useEventStore",
|
|
959
|
+
from: resolve("./runtime/server-utils/utils/useEventStore")
|
|
960
|
+
},
|
|
961
|
+
{
|
|
962
|
+
name: "useLogs",
|
|
963
|
+
from: resolve("./runtime/server-utils/utils/useLogs")
|
|
964
|
+
},
|
|
965
|
+
{
|
|
966
|
+
name: "useEventManager",
|
|
967
|
+
from: resolve("./runtime/server-utils/utils/useEventManager")
|
|
968
|
+
},
|
|
969
|
+
{
|
|
970
|
+
name: "usePeerManager",
|
|
971
|
+
from: resolve("./runtime/server-utils/utils/wsPeerManager")
|
|
972
|
+
},
|
|
973
|
+
{
|
|
974
|
+
name: "useNventLogger",
|
|
975
|
+
from: resolve("./runtime/server-utils/utils/useNventLogger")
|
|
976
|
+
}
|
|
977
|
+
]);
|
|
933
978
|
const refreshRegistry = async (reason, changedPath) => {
|
|
934
979
|
const queuesRel = config.dir || "queues";
|
|
935
980
|
const updatedRegistry = await compileRegistryFromServerWorkers(layerInfos, queuesRel, defaultConfigs);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@import "@vue-flow/core/dist/style.css";@import "@vue-flow/core/dist/theme-default.css";@import "@vue-flow/controls/dist/style.css";@import "@vue-flow/minimap/dist/style.css";
|
|
@@ -1,6 +1,2 @@
|
|
|
1
|
-
import '@vue-flow/core/dist/style.css';
|
|
2
|
-
import '@vue-flow/core/dist/theme-default.css';
|
|
3
|
-
import '@vue-flow/controls/dist/style.css';
|
|
4
|
-
import '@vue-flow/minimap/dist/style.css';
|
|
5
1
|
declare const _default: import("#app").Plugin<Record<string, unknown>> & import("#app").ObjectPlugin<Record<string, unknown>>;
|
|
6
2
|
export default _default;
|
|
@@ -3,10 +3,6 @@ import { VueFlow } from "@vue-flow/core";
|
|
|
3
3
|
import { Controls } from "@vue-flow/controls";
|
|
4
4
|
import { MiniMap } from "@vue-flow/minimap";
|
|
5
5
|
import { Background } from "@vue-flow/background";
|
|
6
|
-
import "@vue-flow/core/dist/style.css";
|
|
7
|
-
import "@vue-flow/core/dist/theme-default.css";
|
|
8
|
-
import "@vue-flow/controls/dist/style.css";
|
|
9
|
-
import "@vue-flow/minimap/dist/style.css";
|
|
10
6
|
export default defineNuxtPlugin((nuxtApp) => {
|
|
11
7
|
nuxtApp.vueApp.component("VueFlow", VueFlow);
|
|
12
8
|
nuxtApp.vueApp.component("Controls", Controls);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { defineEventHandler, getRouterParam, getQuery, useEventStore,
|
|
2
|
-
const logger = useServerLogger("api-flows-runs");
|
|
1
|
+
import { defineEventHandler, getRouterParam, getQuery, useEventStore, useNventLogger } from "#imports";
|
|
3
2
|
export default defineEventHandler(async (event) => {
|
|
3
|
+
const logger = useNventLogger("api-flows-runs");
|
|
4
4
|
const flowName = getRouterParam(event, "name");
|
|
5
5
|
const query = getQuery(event);
|
|
6
6
|
const limit = Math.min(Number.parseInt(query.limit) || 50, 100);
|
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
defineWebSocketHandler,
|
|
3
3
|
useEventStore,
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
useServerLogger
|
|
4
|
+
usePeerManager,
|
|
5
|
+
useNventLogger
|
|
7
6
|
} from "#imports";
|
|
8
|
-
const logger = useServerLogger("api-flows-ws");
|
|
9
7
|
const peerContexts = /* @__PURE__ */ new WeakMap();
|
|
10
8
|
function safeSend(peer, data) {
|
|
11
9
|
try {
|
|
@@ -17,7 +15,9 @@ function safeSend(peer, data) {
|
|
|
17
15
|
}
|
|
18
16
|
export default defineWebSocketHandler({
|
|
19
17
|
open(peer) {
|
|
18
|
+
const logger = useNventLogger("api-flows-ws");
|
|
20
19
|
logger.info("[ws] client connected:", { peerId: peer.id });
|
|
20
|
+
const { registerWsPeer } = usePeerManager();
|
|
21
21
|
registerWsPeer(peer);
|
|
22
22
|
peerContexts.set(peer, {
|
|
23
23
|
subscriptions: /* @__PURE__ */ new Map()
|
|
@@ -28,6 +28,7 @@ export default defineWebSocketHandler({
|
|
|
28
28
|
});
|
|
29
29
|
},
|
|
30
30
|
async message(peer, message) {
|
|
31
|
+
const logger = useNventLogger("api-flows-ws");
|
|
31
32
|
const context = peerContexts.get(peer);
|
|
32
33
|
if (!context) {
|
|
33
34
|
logger.error("[ws] no context for peer:", { peerId: peer.id });
|
|
@@ -144,10 +145,12 @@ export default defineWebSocketHandler({
|
|
|
144
145
|
}
|
|
145
146
|
},
|
|
146
147
|
close(peer, event) {
|
|
148
|
+
const logger = useNventLogger("api-flows-ws");
|
|
147
149
|
const isNormalClosure = event?.code === 1e3 || event?.code === 1001;
|
|
148
150
|
if (!isNormalClosure) {
|
|
149
151
|
logger.info("[ws] client disconnected:", { peerId: peer.id, code: event?.code, reason: event?.reason });
|
|
150
152
|
}
|
|
153
|
+
const { unregisterWsPeer } = usePeerManager();
|
|
151
154
|
unregisterWsPeer(peer);
|
|
152
155
|
const context = peerContexts.get(peer);
|
|
153
156
|
if (context) {
|
|
@@ -165,7 +168,9 @@ export default defineWebSocketHandler({
|
|
|
165
168
|
}
|
|
166
169
|
},
|
|
167
170
|
error(peer, error) {
|
|
171
|
+
const logger = useNventLogger("api-flows-ws");
|
|
168
172
|
logger.error("[ws] error for peer:", { peerId: peer.id, error });
|
|
173
|
+
const { unregisterWsPeer } = usePeerManager();
|
|
169
174
|
unregisterWsPeer(peer);
|
|
170
175
|
const context = peerContexts.get(peer);
|
|
171
176
|
if (context) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { defineEventHandler, useRuntimeConfig, $useQueueRegistry, useQueue,
|
|
2
|
-
const logger = useServerLogger("api-queues-index");
|
|
1
|
+
import { defineEventHandler, useRuntimeConfig, $useQueueRegistry, useQueue, useNventLogger } from "#imports";
|
|
3
2
|
export default defineEventHandler(async () => {
|
|
4
3
|
const rc = useRuntimeConfig();
|
|
4
|
+
const logger = useNventLogger("api-queues-index");
|
|
5
5
|
const cfgQueues = rc?.queue?.queues || {};
|
|
6
6
|
const registry = $useQueueRegistry();
|
|
7
7
|
const queue = useQueue();
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
defineWebSocketHandler,
|
|
3
3
|
useQueue,
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
useServerLogger
|
|
4
|
+
usePeerManager,
|
|
5
|
+
useNventLogger
|
|
7
6
|
} from "#imports";
|
|
8
7
|
const peerContexts = /* @__PURE__ */ new WeakMap();
|
|
9
|
-
const logger = useServerLogger("api-queues-ws");
|
|
10
8
|
function safeSend(peer, data) {
|
|
11
9
|
try {
|
|
12
10
|
peer.send(JSON.stringify(data));
|
|
@@ -17,7 +15,9 @@ function safeSend(peer, data) {
|
|
|
17
15
|
}
|
|
18
16
|
export default defineWebSocketHandler({
|
|
19
17
|
open(peer) {
|
|
18
|
+
const logger = useNventLogger("api-queues-ws");
|
|
20
19
|
logger.info("[ws:queues] client connected:", peer.id);
|
|
20
|
+
const { registerWsPeer } = usePeerManager();
|
|
21
21
|
registerWsPeer(peer);
|
|
22
22
|
peerContexts.set(peer, {
|
|
23
23
|
subscriptions: /* @__PURE__ */ new Map()
|
|
@@ -28,6 +28,7 @@ export default defineWebSocketHandler({
|
|
|
28
28
|
});
|
|
29
29
|
},
|
|
30
30
|
async message(peer, message) {
|
|
31
|
+
const logger = useNventLogger("api-queues-ws");
|
|
31
32
|
const context = peerContexts.get(peer);
|
|
32
33
|
if (!context) {
|
|
33
34
|
logger.error("[ws:queues] no context for peer:", peer.id);
|
|
@@ -154,6 +155,7 @@ export default defineWebSocketHandler({
|
|
|
154
155
|
}
|
|
155
156
|
},
|
|
156
157
|
close(peer, event) {
|
|
158
|
+
const logger = useNventLogger("api-queues-ws");
|
|
157
159
|
const isNormalClosure = event?.code === 1e3 || event?.code === 1001;
|
|
158
160
|
if (!isNormalClosure) {
|
|
159
161
|
logger.info("[ws:queues] client disconnected:", {
|
|
@@ -162,6 +164,7 @@ export default defineWebSocketHandler({
|
|
|
162
164
|
reason: event?.reason
|
|
163
165
|
});
|
|
164
166
|
}
|
|
167
|
+
const { unregisterWsPeer } = usePeerManager();
|
|
165
168
|
unregisterWsPeer(peer);
|
|
166
169
|
const context = peerContexts.get(peer);
|
|
167
170
|
if (context) {
|
|
@@ -179,10 +182,12 @@ export default defineWebSocketHandler({
|
|
|
179
182
|
}
|
|
180
183
|
},
|
|
181
184
|
error(peer, error) {
|
|
185
|
+
const logger = useNventLogger("api-queues-ws");
|
|
182
186
|
logger.error("[ws:queues] error for peer:", {
|
|
183
187
|
peerId: peer.id,
|
|
184
188
|
error
|
|
185
189
|
});
|
|
190
|
+
const { unregisterWsPeer } = usePeerManager();
|
|
186
191
|
unregisterWsPeer(peer);
|
|
187
192
|
const context = peerContexts.get(peer);
|
|
188
193
|
if (context) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defineNitroPlugin } from "#imports";
|
|
2
|
-
import { getEventStoreFactory } from "
|
|
2
|
+
import { getEventStoreFactory } from "../../server-utils/events/eventStoreFactory.js";
|
|
3
3
|
export default defineNitroPlugin(() => {
|
|
4
4
|
const factory = getEventStoreFactory();
|
|
5
5
|
factory.start();
|
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
import {
|
|
2
2
|
defineNitroPlugin,
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
setShuttingDown,
|
|
6
|
-
clearAllPeers,
|
|
7
|
-
isServerShuttingDown,
|
|
8
|
-
useServerLogger
|
|
3
|
+
useNventLogger,
|
|
4
|
+
usePeerManager
|
|
9
5
|
} from "#imports";
|
|
10
|
-
const logger = useServerLogger("plugin-ws-lifecycle");
|
|
11
6
|
export default defineNitroPlugin((nitroApp) => {
|
|
7
|
+
const logger = useNventLogger("plugin-ws-lifecycle");
|
|
12
8
|
logger.info("[ws-lifecycle] WebSocket lifecycle plugin initialized");
|
|
9
|
+
const {
|
|
10
|
+
getActivePeers,
|
|
11
|
+
isServerShuttingDown,
|
|
12
|
+
setShuttingDown,
|
|
13
|
+
clearAllPeers,
|
|
14
|
+
getActivePeerCount
|
|
15
|
+
} = usePeerManager();
|
|
13
16
|
const originalUnhandledRejection = process.listeners("unhandledRejection");
|
|
14
17
|
nitroApp.hooks.hook("close", async () => {
|
|
15
18
|
setShuttingDown(true);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { defineNitroPlugin, useEventManager, $useQueueRegistry, useQueue,
|
|
2
|
-
const logger = useServerLogger("plugin-flow-management");
|
|
1
|
+
import { defineNitroPlugin, useEventManager, $useQueueRegistry, useQueue, useNventLogger } from "#imports";
|
|
3
2
|
export default defineNitroPlugin((nitro) => {
|
|
3
|
+
const logger = useNventLogger("plugin-flow-management");
|
|
4
4
|
const { onType, publishBus } = useEventManager();
|
|
5
5
|
const registry = $useQueueRegistry();
|
|
6
6
|
const flowIdToName = /* @__PURE__ */ new Map();
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { defineNitroPlugin,
|
|
2
|
-
import { BullMQProvider } from "
|
|
3
|
-
import { setQueueProvider, getQueueProvider } from "
|
|
4
|
-
const logger = useServerLogger("plugin-queue-management");
|
|
1
|
+
import { defineNitroPlugin, useNventLogger } from "#imports";
|
|
2
|
+
import { BullMQProvider } from "../../server-utils/queue/adapters/bullmq.js";
|
|
3
|
+
import { setQueueProvider, getQueueProvider } from "../../server-utils/queue/queueFactory.js";
|
|
5
4
|
export default defineNitroPlugin(async (nitroApp) => {
|
|
5
|
+
const logger = useNventLogger("plugin-queue-management");
|
|
6
6
|
try {
|
|
7
7
|
const existingProvider = getQueueProvider();
|
|
8
8
|
if (existingProvider) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { getStateProvider } from "
|
|
3
|
-
const logger = useServerLogger("plugin-state-cleanup");
|
|
1
|
+
import { useNventLogger, defineNitroPlugin, useEventManager, useRuntimeConfig } from "#imports";
|
|
2
|
+
import { getStateProvider } from "../../server-utils/state/stateFactory.js";
|
|
4
3
|
export default defineNitroPlugin(() => {
|
|
4
|
+
const logger = useNventLogger("plugin-state-cleanup");
|
|
5
5
|
const rc = useRuntimeConfig();
|
|
6
6
|
const cleanup = rc?.queue?.state?.cleanup || { strategy: "never" };
|
|
7
7
|
if (cleanup.strategy === "never" || cleanup.strategy === "ttl") {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defineNitroPlugin, $useWorkerHandlers, $useQueueRegistry } from "#imports";
|
|
2
|
-
import { registerTsWorker, closeAllWorkers } from "
|
|
2
|
+
import { registerTsWorker, closeAllWorkers } from "../../server-utils/worker/adapter.js";
|
|
3
3
|
export default defineNitroPlugin(async (nitroApp) => {
|
|
4
4
|
nitroApp.hooks.hook("close", async () => {
|
|
5
5
|
await closeAllWorkers();
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { useRuntimeConfig,
|
|
1
|
+
import { useRuntimeConfig, useNventLogger } from "#imports";
|
|
2
2
|
import IORedis from "ioredis";
|
|
3
3
|
import { RedisPubSubGateway } from "./redisPubSubGateway.js";
|
|
4
|
-
const logger = useServerLogger("redis-adapter");
|
|
5
4
|
function nowIso() {
|
|
6
5
|
return (/* @__PURE__ */ new Date()).toISOString();
|
|
7
6
|
}
|
|
8
7
|
export function createRedisAdapter() {
|
|
9
8
|
const rc = useRuntimeConfig();
|
|
9
|
+
const logger = useNventLogger("redis-adapter");
|
|
10
10
|
const conn = rc?.queue?.eventStore?.redis || {};
|
|
11
11
|
const rsOpts = rc?.queue?.eventStore?.options?.redisStreams || {};
|
|
12
12
|
const redis = new IORedis({
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
const logger = useServerLogger("redis-adapter");
|
|
1
|
+
import { useNventLogger } from "#imports";
|
|
3
2
|
export class RedisPubSubGateway {
|
|
4
3
|
constructor(subscriber) {
|
|
5
4
|
this.subscriber = subscriber;
|
|
6
5
|
}
|
|
7
6
|
channelSubscribers = /* @__PURE__ */ new Map();
|
|
8
7
|
initialized = false;
|
|
8
|
+
logger = useNventLogger("redis-pubsub-gateway");
|
|
9
9
|
initialize() {
|
|
10
10
|
if (this.initialized) return;
|
|
11
11
|
this.initialized = true;
|
|
@@ -17,7 +17,7 @@ export class RedisPubSubGateway {
|
|
|
17
17
|
handler(messageId);
|
|
18
18
|
} catch (err) {
|
|
19
19
|
if (process.env.NQ_DEBUG_EVENTS === "1") {
|
|
20
|
-
logger.error("[redis-pubsub-gateway] Handler error:", err);
|
|
20
|
+
this.logger.error("[redis-pubsub-gateway] Handler error:", err);
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
23
|
}
|
|
@@ -33,7 +33,7 @@ export class RedisPubSubGateway {
|
|
|
33
33
|
this.channelSubscribers.set(channel, /* @__PURE__ */ new Set());
|
|
34
34
|
await this.subscriber.subscribe(channel);
|
|
35
35
|
if (process.env.NQ_DEBUG_EVENTS === "1") {
|
|
36
|
-
logger.info("[redis-pubsub-gateway] Subscribed to channel:", channel);
|
|
36
|
+
this.logger.info("[redis-pubsub-gateway] Subscribed to channel:", channel);
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
39
|
this.channelSubscribers.get(channel).add(handler);
|
|
@@ -46,7 +46,7 @@ export class RedisPubSubGateway {
|
|
|
46
46
|
this.subscriber.unsubscribe(channel).catch(() => {
|
|
47
47
|
});
|
|
48
48
|
if (process.env.NQ_DEBUG_EVENTS === "1") {
|
|
49
|
-
logger.info("[redis-pubsub-gateway] Unsubscribed from channel:", channel);
|
|
49
|
+
this.logger.info("[redis-pubsub-gateway] Unsubscribed from channel:", channel);
|
|
50
50
|
}
|
|
51
51
|
}
|
|
52
52
|
}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { useRuntimeConfig,
|
|
1
|
+
import { useRuntimeConfig, useNventLogger } from "#imports";
|
|
2
2
|
import { getStreamNames } from "./streamNames.js";
|
|
3
3
|
import { createRedisAdapter } from "./adapters/redis/redisAdapter.js";
|
|
4
4
|
import { createMemoryAdapter } from "./adapters/memoryAdapter.js";
|
|
5
5
|
import { createFileAdapter } from "./adapters/fileAdapter.js";
|
|
6
6
|
import { createWiringRegistry } from "./wiring/registry.js";
|
|
7
|
-
const logger = useServerLogger("event-store-factory");
|
|
8
7
|
let cachedFactory = null;
|
|
9
8
|
export function getEventStoreFactory() {
|
|
10
9
|
if (cachedFactory) return cachedFactory;
|
|
10
|
+
const logger = useNventLogger("event-store-factory");
|
|
11
11
|
const rc = useRuntimeConfig();
|
|
12
12
|
const adapter = rc?.queue?.eventStore?.adapter || "memory";
|
|
13
13
|
let adapterInstance;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { getEventBus } from "../eventBus.js";
|
|
2
|
-
import {
|
|
3
|
-
const logger = useServerLogger("flow-wiring");
|
|
2
|
+
import { useEventStore, $useAnalyzedFlows, $useQueueRegistry, useQueue, useNventLogger } from "#imports";
|
|
4
3
|
export function checkPendingStepTriggers(step, emittedEvents, completedSteps) {
|
|
5
4
|
if (!step.subscribes || step.subscribes.length === 0) {
|
|
6
5
|
return true;
|
|
@@ -15,6 +14,7 @@ export function checkPendingStepTriggers(step, emittedEvents, completedSteps) {
|
|
|
15
14
|
});
|
|
16
15
|
}
|
|
17
16
|
async function checkAndTriggerPendingSteps(flowName, runId, store) {
|
|
17
|
+
const logger = useNventLogger("flow-wiring");
|
|
18
18
|
try {
|
|
19
19
|
const analyzedFlows = $useAnalyzedFlows();
|
|
20
20
|
const registry = $useQueueRegistry();
|
|
@@ -177,6 +177,7 @@ export function createFlowWiring(deps) {
|
|
|
177
177
|
const unsubs = [];
|
|
178
178
|
let wired = false;
|
|
179
179
|
const indexFlowRun = async (flowName, flowId, timestamp, metadata) => {
|
|
180
|
+
const logger = useNventLogger("flow-wiring");
|
|
180
181
|
try {
|
|
181
182
|
const store = useEventStore();
|
|
182
183
|
const names = store.names();
|
|
@@ -190,6 +191,7 @@ export function createFlowWiring(deps) {
|
|
|
190
191
|
function start() {
|
|
191
192
|
if (wired) return;
|
|
192
193
|
wired = true;
|
|
194
|
+
const logger = useNventLogger("flow-wiring");
|
|
193
195
|
const store = useEventStore();
|
|
194
196
|
const names = store.names();
|
|
195
197
|
const handlePersistence = async (e) => {
|
|
@@ -393,6 +395,7 @@ export function createFlowWiring(deps) {
|
|
|
393
395
|
}
|
|
394
396
|
}
|
|
395
397
|
function stop() {
|
|
398
|
+
const logger = useNventLogger("flow-wiring");
|
|
396
399
|
for (const u of unsubs.splice(0)) {
|
|
397
400
|
try {
|
|
398
401
|
u();
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { QueueProvider, JobInput, Job, JobsQuery, ScheduleOptions, QueueEvent, JobCounts } from '../types.js';
|
|
2
2
|
export declare class BullMQProvider implements QueueProvider {
|
|
3
3
|
private queues;
|
|
4
|
+
private logger;
|
|
4
5
|
init(): Promise<void>;
|
|
5
6
|
private ensureQueue;
|
|
6
7
|
enqueue(queueName: string, job: JobInput): Promise<string>;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { Queue, QueueEvents } from "bullmq";
|
|
2
2
|
import defu from "defu";
|
|
3
|
-
import {
|
|
4
|
-
const logger = useServerLogger("bullmq-adapter");
|
|
3
|
+
import { useRuntimeConfig, $useQueueRegistry, useEventManager, useNventLogger } from "#imports";
|
|
5
4
|
export class BullMQProvider {
|
|
6
5
|
queues = /* @__PURE__ */ new Map();
|
|
6
|
+
logger = useNventLogger("bullmq-adapter");
|
|
7
7
|
async init() {
|
|
8
8
|
}
|
|
9
9
|
ensureQueue(name) {
|
|
@@ -132,14 +132,14 @@ export class BullMQProvider {
|
|
|
132
132
|
closePromises.push(
|
|
133
133
|
queue.close().catch((err) => {
|
|
134
134
|
if (err.code !== "EPIPE" && !err.message?.includes("Connection is closed")) {
|
|
135
|
-
logger.warn("Error closing queue", { queueName, error: err });
|
|
135
|
+
this.logger.warn("Error closing queue", { queueName, error: err });
|
|
136
136
|
}
|
|
137
137
|
})
|
|
138
138
|
);
|
|
139
139
|
closePromises.push(
|
|
140
140
|
events.close().catch((err) => {
|
|
141
141
|
if (err.code !== "EPIPE" && !err.message?.includes("Connection is closed")) {
|
|
142
|
-
logger.warn("Error closing events for queue", { queueName, error: err });
|
|
142
|
+
this.logger.warn("Error closing events for queue", { queueName, error: err });
|
|
143
143
|
}
|
|
144
144
|
})
|
|
145
145
|
);
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { getEventBus } from "../events/eventBus.js";
|
|
2
|
-
import {
|
|
3
|
-
const logger = useServerLogger("event-manager");
|
|
2
|
+
import { useNventLogger } from "#imports";
|
|
4
3
|
export function useEventManager() {
|
|
5
4
|
if (globalThis.__nq_event_manager) return globalThis.__nq_event_manager;
|
|
5
|
+
const logger = useNventLogger("event-manager");
|
|
6
6
|
const bus = getEventBus();
|
|
7
7
|
const publishBus = async (evt) => {
|
|
8
8
|
const rec = {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { EventReadOptions } from '../events/types.js';
|
|
2
|
-
import type { EventRecord } from '
|
|
2
|
+
import type { EventRecord } from '../types.js';
|
|
3
3
|
export declare function useEventStore(): {
|
|
4
4
|
names: () => import("../events/streamNames.js").StreamNames;
|
|
5
5
|
read: (stream: string, opts?: EventReadOptions) => Promise<EventRecord[]>;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { getEventStoreFactory } from "../events/eventStoreFactory.js";
|
|
2
|
-
import {
|
|
3
|
-
const logger = useServerLogger("event-store");
|
|
2
|
+
import { useNventLogger } from "#imports";
|
|
4
3
|
export function useEventStore() {
|
|
4
|
+
const logger = useNventLogger("event-store");
|
|
5
5
|
const factory = getEventStoreFactory();
|
|
6
6
|
async function read(stream, opts) {
|
|
7
7
|
return await factory.adapter.read(stream, opts);
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { $useQueueRegistry, useQueue, useEventManager,
|
|
1
|
+
import { $useQueueRegistry, useQueue, useEventManager, useNventLogger } from "#imports";
|
|
2
2
|
import { randomUUID } from "node:crypto";
|
|
3
|
-
const logger = useServerLogger("flow-engine");
|
|
4
3
|
export const useFlowEngine = () => {
|
|
5
4
|
const registry = $useQueueRegistry();
|
|
6
5
|
const queueAdapter = useQueue();
|
|
7
6
|
const eventsManager = useEventManager();
|
|
7
|
+
const logger = useNventLogger("flow-engine");
|
|
8
8
|
const startFlow = async (flowName, payload = {}) => {
|
|
9
9
|
const flow = registry?.flows?.[flowName];
|
|
10
10
|
if (!flow || !flow.entry) throw new Error("Flow not found");
|
package/dist/runtime/{server/utils/useServerLogger.d.ts → server-utils/utils/useNventLogger.d.ts}
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type ConsolaInstance } from 'consola';
|
|
2
2
|
export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
3
|
-
export interface
|
|
3
|
+
export interface NventLogger {
|
|
4
4
|
debug: (message: string, context?: any) => void;
|
|
5
5
|
info: (message: string, context?: any) => void;
|
|
6
6
|
warn: (message: string, context?: any) => void;
|
|
@@ -20,11 +20,11 @@ export interface ServerLogger {
|
|
|
20
20
|
* - NQ_DEBUG_<SCOPE>: environment variable for scope (e.g., NQ_DEBUG_FLOW_WIRING=1)
|
|
21
21
|
*
|
|
22
22
|
* @param scope - Logger scope/namespace (e.g., 'flow-wiring', 'event-manager')
|
|
23
|
-
* @returns
|
|
23
|
+
* @returns NventLogger instance with scoped logging methods
|
|
24
24
|
*
|
|
25
25
|
* @example
|
|
26
26
|
* ```ts
|
|
27
|
-
* const logger =
|
|
27
|
+
* const logger = useNventLogger('flow-wiring')
|
|
28
28
|
* logger.debug('Step triggered', { stepName: 'process', runId: '123' })
|
|
29
29
|
* logger.info('Flow completed', { flowName: 'example' })
|
|
30
30
|
* logger.warn('Retry attempt', { attempt: 3 })
|
|
@@ -35,7 +35,7 @@ export interface ServerLogger {
|
|
|
35
35
|
* logger.consola.box('🚀 Flow Started')
|
|
36
36
|
* ```
|
|
37
37
|
*/
|
|
38
|
-
export declare function
|
|
38
|
+
export declare function useNventLogger(scope: string): NventLogger;
|
|
39
39
|
/**
|
|
40
40
|
* Type guard to check if debug logging is enabled for any scope
|
|
41
41
|
*/
|
package/dist/runtime/{server/utils/useServerLogger.js → server-utils/utils/useNventLogger.js}
RENAMED
|
@@ -7,7 +7,7 @@ const LOG_LEVELS = {
|
|
|
7
7
|
error: 3
|
|
8
8
|
};
|
|
9
9
|
const loggerCache = /* @__PURE__ */ new Map();
|
|
10
|
-
export function
|
|
10
|
+
export function useNventLogger(scope) {
|
|
11
11
|
const rc = useRuntimeConfig();
|
|
12
12
|
const debugConfig = rc?.queue?.debug;
|
|
13
13
|
const configLevel = debugConfig?.level || process.env.NQ_DEBUG_LEVEL || "info";
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocket Peer Manager
|
|
3
|
+
*
|
|
4
|
+
* Tracks active WebSocket connections for graceful shutdown during HMR.
|
|
5
|
+
* Auto-imported in Nitro server context.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Register a peer to be tracked for graceful shutdown
|
|
9
|
+
*/
|
|
10
|
+
declare function registerWsPeer(peer: any): void;
|
|
11
|
+
/**
|
|
12
|
+
* Unregister a peer (called when connection closes normally)
|
|
13
|
+
*/
|
|
14
|
+
declare function unregisterWsPeer(peer: any): void;
|
|
15
|
+
/**
|
|
16
|
+
* Get all currently active WebSocket peers
|
|
17
|
+
*/
|
|
18
|
+
declare function getActivePeers(): any[];
|
|
19
|
+
/**
|
|
20
|
+
* Check if server is currently shutting down
|
|
21
|
+
*/
|
|
22
|
+
declare function isServerShuttingDown(): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Set the shutdown state
|
|
25
|
+
*/
|
|
26
|
+
declare function setShuttingDown(state: boolean): void;
|
|
27
|
+
/**
|
|
28
|
+
* Clear all tracked peers
|
|
29
|
+
*/
|
|
30
|
+
declare function clearAllPeers(): void;
|
|
31
|
+
/**
|
|
32
|
+
* Get the count of active peers
|
|
33
|
+
*/
|
|
34
|
+
declare function getActivePeerCount(): number;
|
|
35
|
+
export declare const usePeerManager: () => {
|
|
36
|
+
registerWsPeer: typeof registerWsPeer;
|
|
37
|
+
unregisterWsPeer: typeof unregisterWsPeer;
|
|
38
|
+
getActivePeers: typeof getActivePeers;
|
|
39
|
+
isServerShuttingDown: typeof isServerShuttingDown;
|
|
40
|
+
setShuttingDown: typeof setShuttingDown;
|
|
41
|
+
clearAllPeers: typeof clearAllPeers;
|
|
42
|
+
getActivePeerCount: typeof getActivePeerCount;
|
|
43
|
+
};
|
|
44
|
+
export {};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
const activePeers = /* @__PURE__ */ new Set();
|
|
2
|
+
let isShuttingDown = false;
|
|
3
|
+
function registerWsPeer(peer) {
|
|
4
|
+
activePeers.add(peer);
|
|
5
|
+
}
|
|
6
|
+
function unregisterWsPeer(peer) {
|
|
7
|
+
activePeers.delete(peer);
|
|
8
|
+
}
|
|
9
|
+
function getActivePeers() {
|
|
10
|
+
return Array.from(activePeers);
|
|
11
|
+
}
|
|
12
|
+
function isServerShuttingDown() {
|
|
13
|
+
return isShuttingDown;
|
|
14
|
+
}
|
|
15
|
+
function setShuttingDown(state) {
|
|
16
|
+
isShuttingDown = state;
|
|
17
|
+
}
|
|
18
|
+
function clearAllPeers() {
|
|
19
|
+
activePeers.clear();
|
|
20
|
+
}
|
|
21
|
+
function getActivePeerCount() {
|
|
22
|
+
return activePeers.size;
|
|
23
|
+
}
|
|
24
|
+
export const usePeerManager = () => ({
|
|
25
|
+
registerWsPeer,
|
|
26
|
+
unregisterWsPeer,
|
|
27
|
+
getActivePeers,
|
|
28
|
+
isServerShuttingDown,
|
|
29
|
+
setShuttingDown,
|
|
30
|
+
clearAllPeers,
|
|
31
|
+
getActivePeerCount
|
|
32
|
+
});
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { Worker } from "bullmq";
|
|
2
2
|
import { createBullMQProcessor } from "./runner/node.js";
|
|
3
|
-
import { useRuntimeConfig,
|
|
3
|
+
import { useRuntimeConfig, useNventLogger } from "#imports";
|
|
4
4
|
const registeredWorkers = /* @__PURE__ */ new Map();
|
|
5
|
-
const logger = useServerLogger("worker-adapter");
|
|
6
5
|
export async function closeAllWorkers() {
|
|
6
|
+
const logger = useNventLogger("worker-adapter");
|
|
7
7
|
const closePromises = [];
|
|
8
8
|
for (const [queueName, info] of registeredWorkers.entries()) {
|
|
9
9
|
closePromises.push(
|
|
@@ -20,6 +20,7 @@ export async function closeAllWorkers() {
|
|
|
20
20
|
}
|
|
21
21
|
export async function registerTsWorker(queueName, jobName, handler, opts) {
|
|
22
22
|
let info = registeredWorkers.get(queueName);
|
|
23
|
+
const logger = useNventLogger("worker-adapter");
|
|
23
24
|
if (info) {
|
|
24
25
|
logger.info(`[registerTsWorker] Adding handler for job "${jobName}" to existing worker for queue "${queueName}"`);
|
|
25
26
|
info.handlers.set(jobName, handler);
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { randomUUID } from "node:crypto";
|
|
2
2
|
import { getStateProvider } from "../../state/stateFactory.js";
|
|
3
|
-
import { useRuntimeConfig, useLogs, useFlowEngine, useEventManager,
|
|
4
|
-
const logger = useServerLogger("node-runner");
|
|
3
|
+
import { useRuntimeConfig, useLogs, useFlowEngine, useEventManager, useNventLogger } from "#imports";
|
|
5
4
|
const defaultState = {
|
|
6
5
|
async get() {
|
|
7
6
|
return null;
|
|
@@ -37,7 +36,7 @@ export function buildContext(partial) {
|
|
|
37
36
|
return defaultState;
|
|
38
37
|
}
|
|
39
38
|
})();
|
|
40
|
-
const
|
|
39
|
+
const logger = partial?.logger || (() => {
|
|
41
40
|
const logs = useLogs();
|
|
42
41
|
return {
|
|
43
42
|
log: (level, msg, meta) => {
|
|
@@ -66,12 +65,13 @@ export function buildContext(partial) {
|
|
|
66
65
|
stepName: partial?.stepName,
|
|
67
66
|
stepId: partial?.stepId,
|
|
68
67
|
attempt: partial?.attempt,
|
|
69
|
-
logger
|
|
68
|
+
logger,
|
|
70
69
|
state,
|
|
71
70
|
flow
|
|
72
71
|
};
|
|
73
72
|
}
|
|
74
73
|
export function createBullMQProcessor(handler, queueName) {
|
|
74
|
+
const logger = useNventLogger("node-runner");
|
|
75
75
|
return async function processor(job) {
|
|
76
76
|
if (job.data?.__scheduledFlowStart) {
|
|
77
77
|
const { __flowName, __flowInput } = job.data;
|
package/package.json
CHANGED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* WebSocket Peer Manager
|
|
3
|
-
*
|
|
4
|
-
* Tracks active WebSocket connections for graceful shutdown during HMR.
|
|
5
|
-
* Auto-imported in Nitro server context.
|
|
6
|
-
*/
|
|
7
|
-
/**
|
|
8
|
-
* Register a peer to be tracked for graceful shutdown
|
|
9
|
-
*/
|
|
10
|
-
export declare function registerWsPeer(peer: any): void;
|
|
11
|
-
/**
|
|
12
|
-
* Unregister a peer (called when connection closes normally)
|
|
13
|
-
*/
|
|
14
|
-
export declare function unregisterWsPeer(peer: any): void;
|
|
15
|
-
/**
|
|
16
|
-
* Get all currently active WebSocket peers
|
|
17
|
-
*/
|
|
18
|
-
export declare function getActivePeers(): any[];
|
|
19
|
-
/**
|
|
20
|
-
* Check if server is currently shutting down
|
|
21
|
-
*/
|
|
22
|
-
export declare function isServerShuttingDown(): boolean;
|
|
23
|
-
/**
|
|
24
|
-
* Set the shutdown state
|
|
25
|
-
*/
|
|
26
|
-
export declare function setShuttingDown(state: boolean): void;
|
|
27
|
-
/**
|
|
28
|
-
* Clear all tracked peers
|
|
29
|
-
*/
|
|
30
|
-
export declare function clearAllPeers(): void;
|
|
31
|
-
/**
|
|
32
|
-
* Get the count of active peers
|
|
33
|
-
*/
|
|
34
|
-
export declare function getActivePeerCount(): number;
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
const activePeers = /* @__PURE__ */ new Set();
|
|
2
|
-
let isShuttingDown = false;
|
|
3
|
-
export function registerWsPeer(peer) {
|
|
4
|
-
activePeers.add(peer);
|
|
5
|
-
}
|
|
6
|
-
export function unregisterWsPeer(peer) {
|
|
7
|
-
activePeers.delete(peer);
|
|
8
|
-
}
|
|
9
|
-
export function getActivePeers() {
|
|
10
|
-
return Array.from(activePeers);
|
|
11
|
-
}
|
|
12
|
-
export function isServerShuttingDown() {
|
|
13
|
-
return isShuttingDown;
|
|
14
|
-
}
|
|
15
|
-
export function setShuttingDown(state) {
|
|
16
|
-
isShuttingDown = state;
|
|
17
|
-
}
|
|
18
|
-
export function clearAllPeers() {
|
|
19
|
-
activePeers.clear();
|
|
20
|
-
}
|
|
21
|
-
export function getActivePeerCount() {
|
|
22
|
-
return activePeers.size;
|
|
23
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|