@qvac/sdk 0.1.0-dev.1760648187.328e967
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/LICENSE +202 -0
- package/README.md +301 -0
- package/dist/client/api/cancel.d.ts +25 -0
- package/dist/client/api/cancel.js +37 -0
- package/dist/client/api/completion-stream.d.ts +50 -0
- package/dist/client/api/completion-stream.js +103 -0
- package/dist/client/api/download-asset.d.ts +39 -0
- package/dist/client/api/download-asset.js +72 -0
- package/dist/client/api/embed.d.ts +11 -0
- package/dist/client/api/embed.js +24 -0
- package/dist/client/api/index.d.ts +13 -0
- package/dist/client/api/index.js +12 -0
- package/dist/client/api/load-model.d.ts +98 -0
- package/dist/client/api/load-model.js +154 -0
- package/dist/client/api/logging-stream.d.ts +21 -0
- package/dist/client/api/logging-stream.js +32 -0
- package/dist/client/api/ping.d.ts +11 -0
- package/dist/client/api/ping.js +18 -0
- package/dist/client/api/provide.d.ts +18 -0
- package/dist/client/api/provide.js +27 -0
- package/dist/client/api/rag.d.ts +42 -0
- package/dist/client/api/rag.js +97 -0
- package/dist/client/api/transcribe.d.ts +24 -0
- package/dist/client/api/transcribe.js +52 -0
- package/dist/client/api/translate.d.ts +47 -0
- package/dist/client/api/translate.js +114 -0
- package/dist/client/api/unload-model.d.ts +11 -0
- package/dist/client/api/unload-model.js +26 -0
- package/dist/client/index.d.ts +2 -0
- package/dist/client/index.js +1 -0
- package/dist/client/logging-stream-registry.d.ts +5 -0
- package/dist/client/logging-stream-registry.js +60 -0
- package/dist/client/rpc/bare-client.d.ts +112 -0
- package/dist/client/rpc/bare-client.js +82 -0
- package/dist/client/rpc/bare-rpc-client.d.ts +4 -0
- package/dist/client/rpc/bare-rpc-client.js +87 -0
- package/dist/client/rpc/expo-rpc-client.d.ts +3 -0
- package/dist/client/rpc/expo-rpc-client.js +57 -0
- package/dist/client/rpc/node-rpc-client.d.ts +9 -0
- package/dist/client/rpc/node-rpc-client.js +99 -0
- package/dist/client/rpc/rpc-client.d.ts +5 -0
- package/dist/client/rpc/rpc-client.js +91 -0
- package/dist/client/rpc/rpc-error.d.ts +19 -0
- package/dist/client/rpc/rpc-error.js +39 -0
- package/dist/constants/audio.d.ts +3 -0
- package/dist/constants/audio.js +17 -0
- package/dist/constants/index.d.ts +2 -0
- package/dist/constants/index.js +1 -0
- package/dist/examples/delegated-inference/consumer.d.ts +2 -0
- package/dist/examples/delegated-inference/consumer.js +56 -0
- package/dist/examples/delegated-inference/provider.d.ts +2 -0
- package/dist/examples/delegated-inference/provider.js +57 -0
- package/dist/examples/download-with-cancel.d.ts +2 -0
- package/dist/examples/download-with-cancel.js +46 -0
- package/dist/examples/embed-hyperdrive.d.ts +2 -0
- package/dist/examples/embed-hyperdrive.js +19 -0
- package/dist/examples/kv-cache-example.d.ts +2 -0
- package/dist/examples/kv-cache-example.js +74 -0
- package/dist/examples/llamacpp-file-logging.d.ts +2 -0
- package/dist/examples/llamacpp-file-logging.js +62 -0
- package/dist/examples/llamacpp-filesystem.d.ts +2 -0
- package/dist/examples/llamacpp-filesystem.js +40 -0
- package/dist/examples/llamacpp-http.d.ts +2 -0
- package/dist/examples/llamacpp-http.js +41 -0
- package/dist/examples/llamacpp-hyperdrive.d.ts +2 -0
- package/dist/examples/llamacpp-hyperdrive.js +39 -0
- package/dist/examples/llamacpp-multimodal.d.ts +2 -0
- package/dist/examples/llamacpp-multimodal.js +62 -0
- package/dist/examples/llamacpp-native-tools.d.ts +2 -0
- package/dist/examples/llamacpp-native-tools.js +64 -0
- package/dist/examples/llamacpp-tools-routing.d.ts +2 -0
- package/dist/examples/llamacpp-tools-routing.js +364 -0
- package/dist/examples/llamacpp-tools.d.ts +2 -0
- package/dist/examples/llamacpp-tools.js +81 -0
- package/dist/examples/multi-model-demo.d.ts +2 -0
- package/dist/examples/multi-model-demo.js +75 -0
- package/dist/examples/parallel-download.d.ts +2 -0
- package/dist/examples/parallel-download.js +21 -0
- package/dist/examples/rag/rag-chromadb.d.ts +2 -0
- package/dist/examples/rag/rag-chromadb.js +130 -0
- package/dist/examples/rag/rag-hyperdb-workspaces.d.ts +2 -0
- package/dist/examples/rag/rag-hyperdb-workspaces.js +106 -0
- package/dist/examples/rag/rag-hyperdb.d.ts +2 -0
- package/dist/examples/rag/rag-hyperdb.js +50 -0
- package/dist/examples/rag/rag-lancedb.d.ts +2 -0
- package/dist/examples/rag/rag-lancedb.js +95 -0
- package/dist/examples/rag/rag-sqlite.d.ts +2 -0
- package/dist/examples/rag/rag-sqlite.js +107 -0
- package/dist/examples/seed-hyperdrive.d.ts +2 -0
- package/dist/examples/seed-hyperdrive.js +21 -0
- package/dist/examples/translation/translation-indic.d.ts +2 -0
- package/dist/examples/translation/translation-indic.js +30 -0
- package/dist/examples/translation/translation-llm-context.d.ts +2 -0
- package/dist/examples/translation/translation-llm-context.js +30 -0
- package/dist/examples/translation/translation-llm.d.ts +2 -0
- package/dist/examples/translation/translation-llm.js +38 -0
- package/dist/examples/translation/translation-opus.d.ts +2 -0
- package/dist/examples/translation/translation-opus.js +30 -0
- package/dist/examples/translation/translation-stream.d.ts +2 -0
- package/dist/examples/translation/translation-stream.js +35 -0
- package/dist/examples/whispercpp-filesystem.d.ts +2 -0
- package/dist/examples/whispercpp-filesystem.js +43 -0
- package/dist/examples/whispercpp-microphone-record.d.ts +2 -0
- package/dist/examples/whispercpp-microphone-record.js +311 -0
- package/dist/expo/plugins/index.d.ts +5 -0
- package/dist/expo/plugins/index.js +5 -0
- package/dist/expo/plugins/withMobileBundle.d.ts +8 -0
- package/dist/expo/plugins/withMobileBundle.js +60 -0
- package/dist/expo/plugins/withOpenCL.d.ts +9 -0
- package/dist/expo/plugins/withOpenCL.js +118 -0
- package/dist/expo/plugins/withQvacSDK.d.ts +9 -0
- package/dist/expo/plugins/withQvacSDK.js +13 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +8 -0
- package/dist/logging/base-logger.d.ts +7 -0
- package/dist/logging/base-logger.js +55 -0
- package/dist/logging/index.d.ts +4 -0
- package/dist/logging/index.js +2 -0
- package/dist/logging/logger.d.ts +5 -0
- package/dist/logging/logger.js +28 -0
- package/dist/logging/stream-logger.d.ts +3 -0
- package/dist/logging/stream-logger.js +9 -0
- package/dist/logging/transport.d.ts +3 -0
- package/dist/logging/transport.js +15 -0
- package/dist/logging/types.d.ts +18 -0
- package/dist/logging/types.js +1 -0
- package/dist/logging/utils.d.ts +4 -0
- package/dist/logging/utils.js +47 -0
- package/dist/models/hyperdrive/index.d.ts +2 -0
- package/dist/models/hyperdrive/index.js +2 -0
- package/dist/models/hyperdrive/models.d.ts +475 -0
- package/dist/models/hyperdrive/models.js +534 -0
- package/dist/schemas/cancel.d.ts +33 -0
- package/dist/schemas/cancel.js +25 -0
- package/dist/schemas/common.d.ts +626 -0
- package/dist/schemas/common.js +47 -0
- package/dist/schemas/completion-stream.d.ts +125 -0
- package/dist/schemas/completion-stream.js +53 -0
- package/dist/schemas/delegate.d.ts +9 -0
- package/dist/schemas/delegate.js +9 -0
- package/dist/schemas/download-asset.d.ts +75 -0
- package/dist/schemas/download-asset.js +43 -0
- package/dist/schemas/embed.d.ts +20 -0
- package/dist/schemas/embed.js +14 -0
- package/dist/schemas/error.d.ts +13 -0
- package/dist/schemas/error.js +35 -0
- package/dist/schemas/index.d.ts +19 -0
- package/dist/schemas/index.js +19 -0
- package/dist/schemas/llamacpp-config.d.ts +30 -0
- package/dist/schemas/llamacpp-config.js +39 -0
- package/dist/schemas/load-model.d.ts +1259 -0
- package/dist/schemas/load-model.js +108 -0
- package/dist/schemas/logging-stream.d.ts +27 -0
- package/dist/schemas/logging-stream.js +16 -0
- package/dist/schemas/ping.d.ts +11 -0
- package/dist/schemas/ping.js +8 -0
- package/dist/schemas/provide.d.ts +43 -0
- package/dist/schemas/provide.js +25 -0
- package/dist/schemas/rag.d.ts +159 -0
- package/dist/schemas/rag.js +78 -0
- package/dist/schemas/transcription.d.ts +24 -0
- package/dist/schemas/transcription.js +15 -0
- package/dist/schemas/translate.d.ts +82 -0
- package/dist/schemas/translate.js +42 -0
- package/dist/schemas/translation-config.d.ts +83 -0
- package/dist/schemas/translation-config.js +46 -0
- package/dist/schemas/unload-model.d.ts +19 -0
- package/dist/schemas/unload-model.js +13 -0
- package/dist/schemas/whispercpp-config.d.ts +25 -0
- package/dist/schemas/whispercpp-config.js +18 -0
- package/dist/server/bare/addons/cancel.d.ts +3 -0
- package/dist/server/bare/addons/cancel.js +12 -0
- package/dist/server/bare/addons/index.d.ts +4 -0
- package/dist/server/bare/addons/index.js +3 -0
- package/dist/server/bare/addons/llamacpp/create-model.d.ts +5 -0
- package/dist/server/bare/addons/llamacpp/create-model.js +57 -0
- package/dist/server/bare/addons/llamacpp/handlers/completion-stream.d.ts +3 -0
- package/dist/server/bare/addons/llamacpp/handlers/completion-stream.js +65 -0
- package/dist/server/bare/addons/llamacpp/handlers/embed.d.ts +4 -0
- package/dist/server/bare/addons/llamacpp/handlers/embed.js +40 -0
- package/dist/server/bare/addons/llamacpp/index.d.ts +4 -0
- package/dist/server/bare/addons/llamacpp/index.js +3 -0
- package/dist/server/bare/addons/llamacpp/kv-cache-utils.d.ts +19 -0
- package/dist/server/bare/addons/llamacpp/kv-cache-utils.js +46 -0
- package/dist/server/bare/addons/load-model.d.ts +3 -0
- package/dist/server/bare/addons/load-model.js +55 -0
- package/dist/server/bare/addons/translation/create-model.d.ts +4 -0
- package/dist/server/bare/addons/translation/create-model.js +45 -0
- package/dist/server/bare/addons/translation/handlers/translate.d.ts +3 -0
- package/dist/server/bare/addons/translation/handlers/translate.js +86 -0
- package/dist/server/bare/addons/translation/index.d.ts +3 -0
- package/dist/server/bare/addons/translation/index.js +2 -0
- package/dist/server/bare/addons/unload-model.d.ts +3 -0
- package/dist/server/bare/addons/unload-model.js +20 -0
- package/dist/server/bare/addons/whispercpp/create-model.d.ts +6 -0
- package/dist/server/bare/addons/whispercpp/create-model.js +55 -0
- package/dist/server/bare/addons/whispercpp/handlers/transcribe-stream.d.ts +3 -0
- package/dist/server/bare/addons/whispercpp/handlers/transcribe-stream.js +42 -0
- package/dist/server/bare/addons/whispercpp/index.d.ts +3 -0
- package/dist/server/bare/addons/whispercpp/index.js +2 -0
- package/dist/server/bare/delegate-rpc-client.d.ts +4 -0
- package/dist/server/bare/delegate-rpc-client.js +70 -0
- package/dist/server/bare/hyperswarm.d.ts +7 -0
- package/dist/server/bare/hyperswarm.js +62 -0
- package/dist/server/bare/rag-hyperdb/handlers/delete-embeddings.d.ts +3 -0
- package/dist/server/bare/rag-hyperdb/handlers/delete-embeddings.js +12 -0
- package/dist/server/bare/rag-hyperdb/handlers/save-embeddings.d.ts +6 -0
- package/dist/server/bare/rag-hyperdb/handlers/save-embeddings.js +16 -0
- package/dist/server/bare/rag-hyperdb/handlers/search.d.ts +3 -0
- package/dist/server/bare/rag-hyperdb/handlers/search.js +15 -0
- package/dist/server/bare/rag-hyperdb/index.d.ts +5 -0
- package/dist/server/bare/rag-hyperdb/index.js +4 -0
- package/dist/server/bare/rag-hyperdb/rag-manager.d.ts +5 -0
- package/dist/server/bare/rag-hyperdb/rag-manager.js +61 -0
- package/dist/server/bare/registry/logging-stream-registry.d.ts +12 -0
- package/dist/server/bare/registry/logging-stream-registry.js +46 -0
- package/dist/server/bare/registry/model-registry.d.ts +64 -0
- package/dist/server/bare/registry/model-registry.js +95 -0
- package/dist/server/error-handlers.d.ts +4 -0
- package/dist/server/error-handlers.js +27 -0
- package/dist/server/http-server.d.ts +2 -0
- package/dist/server/http-server.js +189 -0
- package/dist/server/rpc/create-server.d.ts +4 -0
- package/dist/server/rpc/create-server.js +19 -0
- package/dist/server/rpc/handle-request.d.ts +12 -0
- package/dist/server/rpc/handle-request.js +220 -0
- package/dist/server/rpc/handlers/cancelHandler.d.ts +3 -0
- package/dist/server/rpc/handlers/cancelHandler.js +27 -0
- package/dist/server/rpc/handlers/completion-stream-delegated.d.ts +3 -0
- package/dist/server/rpc/handlers/completion-stream-delegated.js +30 -0
- package/dist/server/rpc/handlers/completion-stream.d.ts +3 -0
- package/dist/server/rpc/handlers/completion-stream.js +52 -0
- package/dist/server/rpc/handlers/download-asset.d.ts +3 -0
- package/dist/server/rpc/handlers/download-asset.js +21 -0
- package/dist/server/rpc/handlers/embed.d.ts +3 -0
- package/dist/server/rpc/handlers/embed.js +21 -0
- package/dist/server/rpc/handlers/index.d.ts +23 -0
- package/dist/server/rpc/handlers/index.js +22 -0
- package/dist/server/rpc/handlers/load-model/download-manager.d.ts +31 -0
- package/dist/server/rpc/handlers/load-model/download-manager.js +88 -0
- package/dist/server/rpc/handlers/load-model/http.d.ts +3 -0
- package/dist/server/rpc/handlers/load-model/http.js +337 -0
- package/dist/server/rpc/handlers/load-model/hyperdrive.d.ts +4 -0
- package/dist/server/rpc/handlers/load-model/hyperdrive.js +332 -0
- package/dist/server/rpc/handlers/load-model/index.d.ts +4 -0
- package/dist/server/rpc/handlers/load-model/index.js +3 -0
- package/dist/server/rpc/handlers/load-model/resolve.d.ts +3 -0
- package/dist/server/rpc/handlers/load-model/resolve.js +121 -0
- package/dist/server/rpc/handlers/load-model-delegated.d.ts +3 -0
- package/dist/server/rpc/handlers/load-model-delegated.js +93 -0
- package/dist/server/rpc/handlers/load-model.d.ts +3 -0
- package/dist/server/rpc/handlers/load-model.js +41 -0
- package/dist/server/rpc/handlers/logging-stream.d.ts +3 -0
- package/dist/server/rpc/handlers/logging-stream.js +37 -0
- package/dist/server/rpc/handlers/provideHandler/connection.d.ts +3 -0
- package/dist/server/rpc/handlers/provideHandler/connection.js +25 -0
- package/dist/server/rpc/handlers/provideHandler/handler.d.ts +3 -0
- package/dist/server/rpc/handlers/provideHandler/handler.js +50 -0
- package/dist/server/rpc/handlers/provideHandler/proxy.d.ts +3 -0
- package/dist/server/rpc/handlers/provideHandler/proxy.js +22 -0
- package/dist/server/rpc/handlers/provideHandler.d.ts +2 -0
- package/dist/server/rpc/handlers/provideHandler.js +2 -0
- package/dist/server/rpc/handlers/rag.d.ts +3 -0
- package/dist/server/rpc/handlers/rag.js +67 -0
- package/dist/server/rpc/handlers/transcribe-stream.d.ts +3 -0
- package/dist/server/rpc/handlers/transcribe-stream.js +26 -0
- package/dist/server/rpc/handlers/translate.d.ts +3 -0
- package/dist/server/rpc/handlers/translate.js +51 -0
- package/dist/server/rpc/handlers/unload-model.d.ts +3 -0
- package/dist/server/rpc/handlers/unload-model.js +20 -0
- package/dist/server/rpc/index.d.ts +3 -0
- package/dist/server/rpc/index.js +2 -0
- package/dist/server/utils/audio/decoder.d.ts +4 -0
- package/dist/server/utils/audio/decoder.js +41 -0
- package/dist/server/utils/cache.d.ts +15 -0
- package/dist/server/utils/cache.js +32 -0
- package/dist/server/utils/hash.d.ts +5 -0
- package/dist/server/utils/hash.js +11 -0
- package/dist/server/utils/index.d.ts +5 -0
- package/dist/server/utils/index.js +4 -0
- package/dist/server/utils/model-path.d.ts +5 -0
- package/dist/server/utils/model-path.js +7 -0
- package/dist/server/worker.d.ts +6 -0
- package/dist/server/worker.js +77 -0
- package/dist/utils/withTimeout.d.ts +11 -0
- package/dist/utils/withTimeout.js +37 -0
- package/package.json +129 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { handlers } from "../../server/rpc/handlers/index.js";
|
|
2
|
+
// Get the handler for a request type
|
|
3
|
+
const getHandler = (type) => {
|
|
4
|
+
const handler = handlers[type];
|
|
5
|
+
return typeof handler === "function" ? handler : undefined;
|
|
6
|
+
};
|
|
7
|
+
export async function send(request) {
|
|
8
|
+
if (request.type === "ping") {
|
|
9
|
+
return { type: "pong", number: Math.random() * 100 };
|
|
10
|
+
}
|
|
11
|
+
const handler = getHandler(request.type);
|
|
12
|
+
if (!handler)
|
|
13
|
+
throw new Error(`No handler function for ${request.type}`);
|
|
14
|
+
return (await handler(request));
|
|
15
|
+
}
|
|
16
|
+
export async function* stream(request) {
|
|
17
|
+
const handler = getHandler(request.type);
|
|
18
|
+
if (!handler)
|
|
19
|
+
throw new Error(`No handler function for ${request.type}`);
|
|
20
|
+
// Special handling for loadModel with progress
|
|
21
|
+
if (request.type === "loadModel" &&
|
|
22
|
+
"withProgress" in request &&
|
|
23
|
+
request.withProgress) {
|
|
24
|
+
async function* streamWithProgress() {
|
|
25
|
+
const queue = [];
|
|
26
|
+
let done = false;
|
|
27
|
+
const loadModelHandler = handler;
|
|
28
|
+
loadModelHandler(request, (update) => queue.push(update))
|
|
29
|
+
.then((final) => {
|
|
30
|
+
queue.push(final);
|
|
31
|
+
done = true;
|
|
32
|
+
})
|
|
33
|
+
.catch((error) => {
|
|
34
|
+
done = true;
|
|
35
|
+
throw error;
|
|
36
|
+
});
|
|
37
|
+
while (!done || queue.length > 0) {
|
|
38
|
+
if (queue.length > 0) {
|
|
39
|
+
yield queue.shift();
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
yield* streamWithProgress();
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
yield* handler(request);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const createMockRPCRequest = () => {
|
|
53
|
+
let requestData = null;
|
|
54
|
+
return {
|
|
55
|
+
send(payload) {
|
|
56
|
+
// Parse the JSON payload to get the actual request data
|
|
57
|
+
requestData = JSON.parse(payload);
|
|
58
|
+
},
|
|
59
|
+
async reply() {
|
|
60
|
+
if (!requestData) {
|
|
61
|
+
throw new Error("No request data - call send() first");
|
|
62
|
+
}
|
|
63
|
+
const response = await send(requestData);
|
|
64
|
+
return Buffer.from(JSON.stringify(response));
|
|
65
|
+
},
|
|
66
|
+
async *createResponseStream() {
|
|
67
|
+
if (!requestData) {
|
|
68
|
+
throw new Error("No request data - call send() first");
|
|
69
|
+
}
|
|
70
|
+
for await (const response of stream(requestData)) {
|
|
71
|
+
yield Buffer.from(JSON.stringify(response) + "\n");
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
};
|
|
76
|
+
export function getRPC() {
|
|
77
|
+
return {
|
|
78
|
+
request() {
|
|
79
|
+
return createMockRPCRequest();
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import RPC from "bare-rpc";
|
|
2
|
+
import { spawn } from "bare-subprocess";
|
|
3
|
+
import { createServer } from "bare-net";
|
|
4
|
+
import os from "bare-os";
|
|
5
|
+
import path from "bare-path";
|
|
6
|
+
import process from "bare-process";
|
|
7
|
+
let rpcInstance = null;
|
|
8
|
+
let ipcServer = null;
|
|
9
|
+
let childProcess = null;
|
|
10
|
+
const cwd = process.cwd();
|
|
11
|
+
// Resolve worker path relative to this module's location (in the SDK)
|
|
12
|
+
// In Bare, we'll use a simpler path resolution
|
|
13
|
+
let WORKER_PATH;
|
|
14
|
+
if (cwd.includes("/dist/") || cwd.includes("\\dist\\")) {
|
|
15
|
+
// Running from compiled dist/ - worker is in same dist/ folder
|
|
16
|
+
const distRoot = cwd.includes("/dist/")
|
|
17
|
+
? cwd.split("/dist/")[0] + "/dist"
|
|
18
|
+
: cwd.split("\\dist\\")[0] + "\\dist";
|
|
19
|
+
WORKER_PATH = path.join(distRoot, "server/worker.js");
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
// Running from source - worker is in dist/ folder
|
|
23
|
+
WORKER_PATH = path.resolve(cwd, "dist/server/worker.js");
|
|
24
|
+
}
|
|
25
|
+
const SOCKET_PATH = path.join(os.tmpdir(), `qvac-worker-${process.pid}.sock`);
|
|
26
|
+
export function getRPC() {
|
|
27
|
+
if (rpcInstance) {
|
|
28
|
+
console.log("returning cached bare rpc");
|
|
29
|
+
return Promise.resolve(rpcInstance);
|
|
30
|
+
}
|
|
31
|
+
console.log("initRPC for bare runtime with socket:", SOCKET_PATH);
|
|
32
|
+
// Start IPC server (Unix socket)
|
|
33
|
+
const serverPromise = new Promise((resolve, reject) => {
|
|
34
|
+
const server = createServer((socket) => {
|
|
35
|
+
console.log("Worker connected via IPC socket");
|
|
36
|
+
// Create RPC instance using the socket
|
|
37
|
+
rpcInstance = new RPC(socket, () => {
|
|
38
|
+
// Use this for async callbacks
|
|
39
|
+
});
|
|
40
|
+
resolve(rpcInstance);
|
|
41
|
+
});
|
|
42
|
+
server.on("error", (err) => {
|
|
43
|
+
console.error("Failed to start IPC server:", err);
|
|
44
|
+
reject(err);
|
|
45
|
+
});
|
|
46
|
+
server.listen(SOCKET_PATH, () => {
|
|
47
|
+
console.log(`IPC server listening on ${SOCKET_PATH}`);
|
|
48
|
+
ipcServer = server;
|
|
49
|
+
// Spawn the worker process only after the socket is listening
|
|
50
|
+
console.log("Spawning worker at:", WORKER_PATH);
|
|
51
|
+
childProcess = spawn("bare", [
|
|
52
|
+
WORKER_PATH,
|
|
53
|
+
JSON.stringify({
|
|
54
|
+
QVAC_IPC_SOCKET_PATH: SOCKET_PATH,
|
|
55
|
+
HOME_DIR: os.homedir(),
|
|
56
|
+
}),
|
|
57
|
+
], {
|
|
58
|
+
stdio: ["inherit", "inherit", "inherit"],
|
|
59
|
+
});
|
|
60
|
+
childProcess.on("exit", (code) => {
|
|
61
|
+
console.log("Worker process exited with code:", code);
|
|
62
|
+
// Clean up
|
|
63
|
+
rpcInstance = null;
|
|
64
|
+
if (ipcServer) {
|
|
65
|
+
ipcServer.close();
|
|
66
|
+
ipcServer = null;
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
childProcess.on("error", (err) => {
|
|
70
|
+
console.error("Worker process error:", err);
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
return serverPromise;
|
|
75
|
+
}
|
|
76
|
+
// Clean up function
|
|
77
|
+
export const cleanup = () => {
|
|
78
|
+
if (childProcess) {
|
|
79
|
+
childProcess.kill();
|
|
80
|
+
childProcess = null;
|
|
81
|
+
}
|
|
82
|
+
if (ipcServer) {
|
|
83
|
+
ipcServer.close();
|
|
84
|
+
ipcServer = null;
|
|
85
|
+
}
|
|
86
|
+
rpcInstance = null;
|
|
87
|
+
};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import RPC from "bare-rpc";
|
|
2
|
+
let rpcInstance = null;
|
|
3
|
+
let rpcPromise = null;
|
|
4
|
+
console.log("EXPO RPC Client bundle");
|
|
5
|
+
export const getRPC = async () => {
|
|
6
|
+
if (rpcInstance) {
|
|
7
|
+
return rpcInstance;
|
|
8
|
+
}
|
|
9
|
+
if (rpcPromise) {
|
|
10
|
+
return rpcPromise;
|
|
11
|
+
}
|
|
12
|
+
rpcPromise = (async () => {
|
|
13
|
+
const { Paths } = await import("expo-file-system");
|
|
14
|
+
const bareKitModule = await import("react-native-bare-kit");
|
|
15
|
+
const worklet = new bareKitModule.Worklet();
|
|
16
|
+
console.log("Starting worklet");
|
|
17
|
+
// Load the mobile bundle - this will be generated by the Expo plugin
|
|
18
|
+
// using the user's installed bare library versions
|
|
19
|
+
let mobileBundle;
|
|
20
|
+
try {
|
|
21
|
+
// We need require here or the contents of the bundle will be interpreted as a module
|
|
22
|
+
mobileBundle =
|
|
23
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
24
|
+
require("@qvac/sdk/worker.mobile.bundle");
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
const message = "Failed to load mobile worker bundle. Make sure the QVAC Expo plugin is configured. " +
|
|
28
|
+
`Add '@qvac/sdk/expo-plugin' to your app.json plugins array. ` +
|
|
29
|
+
`Error: ${String(error)}`;
|
|
30
|
+
console.error(message);
|
|
31
|
+
throw new Error(message);
|
|
32
|
+
}
|
|
33
|
+
worklet.start("worker.bundle", mobileBundle, [
|
|
34
|
+
// Normalize arg number across platforms
|
|
35
|
+
"react-native-bare-kit",
|
|
36
|
+
"worker.js",
|
|
37
|
+
JSON.stringify({
|
|
38
|
+
HOME_DIR: Paths.document.uri.replace("file://", ""),
|
|
39
|
+
}),
|
|
40
|
+
]);
|
|
41
|
+
console.log("Worklet started");
|
|
42
|
+
rpcInstance = new RPC(worklet.IPC, () => {
|
|
43
|
+
// Use this for async callbacks
|
|
44
|
+
});
|
|
45
|
+
return rpcInstance;
|
|
46
|
+
})();
|
|
47
|
+
try {
|
|
48
|
+
return await rpcPromise;
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
console.error(`Failed to initialize RPC: ${String(error)}`);
|
|
52
|
+
throw error;
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
rpcPromise = null;
|
|
56
|
+
}
|
|
57
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare function getRPC(): {
|
|
2
|
+
request: (command: number) => {
|
|
3
|
+
send: (data: string, encoding: BufferEncoding) => void;
|
|
4
|
+
reply: (encoding: BufferEncoding) => Promise<Buffer>;
|
|
5
|
+
createResponseStream: () => AsyncGenerator<unknown, void, unknown>;
|
|
6
|
+
};
|
|
7
|
+
};
|
|
8
|
+
export declare const cleanup: () => void;
|
|
9
|
+
//# sourceMappingURL=node-rpc-client.d.ts.map
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import RPC from "bare-rpc";
|
|
2
|
+
import spawn, {} from "bare-runtime/spawn";
|
|
3
|
+
import { createServer } from "node:net";
|
|
4
|
+
import os from "node:os";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import { fileURLToPath } from "node:url";
|
|
7
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
8
|
+
const __dirname = path.dirname(__filename);
|
|
9
|
+
let rpcInstance = null;
|
|
10
|
+
let rpcPromise = null;
|
|
11
|
+
let bareWorkerProc = null;
|
|
12
|
+
// Smart path resolution for worker
|
|
13
|
+
let WORKER_PATH;
|
|
14
|
+
if (__dirname.includes("/dist/") || __dirname.includes("\\dist\\")) {
|
|
15
|
+
const distRoot = __dirname.includes("/dist/")
|
|
16
|
+
? __dirname.split("/dist/")[0] + "/dist"
|
|
17
|
+
: __dirname.split("\\dist\\")[0] + "\\dist";
|
|
18
|
+
WORKER_PATH = path.join(distRoot, "server/worker.js");
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
WORKER_PATH = path.resolve(__dirname, "../../dist/server/worker.js");
|
|
22
|
+
}
|
|
23
|
+
const SOCKET_PATH = process.platform === "win32"
|
|
24
|
+
? `\\\\.\\pipe\\qvac-worker-${process.pid}`
|
|
25
|
+
: path.join(os.tmpdir(), `qvac-worker-${process.pid}.sock`);
|
|
26
|
+
async function ensureRPC() {
|
|
27
|
+
if (rpcInstance)
|
|
28
|
+
return rpcInstance;
|
|
29
|
+
if (rpcPromise)
|
|
30
|
+
return rpcPromise;
|
|
31
|
+
rpcPromise = new Promise((resolve, reject) => {
|
|
32
|
+
const server = createServer((socket) => {
|
|
33
|
+
rpcInstance = new RPC(socket, () => { });
|
|
34
|
+
resolve(rpcInstance);
|
|
35
|
+
});
|
|
36
|
+
server.on("error", reject);
|
|
37
|
+
server.listen(SOCKET_PATH, () => {
|
|
38
|
+
bareWorkerProc = spawn("bare", {
|
|
39
|
+
args: [
|
|
40
|
+
WORKER_PATH,
|
|
41
|
+
JSON.stringify({
|
|
42
|
+
QVAC_IPC_SOCKET_PATH: SOCKET_PATH,
|
|
43
|
+
HOME_DIR: os.homedir(),
|
|
44
|
+
}),
|
|
45
|
+
],
|
|
46
|
+
stdio: ["inherit", "inherit", "inherit"],
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
return rpcPromise;
|
|
51
|
+
}
|
|
52
|
+
const mockRPC = {
|
|
53
|
+
request: (command) => {
|
|
54
|
+
let sentData = null;
|
|
55
|
+
return {
|
|
56
|
+
send: (data, encoding) => {
|
|
57
|
+
sentData = { data, encoding };
|
|
58
|
+
},
|
|
59
|
+
reply: async (encoding) => {
|
|
60
|
+
if (!sentData) {
|
|
61
|
+
throw new Error("Must call send() before reply()");
|
|
62
|
+
}
|
|
63
|
+
const rpc = await ensureRPC();
|
|
64
|
+
const req = rpc.request(command);
|
|
65
|
+
req.send(sentData.data, sentData.encoding);
|
|
66
|
+
const response = await req.reply(encoding);
|
|
67
|
+
return Buffer.isBuffer(response)
|
|
68
|
+
? response
|
|
69
|
+
: Buffer.from(typeof response === "string" ? response : "", encoding);
|
|
70
|
+
},
|
|
71
|
+
createResponseStream: async function* () {
|
|
72
|
+
if (!sentData) {
|
|
73
|
+
throw new Error("Must call send() before createResponseStream()");
|
|
74
|
+
}
|
|
75
|
+
const rpc = await ensureRPC();
|
|
76
|
+
const req = rpc.request(command);
|
|
77
|
+
req.send(sentData.data, sentData.encoding);
|
|
78
|
+
const stream = req.createResponseStream({
|
|
79
|
+
encoding: sentData.encoding,
|
|
80
|
+
});
|
|
81
|
+
for await (const chunk of stream) {
|
|
82
|
+
yield chunk;
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
export function getRPC() {
|
|
89
|
+
return mockRPC;
|
|
90
|
+
}
|
|
91
|
+
export const cleanup = () => {
|
|
92
|
+
console.log("š§¹ Cleaning up RPC client");
|
|
93
|
+
if (bareWorkerProc) {
|
|
94
|
+
console.log("š»š« Killing bare worker process");
|
|
95
|
+
bareWorkerProc.kill("SIGTERM");
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
// Register cleanup handlers for the parent process
|
|
99
|
+
process.once("exit", cleanup);
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type RPC from "bare-rpc";
|
|
2
|
+
import { type Request, type Response, type RPCOptions } from "../../schemas/index";
|
|
3
|
+
export declare function send<T extends Request>(request: T, rpc?: RPC, options?: RPCOptions): Promise<Response>;
|
|
4
|
+
export declare function stream<T extends Request>(request: T, rpc?: RPC, options?: RPCOptions): AsyncGenerator<Response>;
|
|
5
|
+
//# sourceMappingURL=rpc-client.d.ts.map
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { requestSchema, responseSchema, } from "../../schemas/index.js";
|
|
2
|
+
import { RPCError } from "./rpc-error.js";
|
|
3
|
+
import { withTimeout, withTimeoutStream } from "../../utils/withTimeout.js";
|
|
4
|
+
let rpcInstance = null;
|
|
5
|
+
function checkAndThrowError(response) {
|
|
6
|
+
if (response.type === "error") {
|
|
7
|
+
throw new RPCError(response);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
async function getRPC() {
|
|
11
|
+
if (rpcInstance)
|
|
12
|
+
return rpcInstance;
|
|
13
|
+
const isRN = typeof navigator !== "undefined" && navigator.product === "ReactNative";
|
|
14
|
+
// Detect Bare runtime - Bare exposes global Bare object
|
|
15
|
+
// TODO we can use something like https://www.npmjs.com/package/which-runtime at some point
|
|
16
|
+
const isBare = typeof globalThis !== "undefined" && "Bare" in globalThis;
|
|
17
|
+
// TODO Lots of type unsafe hacks to make this work cross platform
|
|
18
|
+
if (isRN) {
|
|
19
|
+
console.log("React Native runtime detected");
|
|
20
|
+
// Only import expo client for React Native - Metro won't bundle the Node client
|
|
21
|
+
const expoRPCClientPath = "./expo-rpc-client";
|
|
22
|
+
const mod = (await import(expoRPCClientPath));
|
|
23
|
+
rpcInstance = await (typeof mod === "function" ? mod() : mod.getRPC());
|
|
24
|
+
return rpcInstance;
|
|
25
|
+
}
|
|
26
|
+
else if (isBare) {
|
|
27
|
+
console.log("Bare runtime detected");
|
|
28
|
+
// Use dynamic import for Bare client
|
|
29
|
+
const mod = await import("./bare-client.js");
|
|
30
|
+
rpcInstance = mod.getRPC();
|
|
31
|
+
return rpcInstance;
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
console.log("Node runtime detected");
|
|
35
|
+
// Use dynamic import for Node client to prevent Metro from bundling it
|
|
36
|
+
const mod = await import("./node-rpc-client.js");
|
|
37
|
+
rpcInstance = mod.getRPC();
|
|
38
|
+
return rpcInstance;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export async function send(request, rpc, options) {
|
|
42
|
+
const parsedRequest = requestSchema.parse(request);
|
|
43
|
+
const rpcInstance = rpc || (await getRPC());
|
|
44
|
+
const req = rpcInstance.request(1);
|
|
45
|
+
// TODO temp for debugging, find a better solution to exclude large payloads
|
|
46
|
+
// Log request type and basic info, avoid logging large payloads
|
|
47
|
+
if (request.type === "transcribeStream") {
|
|
48
|
+
console.log("RPC Client sending:", {
|
|
49
|
+
type: request.type,
|
|
50
|
+
modelId: request.modelId,
|
|
51
|
+
audioChunkSize: request.audioChunk.length,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
console.log("RPC Client sending:", request);
|
|
56
|
+
}
|
|
57
|
+
const payload = JSON.stringify(parsedRequest);
|
|
58
|
+
req.send(payload, "utf-8");
|
|
59
|
+
const response = await withTimeout(req.reply("utf-8"), options?.timeout);
|
|
60
|
+
const resPayload = responseSchema.parse(JSON.parse(response?.toString() || "{}"));
|
|
61
|
+
console.log("ResPayload", { type: resPayload.type });
|
|
62
|
+
checkAndThrowError(resPayload);
|
|
63
|
+
return resPayload;
|
|
64
|
+
}
|
|
65
|
+
export async function* stream(request, rpc, options = {}) {
|
|
66
|
+
const parsedRequest = requestSchema.parse(request);
|
|
67
|
+
const rpcInstance = rpc || (await getRPC());
|
|
68
|
+
const req = rpcInstance.request(1);
|
|
69
|
+
req.send(JSON.stringify(parsedRequest), "utf-8");
|
|
70
|
+
const responseStream = req.createResponseStream({ encoding: "utf-8" });
|
|
71
|
+
let buffer = "";
|
|
72
|
+
async function* processStream() {
|
|
73
|
+
for await (const chunk of responseStream) {
|
|
74
|
+
yield chunk;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const streamWithTimeout = withTimeoutStream(processStream(), options?.timeout);
|
|
78
|
+
for await (const chunk of streamWithTimeout) {
|
|
79
|
+
buffer += chunk.toString();
|
|
80
|
+
// Process complete lines (newline-delimited JSON)
|
|
81
|
+
const lines = buffer.split("\n");
|
|
82
|
+
buffer = lines.pop() || ""; // Keep incomplete line in buffer
|
|
83
|
+
for (const line of lines) {
|
|
84
|
+
if (line.trim()) {
|
|
85
|
+
const response = responseSchema.parse(JSON.parse(line));
|
|
86
|
+
checkAndThrowError(response);
|
|
87
|
+
yield response;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ErrorResponse } from "../../schemas/index";
|
|
2
|
+
export declare class RPCError extends Error {
|
|
3
|
+
readonly timestamp?: string;
|
|
4
|
+
readonly remoteStack?: string;
|
|
5
|
+
readonly code?: number;
|
|
6
|
+
readonly cause?: unknown;
|
|
7
|
+
readonly isQvacError: boolean;
|
|
8
|
+
constructor(errorResponse: ErrorResponse);
|
|
9
|
+
toJSON(): {
|
|
10
|
+
name: string;
|
|
11
|
+
code: number | undefined;
|
|
12
|
+
message: string;
|
|
13
|
+
stack: string | undefined;
|
|
14
|
+
cause: unknown;
|
|
15
|
+
timestamp: string | undefined;
|
|
16
|
+
isQvacError: boolean;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=rpc-error.d.ts.map
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export class RPCError extends Error {
|
|
2
|
+
timestamp;
|
|
3
|
+
remoteStack;
|
|
4
|
+
code;
|
|
5
|
+
cause;
|
|
6
|
+
isQvacError;
|
|
7
|
+
constructor(errorResponse) {
|
|
8
|
+
super(errorResponse.message);
|
|
9
|
+
// If this was originally a QvacError, preserve its structure
|
|
10
|
+
if (errorResponse.name && errorResponse.code) {
|
|
11
|
+
this.name = errorResponse.name;
|
|
12
|
+
this.code = errorResponse.code;
|
|
13
|
+
this.cause = errorResponse.cause;
|
|
14
|
+
this.isQvacError = true;
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
this.name = "RPCError";
|
|
18
|
+
this.isQvacError = false;
|
|
19
|
+
}
|
|
20
|
+
if (errorResponse.timestamp) {
|
|
21
|
+
this.timestamp = errorResponse.timestamp;
|
|
22
|
+
}
|
|
23
|
+
if (errorResponse.stack) {
|
|
24
|
+
this.remoteStack = errorResponse.stack;
|
|
25
|
+
this.stack = `${this.stack}\n--- Worker Stack ---\n${errorResponse.stack}`;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
toJSON() {
|
|
29
|
+
return {
|
|
30
|
+
name: this.name,
|
|
31
|
+
code: this.code,
|
|
32
|
+
message: this.message,
|
|
33
|
+
stack: this.stack,
|
|
34
|
+
cause: this.cause,
|
|
35
|
+
timestamp: this.timestamp,
|
|
36
|
+
isQvacError: this.isQvacError,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./audio.js";
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { completion, LLAMA_3_2_1B_INST_Q4_0, loadModel } from "@qvac/sdk";
|
|
2
|
+
// Topic hex (required)
|
|
3
|
+
const topicHex = process.argv[2];
|
|
4
|
+
if (!topicHex) {
|
|
5
|
+
console.error("ā Topic hex is required. Usage: node consumer.ts <topic-hex> <provider-public-key> [consumer-seed]");
|
|
6
|
+
process.exit(1);
|
|
7
|
+
}
|
|
8
|
+
// Provider public key (required)
|
|
9
|
+
const providerPublicKey = process.argv[3];
|
|
10
|
+
if (!providerPublicKey) {
|
|
11
|
+
console.error("ā Provider public key is required. Usage: node consumer.ts <topic-hex> <provider-public-key> [consumer-seed]");
|
|
12
|
+
process.exit(1);
|
|
13
|
+
}
|
|
14
|
+
try {
|
|
15
|
+
// Optional: Consumer seed for deterministic consumer identity (for firewall testing)
|
|
16
|
+
const consumerSeed = process.argv[4];
|
|
17
|
+
process.env["QVAC_HYPERSWARM_SEED"] = consumerSeed;
|
|
18
|
+
console.log(`š Testing delegated inference`);
|
|
19
|
+
console.log(`š” Topic: ${topicHex}`);
|
|
20
|
+
console.log(`š Provider: ${providerPublicKey}`);
|
|
21
|
+
if (consumerSeed) {
|
|
22
|
+
console.log(`š Consumer seed: ${consumerSeed.substring(0, 16)}... (deterministic identity)`);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
console.log(`š² No consumer seed provided (random identity)`);
|
|
26
|
+
}
|
|
27
|
+
const modelId = await loadModel({
|
|
28
|
+
modelSrc: LLAMA_3_2_1B_INST_Q4_0,
|
|
29
|
+
modelType: "llm",
|
|
30
|
+
delegate: {
|
|
31
|
+
topic: topicHex,
|
|
32
|
+
providerPublicKey,
|
|
33
|
+
timeout: 5_000, // Optional: 5 second timeout for delegated requests
|
|
34
|
+
fallbackToLocal: true, // Optional: Fall back to local inference if delegation fails
|
|
35
|
+
},
|
|
36
|
+
onProgress: (progress) => {
|
|
37
|
+
console.log(`š Download progress: ${progress.percentage.toFixed(1)}% (${progress.downloaded}/${progress.total} bytes)`);
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
console.log(`ā
Delegated model registered: ${modelId}`);
|
|
41
|
+
const response = completion({
|
|
42
|
+
modelId,
|
|
43
|
+
history: [{ role: "user", content: "Hello!" }],
|
|
44
|
+
stream: true,
|
|
45
|
+
});
|
|
46
|
+
for await (const token of response.tokenStream) {
|
|
47
|
+
console.log(`šØ Response: ${token}`);
|
|
48
|
+
}
|
|
49
|
+
console.log("š Stats:", await response.stats);
|
|
50
|
+
console.log("\nšÆ Delegation infrastructure working! Server correctly detected and routed the delegated request.");
|
|
51
|
+
process.exit(0);
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
console.error("ā Error:", error);
|
|
55
|
+
process.exit(1);
|
|
56
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { startQVACProvider } from "@qvac/sdk";
|
|
2
|
+
// Random topic if not provided
|
|
3
|
+
const topic = process.argv[2] ||
|
|
4
|
+
"66646f696865726f6569686a726530776a66646f696865726f6569686a726530";
|
|
5
|
+
// Optional: Seed for deterministic provider identity (64-character hex string)
|
|
6
|
+
const seed = process.argv[3];
|
|
7
|
+
process.env["QVAC_HYPERSWARM_SEED"] = seed;
|
|
8
|
+
// Optional: Consumer public key for firewall (allow only this consumer)
|
|
9
|
+
const allowedConsumerPublicKey = process.argv[4];
|
|
10
|
+
console.log(`š Starting provider service with topic: ${topic}...`);
|
|
11
|
+
try {
|
|
12
|
+
if (allowedConsumerPublicKey) {
|
|
13
|
+
console.log(`š Firewall enabled: only allowing consumer ${allowedConsumerPublicKey}`);
|
|
14
|
+
}
|
|
15
|
+
// Start the provider service with optional firewall and seed
|
|
16
|
+
const response = await startQVACProvider({
|
|
17
|
+
topic,
|
|
18
|
+
firewall: allowedConsumerPublicKey
|
|
19
|
+
? {
|
|
20
|
+
mode: "allow",
|
|
21
|
+
publicKeys: [allowedConsumerPublicKey],
|
|
22
|
+
}
|
|
23
|
+
: undefined,
|
|
24
|
+
});
|
|
25
|
+
console.log("ā
Provider service started successfully!");
|
|
26
|
+
console.log("š Provider is now available for delegated inference requests");
|
|
27
|
+
console.log("");
|
|
28
|
+
console.log("š Connection Details:");
|
|
29
|
+
console.log(` š” Topic (shared): ${topic}`);
|
|
30
|
+
console.log(` š Provider Public Key (unique): ${response.publicKey}`);
|
|
31
|
+
console.log("");
|
|
32
|
+
console.log("š” Consumer command:");
|
|
33
|
+
console.log(` node consumer.ts ${topic} ${response.publicKey}`);
|
|
34
|
+
console.log("");
|
|
35
|
+
console.log("š” To reproduce this provider identity:");
|
|
36
|
+
console.log(` node provider.ts ${topic} ${seed || "<random-seed>"}`);
|
|
37
|
+
if (!seed) {
|
|
38
|
+
console.log(" (Note: seed was random this time, set one for reproducible identity)");
|
|
39
|
+
}
|
|
40
|
+
console.log("");
|
|
41
|
+
console.log("š For firewall testing:");
|
|
42
|
+
console.log(" 1. Generate a consumer seed (64-char hex)");
|
|
43
|
+
console.log(" 2. Get consumer public key: getConsumerPublicKey(consumerSeed)");
|
|
44
|
+
console.log(" 3. Restart provider with consumer public key as 4th argument");
|
|
45
|
+
console.log(` 4. Run consumer with: node consumer.ts ${topic} ${response.publicKey} <consumer-seed>`);
|
|
46
|
+
// Keep the process running
|
|
47
|
+
console.log("š” Provider is running... Press Ctrl+C to stop");
|
|
48
|
+
process.on("SIGINT", () => {
|
|
49
|
+
console.log("\nš Provider service stopped");
|
|
50
|
+
process.exit(0);
|
|
51
|
+
});
|
|
52
|
+
process.stdin.resume();
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
console.error("ā Error:", error);
|
|
56
|
+
process.exit(1);
|
|
57
|
+
}
|