deepadb 1.0.0
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 +21 -0
- package/README.md +631 -0
- package/build/bridge/adb-bridge.d.ts +65 -0
- package/build/bridge/adb-bridge.d.ts.map +1 -0
- package/build/bridge/adb-bridge.js +164 -0
- package/build/bridge/adb-bridge.js.map +1 -0
- package/build/bridge/device-manager.d.ts +41 -0
- package/build/bridge/device-manager.d.ts.map +1 -0
- package/build/bridge/device-manager.js +109 -0
- package/build/bridge/device-manager.js.map +1 -0
- package/build/bridge/local-bridge.d.ts +92 -0
- package/build/bridge/local-bridge.d.ts.map +1 -0
- package/build/bridge/local-bridge.js +345 -0
- package/build/bridge/local-bridge.js.map +1 -0
- package/build/config/config.d.ts +39 -0
- package/build/config/config.d.ts.map +1 -0
- package/build/config/config.js +84 -0
- package/build/config/config.js.map +1 -0
- package/build/graphql-api.d.ts +36 -0
- package/build/graphql-api.d.ts.map +1 -0
- package/build/graphql-api.js +296 -0
- package/build/graphql-api.js.map +1 -0
- package/build/http-transport.d.ts +26 -0
- package/build/http-transport.d.ts.map +1 -0
- package/build/http-transport.js +105 -0
- package/build/http-transport.js.map +1 -0
- package/build/index.d.ts +14 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +66 -0
- package/build/index.js.map +1 -0
- package/build/middleware/chipset.d.ts +29 -0
- package/build/middleware/chipset.d.ts.map +1 -0
- package/build/middleware/chipset.js +123 -0
- package/build/middleware/chipset.js.map +1 -0
- package/build/middleware/cleanup.d.ts +24 -0
- package/build/middleware/cleanup.d.ts.map +1 -0
- package/build/middleware/cleanup.js +53 -0
- package/build/middleware/cleanup.js.map +1 -0
- package/build/middleware/fetch-utils.d.ts +19 -0
- package/build/middleware/fetch-utils.d.ts.map +1 -0
- package/build/middleware/fetch-utils.js +64 -0
- package/build/middleware/fetch-utils.js.map +1 -0
- package/build/middleware/logger.d.ts +17 -0
- package/build/middleware/logger.d.ts.map +1 -0
- package/build/middleware/logger.js +38 -0
- package/build/middleware/logger.js.map +1 -0
- package/build/middleware/output-processor.d.ts +57 -0
- package/build/middleware/output-processor.d.ts.map +1 -0
- package/build/middleware/output-processor.js +162 -0
- package/build/middleware/output-processor.js.map +1 -0
- package/build/middleware/sanitize.d.ts +30 -0
- package/build/middleware/sanitize.d.ts.map +1 -0
- package/build/middleware/sanitize.js +46 -0
- package/build/middleware/sanitize.js.map +1 -0
- package/build/middleware/security.d.ts +52 -0
- package/build/middleware/security.d.ts.map +1 -0
- package/build/middleware/security.js +123 -0
- package/build/middleware/security.js.map +1 -0
- package/build/middleware/ui-dump.d.ts +23 -0
- package/build/middleware/ui-dump.d.ts.map +1 -0
- package/build/middleware/ui-dump.js +59 -0
- package/build/middleware/ui-dump.js.map +1 -0
- package/build/server.d.ts +18 -0
- package/build/server.d.ts.map +1 -0
- package/build/server.js +133 -0
- package/build/server.js.map +1 -0
- package/build/tool-context.d.ts +22 -0
- package/build/tool-context.d.ts.map +1 -0
- package/build/tool-context.js +9 -0
- package/build/tool-context.js.map +1 -0
- package/build/tools/accessibility.d.ts +10 -0
- package/build/tools/accessibility.d.ts.map +1 -0
- package/build/tools/accessibility.js +259 -0
- package/build/tools/accessibility.js.map +1 -0
- package/build/tools/at-commands.d.ts +20 -0
- package/build/tools/at-commands.d.ts.map +1 -0
- package/build/tools/at-commands.js +378 -0
- package/build/tools/at-commands.js.map +1 -0
- package/build/tools/baseband.d.ts +15 -0
- package/build/tools/baseband.d.ts.map +1 -0
- package/build/tools/baseband.js +323 -0
- package/build/tools/baseband.js.map +1 -0
- package/build/tools/build.d.ts +6 -0
- package/build/tools/build.d.ts.map +1 -0
- package/build/tools/build.js +80 -0
- package/build/tools/build.js.map +1 -0
- package/build/tools/ci.d.ts +9 -0
- package/build/tools/ci.d.ts.map +1 -0
- package/build/tools/ci.js +163 -0
- package/build/tools/ci.js.map +1 -0
- package/build/tools/control.d.ts +10 -0
- package/build/tools/control.d.ts.map +1 -0
- package/build/tools/control.js +197 -0
- package/build/tools/control.js.map +1 -0
- package/build/tools/device-farm.d.ts +10 -0
- package/build/tools/device-farm.d.ts.map +1 -0
- package/build/tools/device-farm.js +140 -0
- package/build/tools/device-farm.js.map +1 -0
- package/build/tools/device-profiles.d.ts +16 -0
- package/build/tools/device-profiles.d.ts.map +1 -0
- package/build/tools/device-profiles.js +272 -0
- package/build/tools/device-profiles.js.map +1 -0
- package/build/tools/device.d.ts +6 -0
- package/build/tools/device.d.ts.map +1 -0
- package/build/tools/device.js +72 -0
- package/build/tools/device.js.map +1 -0
- package/build/tools/diagnostics.d.ts +7 -0
- package/build/tools/diagnostics.d.ts.map +1 -0
- package/build/tools/diagnostics.js +153 -0
- package/build/tools/diagnostics.js.map +1 -0
- package/build/tools/emulator.d.ts +9 -0
- package/build/tools/emulator.d.ts.map +1 -0
- package/build/tools/emulator.js +223 -0
- package/build/tools/emulator.js.map +1 -0
- package/build/tools/files.d.ts +6 -0
- package/build/tools/files.d.ts.map +1 -0
- package/build/tools/files.js +78 -0
- package/build/tools/files.js.map +1 -0
- package/build/tools/firmware-analysis.d.ts +24 -0
- package/build/tools/firmware-analysis.d.ts.map +1 -0
- package/build/tools/firmware-analysis.js +623 -0
- package/build/tools/firmware-analysis.js.map +1 -0
- package/build/tools/forwarding.d.ts +7 -0
- package/build/tools/forwarding.d.ts.map +1 -0
- package/build/tools/forwarding.js +64 -0
- package/build/tools/forwarding.js.map +1 -0
- package/build/tools/health.d.ts +7 -0
- package/build/tools/health.d.ts.map +1 -0
- package/build/tools/health.js +112 -0
- package/build/tools/health.js.map +1 -0
- package/build/tools/logcat-watch.d.ts +11 -0
- package/build/tools/logcat-watch.d.ts.map +1 -0
- package/build/tools/logcat-watch.js +209 -0
- package/build/tools/logcat-watch.js.map +1 -0
- package/build/tools/logs.d.ts +6 -0
- package/build/tools/logs.d.ts.map +1 -0
- package/build/tools/logs.js +83 -0
- package/build/tools/logs.js.map +1 -0
- package/build/tools/mirroring.d.ts +14 -0
- package/build/tools/mirroring.d.ts.map +1 -0
- package/build/tools/mirroring.js +243 -0
- package/build/tools/mirroring.js.map +1 -0
- package/build/tools/multi-device.d.ts +9 -0
- package/build/tools/multi-device.d.ts.map +1 -0
- package/build/tools/multi-device.js +138 -0
- package/build/tools/multi-device.js.map +1 -0
- package/build/tools/network-capture.d.ts +10 -0
- package/build/tools/network-capture.d.ts.map +1 -0
- package/build/tools/network-capture.js +143 -0
- package/build/tools/network-capture.js.map +1 -0
- package/build/tools/network-discovery.d.ts +21 -0
- package/build/tools/network-discovery.d.ts.map +1 -0
- package/build/tools/network-discovery.js +284 -0
- package/build/tools/network-discovery.js.map +1 -0
- package/build/tools/ota-monitor.d.ts +16 -0
- package/build/tools/ota-monitor.d.ts.map +1 -0
- package/build/tools/ota-monitor.js +211 -0
- package/build/tools/ota-monitor.js.map +1 -0
- package/build/tools/packages.d.ts +6 -0
- package/build/tools/packages.d.ts.map +1 -0
- package/build/tools/packages.js +237 -0
- package/build/tools/packages.js.map +1 -0
- package/build/tools/plugins.d.ts +22 -0
- package/build/tools/plugins.d.ts.map +1 -0
- package/build/tools/plugins.js +118 -0
- package/build/tools/plugins.js.map +1 -0
- package/build/tools/prompts.d.ts +9 -0
- package/build/tools/prompts.d.ts.map +1 -0
- package/build/tools/prompts.js +94 -0
- package/build/tools/prompts.js.map +1 -0
- package/build/tools/qemu.d.ts +18 -0
- package/build/tools/qemu.d.ts.map +1 -0
- package/build/tools/qemu.js +791 -0
- package/build/tools/qemu.js.map +1 -0
- package/build/tools/registry.d.ts +13 -0
- package/build/tools/registry.d.ts.map +1 -0
- package/build/tools/registry.js +221 -0
- package/build/tools/registry.js.map +1 -0
- package/build/tools/regression.d.ts +10 -0
- package/build/tools/regression.d.ts.map +1 -0
- package/build/tools/regression.js +215 -0
- package/build/tools/regression.js.map +1 -0
- package/build/tools/resources.d.ts +10 -0
- package/build/tools/resources.d.ts.map +1 -0
- package/build/tools/resources.js +77 -0
- package/build/tools/resources.js.map +1 -0
- package/build/tools/ril-intercept.d.ts +24 -0
- package/build/tools/ril-intercept.d.ts.map +1 -0
- package/build/tools/ril-intercept.js +273 -0
- package/build/tools/ril-intercept.js.map +1 -0
- package/build/tools/screen-record.d.ts +9 -0
- package/build/tools/screen-record.d.ts.map +1 -0
- package/build/tools/screen-record.js +95 -0
- package/build/tools/screen-record.js.map +1 -0
- package/build/tools/screenshot-diff.d.ts +13 -0
- package/build/tools/screenshot-diff.d.ts.map +1 -0
- package/build/tools/screenshot-diff.js +370 -0
- package/build/tools/screenshot-diff.js.map +1 -0
- package/build/tools/selinux-audit.d.ts +17 -0
- package/build/tools/selinux-audit.d.ts.map +1 -0
- package/build/tools/selinux-audit.js +301 -0
- package/build/tools/selinux-audit.js.map +1 -0
- package/build/tools/shell.d.ts +6 -0
- package/build/tools/shell.d.ts.map +1 -0
- package/build/tools/shell.js +63 -0
- package/build/tools/shell.js.map +1 -0
- package/build/tools/snapshot.d.ts +9 -0
- package/build/tools/snapshot.d.ts.map +1 -0
- package/build/tools/snapshot.js +192 -0
- package/build/tools/snapshot.js.map +1 -0
- package/build/tools/split-apk.d.ts +13 -0
- package/build/tools/split-apk.d.ts.map +1 -0
- package/build/tools/split-apk.js +229 -0
- package/build/tools/split-apk.js.map +1 -0
- package/build/tools/test-gen.d.ts +14 -0
- package/build/tools/test-gen.d.ts.map +1 -0
- package/build/tools/test-gen.js +252 -0
- package/build/tools/test-gen.js.map +1 -0
- package/build/tools/testing.d.ts +9 -0
- package/build/tools/testing.d.ts.map +1 -0
- package/build/tools/testing.js +144 -0
- package/build/tools/testing.js.map +1 -0
- package/build/tools/thermal-power.d.ts +19 -0
- package/build/tools/thermal-power.d.ts.map +1 -0
- package/build/tools/thermal-power.js +330 -0
- package/build/tools/thermal-power.js.map +1 -0
- package/build/tools/ui.d.ts +6 -0
- package/build/tools/ui.d.ts.map +1 -0
- package/build/tools/ui.js +266 -0
- package/build/tools/ui.js.map +1 -0
- package/build/tools/wireless.d.ts +7 -0
- package/build/tools/wireless.d.ts.map +1 -0
- package/build/tools/wireless.js +78 -0
- package/build/tools/wireless.js.map +1 -0
- package/build/tools/workflow-market.d.ts +17 -0
- package/build/tools/workflow-market.d.ts.map +1 -0
- package/build/tools/workflow-market.js +237 -0
- package/build/tools/workflow-market.js.map +1 -0
- package/build/tools/workflow.d.ts +32 -0
- package/build/tools/workflow.d.ts.map +1 -0
- package/build/tools/workflow.js +374 -0
- package/build/tools/workflow.js.map +1 -0
- package/build/ws-transport.d.ts +30 -0
- package/build/ws-transport.d.ts.map +1 -0
- package/build/ws-transport.js +133 -0
- package/build/ws-transport.js.map +1 -0
- package/package.json +37 -0
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GraphQL API — Composed device query endpoint.
|
|
3
|
+
*
|
|
4
|
+
* Optional HTTP endpoint serving a GraphQL API over device state.
|
|
5
|
+
* Enables clients to compose multiple device queries into a single
|
|
6
|
+
* request — for example, fetching device info, battery, signal, and
|
|
7
|
+
* installed packages in one round trip instead of 4+ MCP tool calls.
|
|
8
|
+
*
|
|
9
|
+
* Requires the `graphql` npm package as an optional peer dependency:
|
|
10
|
+
* npm install graphql
|
|
11
|
+
*
|
|
12
|
+
* Set DA_GRAPHQL_PORT to enable. Runs independently from the MCP
|
|
13
|
+
* transport (stdio/HTTP/WebSocket).
|
|
14
|
+
*
|
|
15
|
+
* Endpoints:
|
|
16
|
+
* POST /graphql — GraphQL query execution
|
|
17
|
+
* GET /graphql — GraphQL query via query string (for introspection tools)
|
|
18
|
+
* GET /health — Health check
|
|
19
|
+
*
|
|
20
|
+
* Example query:
|
|
21
|
+
* { devices { serial model androidVersion battery { level charging } } }
|
|
22
|
+
*/
|
|
23
|
+
import { createServer as createHttpServer } from "http";
|
|
24
|
+
const SCHEMA_SDL = `
|
|
25
|
+
type Query {
|
|
26
|
+
devices: [Device!]!
|
|
27
|
+
device(serial: String): Device!
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
type Device {
|
|
31
|
+
serial: String!
|
|
32
|
+
state: String!
|
|
33
|
+
model: String!
|
|
34
|
+
manufacturer: String!
|
|
35
|
+
androidVersion: String!
|
|
36
|
+
sdkLevel: Int!
|
|
37
|
+
securityPatch: String!
|
|
38
|
+
buildId: String!
|
|
39
|
+
abi: String!
|
|
40
|
+
battery: Battery!
|
|
41
|
+
network: Network!
|
|
42
|
+
properties(keys: [String!]): [Property!]!
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
type Battery {
|
|
46
|
+
level: Int!
|
|
47
|
+
status: String!
|
|
48
|
+
charging: Boolean!
|
|
49
|
+
temperature: Float!
|
|
50
|
+
voltage: Float!
|
|
51
|
+
health: String!
|
|
52
|
+
technology: String!
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
type Network {
|
|
56
|
+
wifi: String!
|
|
57
|
+
ip: String!
|
|
58
|
+
operator: String!
|
|
59
|
+
networkType: String!
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
type Property {
|
|
63
|
+
key: String!
|
|
64
|
+
value: String!
|
|
65
|
+
}
|
|
66
|
+
`;
|
|
67
|
+
function parseBatteryDump(raw) {
|
|
68
|
+
const result = {};
|
|
69
|
+
for (const line of raw.split("\n")) {
|
|
70
|
+
const match = line.match(/^\s+(\S[\w\s]*\w):\s+(.*)/);
|
|
71
|
+
if (match)
|
|
72
|
+
result[match[1].trim()] = match[2].trim();
|
|
73
|
+
}
|
|
74
|
+
return result;
|
|
75
|
+
}
|
|
76
|
+
function buildResolvers(bridge, deviceManager) {
|
|
77
|
+
return {
|
|
78
|
+
devices: async () => {
|
|
79
|
+
const devices = await deviceManager.listDevices();
|
|
80
|
+
// Pre-fetch props for each device so field resolvers share one getprop call
|
|
81
|
+
const results = [];
|
|
82
|
+
for (const d of devices) {
|
|
83
|
+
let props = {};
|
|
84
|
+
if (d.state === "device") {
|
|
85
|
+
try {
|
|
86
|
+
props = await deviceManager.getDeviceProps(d.serial);
|
|
87
|
+
}
|
|
88
|
+
catch { /* offline */ }
|
|
89
|
+
}
|
|
90
|
+
results.push({ serial: d.serial, state: d.state, _serial: d.serial, _props: props });
|
|
91
|
+
}
|
|
92
|
+
return results;
|
|
93
|
+
},
|
|
94
|
+
device: async ({ serial }) => {
|
|
95
|
+
const resolved = await deviceManager.resolveDevice(serial);
|
|
96
|
+
const props = await deviceManager.getDeviceProps(resolved.serial);
|
|
97
|
+
return { serial: resolved.serial, state: "device", _serial: resolved.serial, _props: props };
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
function buildFieldResolvers(bridge, deviceManager) {
|
|
102
|
+
return {
|
|
103
|
+
Device: {
|
|
104
|
+
model: async (parent) => {
|
|
105
|
+
return parent._props["ro.product.model"] ?? "unknown";
|
|
106
|
+
},
|
|
107
|
+
manufacturer: async (parent) => {
|
|
108
|
+
return parent._props["ro.product.manufacturer"] ?? "unknown";
|
|
109
|
+
},
|
|
110
|
+
androidVersion: async (parent) => {
|
|
111
|
+
return parent._props["ro.build.version.release"] ?? "unknown";
|
|
112
|
+
},
|
|
113
|
+
sdkLevel: async (parent) => {
|
|
114
|
+
return parseInt(parent._props["ro.build.version.sdk"] ?? "0", 10) || 0;
|
|
115
|
+
},
|
|
116
|
+
securityPatch: async (parent) => {
|
|
117
|
+
return parent._props["ro.build.version.security_patch"] ?? "unknown";
|
|
118
|
+
},
|
|
119
|
+
buildId: async (parent) => {
|
|
120
|
+
return parent._props["ro.build.display.id"] ?? "unknown";
|
|
121
|
+
},
|
|
122
|
+
abi: async (parent) => {
|
|
123
|
+
return parent._props["ro.product.cpu.abi"] ?? "unknown";
|
|
124
|
+
},
|
|
125
|
+
battery: async (parent) => {
|
|
126
|
+
const result = await bridge.shell("dumpsys battery", { device: parent._serial });
|
|
127
|
+
const parsed = parseBatteryDump(result.stdout);
|
|
128
|
+
return {
|
|
129
|
+
level: parseInt(parsed["level"] ?? "0", 10),
|
|
130
|
+
status: parsed["status"] ?? "unknown",
|
|
131
|
+
charging: (parsed["status"] ?? "").includes("2") || (parsed["AC powered"] ?? "") === "true" || (parsed["USB powered"] ?? "") === "true",
|
|
132
|
+
temperature: parseFloat(parsed["temperature"] ?? "0") / 10,
|
|
133
|
+
voltage: parseFloat(parsed["voltage"] ?? "0") / 1000,
|
|
134
|
+
health: parsed["health"] ?? "unknown",
|
|
135
|
+
technology: parsed["technology"] ?? "unknown",
|
|
136
|
+
};
|
|
137
|
+
},
|
|
138
|
+
network: async (parent) => {
|
|
139
|
+
const props = parent._props;
|
|
140
|
+
const wifiResult = await bridge.shell("dumpsys wifi | grep 'mWifiInfo' | head -1", {
|
|
141
|
+
device: parent._serial, ignoreExitCode: true,
|
|
142
|
+
});
|
|
143
|
+
const ssidMatch = wifiResult.stdout.match(/SSID:\s*([^,]+)/);
|
|
144
|
+
const ipResult = await bridge.shell("ip route | grep 'src' | head -1", {
|
|
145
|
+
device: parent._serial, ignoreExitCode: true,
|
|
146
|
+
});
|
|
147
|
+
const ipMatch = ipResult.stdout.match(/src\s+(\d+\.\d+\.\d+\.\d+)/);
|
|
148
|
+
return {
|
|
149
|
+
wifi: ssidMatch ? ssidMatch[1].trim() : "disconnected",
|
|
150
|
+
ip: ipMatch ? ipMatch[1] : "unknown",
|
|
151
|
+
operator: props["gsm.operator.alpha"] ?? "unknown",
|
|
152
|
+
networkType: props["gsm.network.type"] ?? "unknown",
|
|
153
|
+
};
|
|
154
|
+
},
|
|
155
|
+
properties: async (parent, { keys }) => {
|
|
156
|
+
const props = parent._props;
|
|
157
|
+
if (keys) {
|
|
158
|
+
return keys.map((k) => ({ key: k, value: props[k] ?? "" }));
|
|
159
|
+
}
|
|
160
|
+
// Return all properties, capped at 500 to prevent response size explosion
|
|
161
|
+
const MAX_PROPERTIES = 500;
|
|
162
|
+
const entries = Object.entries(props);
|
|
163
|
+
const limited = entries.slice(0, MAX_PROPERTIES).map(([key, value]) => ({ key, value }));
|
|
164
|
+
if (entries.length > MAX_PROPERTIES) {
|
|
165
|
+
limited.push({ key: "_truncated", value: `${entries.length - MAX_PROPERTIES} properties omitted. Use keys parameter to query specific properties.` });
|
|
166
|
+
}
|
|
167
|
+
return limited;
|
|
168
|
+
},
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
/** Maximum POST body size (1 MB) to prevent memory exhaustion. */
|
|
173
|
+
const MAX_BODY_BYTES = 1024 * 1024;
|
|
174
|
+
/**
|
|
175
|
+
* Start a GraphQL API server.
|
|
176
|
+
* Requires the `graphql` npm package to be installed.
|
|
177
|
+
*/
|
|
178
|
+
export async function startGraphQLApi(bridge, deviceManager, options, logger) {
|
|
179
|
+
const host = options.host ?? "127.0.0.1";
|
|
180
|
+
// Dynamic import of graphql — optional dependency
|
|
181
|
+
let graphqlModule;
|
|
182
|
+
try {
|
|
183
|
+
const moduleName = "graphql";
|
|
184
|
+
const mod = await import(/* webpackIgnore: true */ moduleName);
|
|
185
|
+
graphqlModule = {
|
|
186
|
+
buildSchema: (mod.buildSchema ?? mod.default?.buildSchema),
|
|
187
|
+
graphql: (mod.graphql ?? mod.default?.graphql),
|
|
188
|
+
};
|
|
189
|
+
if (!graphqlModule.buildSchema || !graphqlModule.graphql) {
|
|
190
|
+
throw new Error("buildSchema or graphql not found in module");
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
logger.error("GraphQL API requires the 'graphql' npm package.\n" +
|
|
195
|
+
"Install with: npm install graphql\n" +
|
|
196
|
+
"Then restart DeepADB with DA_GRAPHQL_PORT set.");
|
|
197
|
+
throw new Error("Optional dependency 'graphql' not installed. Run: npm install graphql");
|
|
198
|
+
}
|
|
199
|
+
const schema = graphqlModule.buildSchema(SCHEMA_SDL);
|
|
200
|
+
const rootValue = buildResolvers(bridge, deviceManager);
|
|
201
|
+
const fieldResolvers = buildFieldResolvers(bridge, deviceManager);
|
|
202
|
+
// Custom field resolver that checks our type-specific resolvers
|
|
203
|
+
const fieldResolver = (source, _args, _context, info) => {
|
|
204
|
+
const typeResolvers = fieldResolvers[info.parentType.name];
|
|
205
|
+
if (typeResolvers && typeof typeResolvers[info.fieldName] === "function") {
|
|
206
|
+
return typeResolvers[info.fieldName](source, (_args ?? {}));
|
|
207
|
+
}
|
|
208
|
+
return source[info.fieldName];
|
|
209
|
+
};
|
|
210
|
+
const httpServer = createHttpServer(async (req, res) => {
|
|
211
|
+
// CORS
|
|
212
|
+
const allowedOrigin = process.env.DA_GRAPHQL_CORS_ORIGIN ?? "";
|
|
213
|
+
if (allowedOrigin) {
|
|
214
|
+
res.setHeader("Access-Control-Allow-Origin", allowedOrigin);
|
|
215
|
+
res.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
|
|
216
|
+
res.setHeader("Access-Control-Allow-Headers", "Content-Type");
|
|
217
|
+
}
|
|
218
|
+
if (req.method === "OPTIONS") {
|
|
219
|
+
res.writeHead(204);
|
|
220
|
+
res.end();
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
if (req.url === "/health" && req.method === "GET") {
|
|
224
|
+
res.writeHead(200, { "Content-Type": "application/json" });
|
|
225
|
+
res.end(JSON.stringify({ status: "ok", transport: "graphql", version: options.version ?? "unknown" }));
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
if (req.url?.startsWith("/graphql")) {
|
|
229
|
+
try {
|
|
230
|
+
let query = "";
|
|
231
|
+
let variables = {};
|
|
232
|
+
if (req.method === "POST") {
|
|
233
|
+
const body = await new Promise((resolve, reject) => {
|
|
234
|
+
let data = "";
|
|
235
|
+
let bytes = 0;
|
|
236
|
+
req.on("data", (chunk) => {
|
|
237
|
+
bytes += typeof chunk === "string" ? Buffer.byteLength(chunk) : chunk.length;
|
|
238
|
+
if (bytes > MAX_BODY_BYTES) {
|
|
239
|
+
req.destroy();
|
|
240
|
+
reject(new Error(`Request body exceeds ${MAX_BODY_BYTES} byte limit`));
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
data += chunk.toString();
|
|
244
|
+
});
|
|
245
|
+
req.on("end", () => resolve(data));
|
|
246
|
+
req.on("error", reject);
|
|
247
|
+
});
|
|
248
|
+
const parsed = JSON.parse(body);
|
|
249
|
+
query = parsed.query ?? "";
|
|
250
|
+
variables = parsed.variables ?? {};
|
|
251
|
+
}
|
|
252
|
+
else if (req.method === "GET") {
|
|
253
|
+
const url = new URL(req.url, `http://${host}`);
|
|
254
|
+
query = url.searchParams.get("query") ?? "";
|
|
255
|
+
const varsParam = url.searchParams.get("variables");
|
|
256
|
+
if (varsParam)
|
|
257
|
+
variables = JSON.parse(varsParam);
|
|
258
|
+
}
|
|
259
|
+
if (!query) {
|
|
260
|
+
res.writeHead(400, { "Content-Type": "application/json" });
|
|
261
|
+
res.end(JSON.stringify({ errors: [{ message: "Missing 'query' parameter" }] }));
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
265
|
+
const result = await graphqlModule.graphql({
|
|
266
|
+
schema,
|
|
267
|
+
source: query,
|
|
268
|
+
rootValue,
|
|
269
|
+
variableValues: variables,
|
|
270
|
+
fieldResolver: fieldResolver,
|
|
271
|
+
});
|
|
272
|
+
res.writeHead(200, { "Content-Type": "application/json" });
|
|
273
|
+
res.end(JSON.stringify(result));
|
|
274
|
+
}
|
|
275
|
+
catch (err) {
|
|
276
|
+
res.writeHead(500, { "Content-Type": "application/json" });
|
|
277
|
+
res.end(JSON.stringify({ errors: [{ message: err instanceof Error ? err.message : String(err) }] }));
|
|
278
|
+
}
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
res.writeHead(404, { "Content-Type": "application/json" });
|
|
282
|
+
res.end(JSON.stringify({ error: "Not found. Use POST /graphql or GET /health" }));
|
|
283
|
+
});
|
|
284
|
+
return new Promise((resolve, reject) => {
|
|
285
|
+
httpServer.on("error", (err) => {
|
|
286
|
+
logger.error(`GraphQL API failed to start: ${err.message}`);
|
|
287
|
+
reject(err);
|
|
288
|
+
});
|
|
289
|
+
httpServer.listen(options.port, host, () => {
|
|
290
|
+
logger.info(`GraphQL API listening on http://${host}:${options.port}/graphql`);
|
|
291
|
+
logger.info(` Health check: http://${host}:${options.port}/health`);
|
|
292
|
+
resolve();
|
|
293
|
+
});
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
//# sourceMappingURL=graphql-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphql-api.js","sourceRoot":"","sources":["../src/graphql-api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,YAAY,IAAI,gBAAgB,EAAmC,MAAM,MAAM,CAAC;AAWzF,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0ClB,CAAC;AAEF,SAAS,gBAAgB,CAAC,GAAW;IACnC,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;QACtD,IAAI,KAAK;YAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACvD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,cAAc,CAAC,MAAiB,EAAE,aAA4B;IACrE,OAAO;QACL,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,WAAW,EAAE,CAAC;YAClD,4EAA4E;YAC5E,MAAM,OAAO,GAAG,EAAE,CAAC;YACnB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,IAAI,KAAK,GAA2B,EAAE,CAAC;gBACvC,IAAI,CAAC,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;oBACzB,IAAI,CAAC;wBAAC,KAAK,GAAG,MAAM,aAAa,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;oBAAC,CAAC;oBAAC,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC;gBACvF,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YACvF,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAuB,EAAE,EAAE;YAChD,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAC3D,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAClE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAC/F,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAiB,EAAE,aAA4B;IAC1E,OAAO;QACL,MAAM,EAAE;YACN,KAAK,EAAE,KAAK,EAAE,MAA2D,EAAE,EAAE;gBAC3E,OAAO,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,IAAI,SAAS,CAAC;YACxD,CAAC;YACD,YAAY,EAAE,KAAK,EAAE,MAA2D,EAAE,EAAE;gBAClF,OAAO,MAAM,CAAC,MAAM,CAAC,yBAAyB,CAAC,IAAI,SAAS,CAAC;YAC/D,CAAC;YACD,cAAc,EAAE,KAAK,EAAE,MAA2D,EAAE,EAAE;gBACpF,OAAO,MAAM,CAAC,MAAM,CAAC,0BAA0B,CAAC,IAAI,SAAS,CAAC;YAChE,CAAC;YACD,QAAQ,EAAE,KAAK,EAAE,MAA2D,EAAE,EAAE;gBAC9E,OAAO,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;YACzE,CAAC;YACD,aAAa,EAAE,KAAK,EAAE,MAA2D,EAAE,EAAE;gBACnF,OAAO,MAAM,CAAC,MAAM,CAAC,iCAAiC,CAAC,IAAI,SAAS,CAAC;YACvE,CAAC;YACD,OAAO,EAAE,KAAK,EAAE,MAA2D,EAAE,EAAE;gBAC7E,OAAO,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,IAAI,SAAS,CAAC;YAC3D,CAAC;YACD,GAAG,EAAE,KAAK,EAAE,MAA2D,EAAE,EAAE;gBACzE,OAAO,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,IAAI,SAAS,CAAC;YAC1D,CAAC;YACD,OAAO,EAAE,KAAK,EAAE,MAA2D,EAAE,EAAE;gBAC7E,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;gBACjF,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAC/C,OAAO;oBACL,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC;oBAC3C,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,SAAS;oBACrC,QAAQ,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM;oBACvI,WAAW,EAAE,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE;oBAC1D,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,GAAG,IAAI;oBACpD,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,SAAS;oBACrC,UAAU,EAAE,MAAM,CAAC,YAAY,CAAC,IAAI,SAAS;iBAC9C,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,KAAK,EAAE,MAA2D,EAAE,EAAE;gBAC7E,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;gBAC5B,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,2CAA2C,EAAE;oBACjF,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI;iBAC7C,CAAC,CAAC;gBACH,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;gBAC7D,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE;oBACrE,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI;iBAC7C,CAAC,CAAC;gBACH,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;gBAEpE,OAAO;oBACL,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,cAAc;oBACtD,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;oBACpC,QAAQ,EAAE,KAAK,CAAC,oBAAoB,CAAC,IAAI,SAAS;oBAClD,WAAW,EAAE,KAAK,CAAC,kBAAkB,CAAC,IAAI,SAAS;iBACpD,CAAC;YACJ,CAAC;YACD,UAAU,EAAE,KAAK,EAAE,MAA2D,EAAE,EAAE,IAAI,EAAuB,EAAE,EAAE;gBAC/G,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;gBAC5B,IAAI,IAAI,EAAE,CAAC;oBACT,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;gBAC9D,CAAC;gBACD,0EAA0E;gBAC1E,MAAM,cAAc,GAAG,GAAG,CAAC;gBAC3B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBACtC,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;gBACzF,IAAI,OAAO,CAAC,MAAM,GAAG,cAAc,EAAE,CAAC;oBACpC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,cAAc,uEAAuE,EAAE,CAAC,CAAC;gBACxJ,CAAC;gBACD,OAAO,OAAO,CAAC;YACjB,CAAC;SACF;KACF,CAAC;AACJ,CAAC;AAED,kEAAkE;AAClE,MAAM,cAAc,GAAG,IAAI,GAAG,IAAI,CAAC;AAEnC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAiB,EACjB,aAA4B,EAC5B,OAAuB,EACvB,MAAc;IAEd,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,WAAW,CAAC;IAEzC,kDAAkD;IAClD,IAAI,aAGH,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,SAAS,CAAC;QAC7B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,UAAU,CAA4B,CAAC;QAC1F,aAAa,GAAG;YACd,WAAW,EAAE,CAAC,GAAG,CAAC,WAAW,IAAK,GAAG,CAAC,OAAmC,EAAE,WAAW,CAAqC;YAC3H,OAAO,EAAE,CAAC,GAAG,CAAC,OAAO,IAAK,GAAG,CAAC,OAAmC,EAAE,OAAO,CAAiC;SAC5G,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,WAAW,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;YACzD,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,KAAK,CACV,mDAAmD;YACnD,qCAAqC;YACrC,gDAAgD,CACjD,CAAC;QACF,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;IAC3F,CAAC;IAED,MAAM,MAAM,GAAG,aAAa,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACxD,MAAM,cAAc,GAAG,mBAAmB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAElE,gEAAgE;IAChE,MAAM,aAAa,GAAG,CAAC,MAA+B,EAAE,KAAc,EAAE,QAAiB,EAAE,IAAyD,EAAE,EAAE;QACtJ,MAAM,aAAa,GAAI,cAA0D,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACxG,IAAI,aAAa,IAAI,OAAO,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,UAAU,EAAE,CAAC;YACzE,OAAQ,aAAa,CAAC,IAAI,CAAC,SAAS,CAAiD,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,EAAE,CAA4B,CAAC,CAAC;QAC1I,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAChC,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,EAAE,GAAoB,EAAE,GAAmB,EAAE,EAAE;QACtF,OAAO;QACP,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,EAAE,CAAC;QAC/D,IAAI,aAAa,EAAE,CAAC;YAClB,GAAG,CAAC,SAAS,CAAC,6BAA6B,EAAE,aAAa,CAAC,CAAC;YAC5D,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,oBAAoB,CAAC,CAAC;YACpE,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,cAAc,CAAC,CAAC;QAChE,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC7B,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACnB,GAAG,CAAC,GAAG,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YAClD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC;YACvG,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC;gBACH,IAAI,KAAK,GAAG,EAAE,CAAC;gBACf,IAAI,SAAS,GAA4B,EAAE,CAAC;gBAE5C,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;oBAC1B,MAAM,IAAI,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;wBACzD,IAAI,IAAI,GAAG,EAAE,CAAC;wBACd,IAAI,KAAK,GAAG,CAAC,CAAC;wBACd,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAsB,EAAE,EAAE;4BACxC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;4BAC7E,IAAI,KAAK,GAAG,cAAc,EAAE,CAAC;gCAC3B,GAAG,CAAC,OAAO,EAAE,CAAC;gCACd,MAAM,CAAC,IAAI,KAAK,CAAC,wBAAwB,cAAc,aAAa,CAAC,CAAC,CAAC;gCACvE,OAAO;4BACT,CAAC;4BACD,IAAI,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;wBAC3B,CAAC,CAAC,CAAC;wBACH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;wBACnC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;oBAC1B,CAAC,CAAC,CAAC;oBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAChC,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;oBAC3B,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;gBACrC,CAAC;qBAAM,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;oBAChC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC;oBAC/C,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;oBAC5C,MAAM,SAAS,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;oBACpD,IAAI,SAAS;wBAAE,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;gBACnD,CAAC;gBAED,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;oBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,2BAA2B,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;oBAChF,OAAO;gBACT,CAAC;gBAED,8DAA8D;gBAC9D,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC;oBACzC,MAAM;oBACN,MAAM,EAAE,KAAK;oBACb,SAAS;oBACT,cAAc,EAAE,SAAS;oBACzB,aAAa,EAAE,aAAoB;iBAC7B,CAAC,CAAC;gBAEV,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;YAClC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACvG,CAAC;YACD,OAAO;QACT,CAAC;QAED,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,6CAA6C,EAAE,CAAC,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;IAEH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YAC7B,MAAM,CAAC,KAAK,CAAC,gCAAgC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC5D,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE;YACzC,MAAM,CAAC,IAAI,CAAC,mCAAmC,IAAI,IAAI,OAAO,CAAC,IAAI,UAAU,CAAC,CAAC;YAC/E,MAAM,CAAC,IAAI,CAAC,0BAA0B,IAAI,IAAI,OAAO,CAAC,IAAI,SAAS,CAAC,CAAC;YACrE,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP/SSE Transport — Alternative to stdio for browser-based MCP clients.
|
|
3
|
+
*
|
|
4
|
+
* When DA_HTTP_PORT is set, DeepADB starts an HTTP server instead of
|
|
5
|
+
* the stdio transport. Clients connect via Server-Sent Events.
|
|
6
|
+
*
|
|
7
|
+
* Endpoints:
|
|
8
|
+
* GET /sse — SSE stream (client subscribes here)
|
|
9
|
+
* POST /message — Client sends JSON-RPC messages here
|
|
10
|
+
* GET /health — Simple health check
|
|
11
|
+
*
|
|
12
|
+
* Uses the MCP SDK's SSEServerTransport.
|
|
13
|
+
*/
|
|
14
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
15
|
+
import { Logger } from "./middleware/logger.js";
|
|
16
|
+
export interface HttpTransportOptions {
|
|
17
|
+
port: number;
|
|
18
|
+
host?: string;
|
|
19
|
+
version?: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Start an HTTP server that provides SSE-based MCP transport.
|
|
23
|
+
* Each SSE connection creates a new transport session.
|
|
24
|
+
*/
|
|
25
|
+
export declare function startHttpTransport(server: McpServer, options: HttpTransportOptions, logger: Logger): Promise<void>;
|
|
26
|
+
//# sourceMappingURL=http-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-transport.d.ts","sourceRoot":"","sources":["../src/http-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAEhD,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,oBAAoB,EAC7B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAiGf"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP/SSE Transport — Alternative to stdio for browser-based MCP clients.
|
|
3
|
+
*
|
|
4
|
+
* When DA_HTTP_PORT is set, DeepADB starts an HTTP server instead of
|
|
5
|
+
* the stdio transport. Clients connect via Server-Sent Events.
|
|
6
|
+
*
|
|
7
|
+
* Endpoints:
|
|
8
|
+
* GET /sse — SSE stream (client subscribes here)
|
|
9
|
+
* POST /message — Client sends JSON-RPC messages here
|
|
10
|
+
* GET /health — Simple health check
|
|
11
|
+
*
|
|
12
|
+
* Uses the MCP SDK's SSEServerTransport.
|
|
13
|
+
*/
|
|
14
|
+
import { createServer as createHttpServer } from "http";
|
|
15
|
+
import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js";
|
|
16
|
+
/**
|
|
17
|
+
* Start an HTTP server that provides SSE-based MCP transport.
|
|
18
|
+
* Each SSE connection creates a new transport session.
|
|
19
|
+
*/
|
|
20
|
+
export async function startHttpTransport(server, options, logger) {
|
|
21
|
+
const host = options.host ?? "127.0.0.1";
|
|
22
|
+
let activeTransport = null;
|
|
23
|
+
const httpServer = createHttpServer(async (req, res) => {
|
|
24
|
+
try {
|
|
25
|
+
// CORS headers — restrict to configured origin (default: deny cross-origin)
|
|
26
|
+
const allowedOrigin = process.env.DA_HTTP_CORS_ORIGIN ?? "";
|
|
27
|
+
if (allowedOrigin) {
|
|
28
|
+
res.setHeader("Access-Control-Allow-Origin", allowedOrigin);
|
|
29
|
+
res.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
|
|
30
|
+
res.setHeader("Access-Control-Allow-Headers", "Content-Type");
|
|
31
|
+
}
|
|
32
|
+
if (req.method === "OPTIONS") {
|
|
33
|
+
res.writeHead(204);
|
|
34
|
+
res.end();
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const url = new URL(req.url ?? "/", `http://${host}:${options.port}`);
|
|
38
|
+
// Health check
|
|
39
|
+
if (url.pathname === "/health" && req.method === "GET") {
|
|
40
|
+
res.writeHead(200, { "Content-Type": "application/json" });
|
|
41
|
+
res.end(JSON.stringify({ status: "ok", transport: "sse", version: options.version ?? "unknown" }));
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
// SSE endpoint — client subscribes here
|
|
45
|
+
if (url.pathname === "/sse" && req.method === "GET") {
|
|
46
|
+
logger.info(`SSE client connected from ${req.socket.remoteAddress}`);
|
|
47
|
+
// Close previous transport if any (single-client model)
|
|
48
|
+
if (activeTransport) {
|
|
49
|
+
logger.warn("New SSE connection replacing existing one.");
|
|
50
|
+
}
|
|
51
|
+
const transport = new SSEServerTransport("/message", res);
|
|
52
|
+
activeTransport = transport;
|
|
53
|
+
// When the SSE connection closes, clean up
|
|
54
|
+
req.on("close", () => {
|
|
55
|
+
logger.info("SSE client disconnected.");
|
|
56
|
+
if (activeTransport === transport) {
|
|
57
|
+
activeTransport = null;
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
await server.connect(transport);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
// Message endpoint — client sends JSON-RPC here
|
|
64
|
+
if (url.pathname === "/message" && req.method === "POST") {
|
|
65
|
+
if (!activeTransport) {
|
|
66
|
+
res.writeHead(503, { "Content-Type": "application/json" });
|
|
67
|
+
res.end(JSON.stringify({ error: "No active SSE session. Connect to /sse first." }));
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
await activeTransport.handlePostMessage(req, res);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
// 404 for everything else
|
|
74
|
+
res.writeHead(404, { "Content-Type": "application/json" });
|
|
75
|
+
res.end(JSON.stringify({
|
|
76
|
+
error: "Not found",
|
|
77
|
+
endpoints: {
|
|
78
|
+
"GET /sse": "SSE stream for MCP client",
|
|
79
|
+
"POST /message": "JSON-RPC messages",
|
|
80
|
+
"GET /health": "Health check",
|
|
81
|
+
},
|
|
82
|
+
}));
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
logger.error(`HTTP request error: ${err instanceof Error ? err.message : err}`);
|
|
86
|
+
if (!res.headersSent) {
|
|
87
|
+
res.writeHead(500, { "Content-Type": "application/json" });
|
|
88
|
+
res.end(JSON.stringify({ error: "Internal server error" }));
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
return new Promise((resolve, reject) => {
|
|
93
|
+
httpServer.on("error", (err) => {
|
|
94
|
+
logger.error(`HTTP transport failed to start: ${err.message}`);
|
|
95
|
+
reject(err);
|
|
96
|
+
});
|
|
97
|
+
httpServer.listen(options.port, host, () => {
|
|
98
|
+
logger.info(`HTTP/SSE transport listening on http://${host}:${options.port}`);
|
|
99
|
+
logger.info(` SSE endpoint: http://${host}:${options.port}/sse`);
|
|
100
|
+
logger.info(` Message endpoint: http://${host}:${options.port}/message`);
|
|
101
|
+
resolve();
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=http-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-transport.js","sourceRoot":"","sources":["../src/http-transport.ts"],"names":[],"mappings":"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"}
|
package/build/index.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* DeepADB — MCP Server for Android Debug Bridge
|
|
4
|
+
*
|
|
5
|
+
* Entry point. Supports three transport modes (mutually exclusive):
|
|
6
|
+
* - stdio (default) — JSON-RPC over stdin/stdout for Claude Code
|
|
7
|
+
* - HTTP/SSE — Set DA_HTTP_PORT to enable browser-based MCP clients
|
|
8
|
+
* - WebSocket — Set DA_WS_PORT to enable bidirectional streaming (requires `ws` package)
|
|
9
|
+
*
|
|
10
|
+
* Additionally supports an independent GraphQL API endpoint:
|
|
11
|
+
* - GraphQL — Set DA_GRAPHQL_PORT for composed device queries (requires `graphql` package)
|
|
12
|
+
*/
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;GAUG"}
|
package/build/index.js
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* DeepADB — MCP Server for Android Debug Bridge
|
|
4
|
+
*
|
|
5
|
+
* Entry point. Supports three transport modes (mutually exclusive):
|
|
6
|
+
* - stdio (default) — JSON-RPC over stdin/stdout for Claude Code
|
|
7
|
+
* - HTTP/SSE — Set DA_HTTP_PORT to enable browser-based MCP clients
|
|
8
|
+
* - WebSocket — Set DA_WS_PORT to enable bidirectional streaming (requires `ws` package)
|
|
9
|
+
*
|
|
10
|
+
* Additionally supports an independent GraphQL API endpoint:
|
|
11
|
+
* - GraphQL — Set DA_GRAPHQL_PORT for composed device queries (requires `graphql` package)
|
|
12
|
+
*/
|
|
13
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
14
|
+
import { createServer } from "./server.js";
|
|
15
|
+
import { startHttpTransport } from "./http-transport.js";
|
|
16
|
+
import { startWsTransport } from "./ws-transport.js";
|
|
17
|
+
import { startGraphQLApi } from "./graphql-api.js";
|
|
18
|
+
async function main() {
|
|
19
|
+
const { server, logger, bridge, deviceManager } = await createServer();
|
|
20
|
+
/** Parse a port env var safely — returns null if unset, NaN, out of range, or negative. */
|
|
21
|
+
function parsePort(envVar) {
|
|
22
|
+
if (!envVar)
|
|
23
|
+
return null;
|
|
24
|
+
const port = parseInt(envVar, 10);
|
|
25
|
+
if (isNaN(port) || port < 1 || port > 65535) {
|
|
26
|
+
console.error(`[DeepADB] Invalid port "${envVar}" — must be 1-65535. Ignoring.`);
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
return port;
|
|
30
|
+
}
|
|
31
|
+
const httpPort = parsePort(process.env.DA_HTTP_PORT);
|
|
32
|
+
const httpHost = process.env.DA_HTTP_HOST ?? "127.0.0.1";
|
|
33
|
+
const wsPort = parsePort(process.env.DA_WS_PORT);
|
|
34
|
+
const graphqlPort = parsePort(process.env.DA_GRAPHQL_PORT);
|
|
35
|
+
// GraphQL API runs independently alongside any transport mode
|
|
36
|
+
if (graphqlPort) {
|
|
37
|
+
try {
|
|
38
|
+
await startGraphQLApi(bridge, deviceManager, { port: graphqlPort, host: httpHost, version: "1.0.0" }, logger);
|
|
39
|
+
console.error(`[DeepADB] GraphQL API running on http://${httpHost}:${graphqlPort}/graphql`);
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
console.error(`[DeepADB] GraphQL API failed to start: ${err instanceof Error ? err.message : err}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (httpPort) {
|
|
46
|
+
// HTTP/SSE mode — start HTTP server
|
|
47
|
+
await startHttpTransport(server, { port: httpPort, host: httpHost, version: "1.0.0" }, logger);
|
|
48
|
+
console.error(`[DeepADB] HTTP/SSE transport running on http://${httpHost}:${httpPort}`);
|
|
49
|
+
}
|
|
50
|
+
else if (wsPort) {
|
|
51
|
+
// WebSocket mode — requires `ws` npm package
|
|
52
|
+
await startWsTransport(server, { port: wsPort, host: httpHost, version: "1.0.0" }, logger);
|
|
53
|
+
console.error(`[DeepADB] WebSocket transport running on ws://${httpHost}:${wsPort}/ws`);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
// Default: stdio mode
|
|
57
|
+
const transport = new StdioServerTransport();
|
|
58
|
+
await server.connect(transport);
|
|
59
|
+
console.error("[DeepADB] Server running on stdio transport. Ready for connections.");
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
main().catch((error) => {
|
|
63
|
+
console.error("[DeepADB] Fatal error:", error);
|
|
64
|
+
process.exit(1);
|
|
65
|
+
});
|
|
66
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chipset Detection — Shared chipset family identification, modem path mapping,
|
|
3
|
+
* and SIM configuration detection.
|
|
4
|
+
*
|
|
5
|
+
* Used by at-commands.ts, baseband.ts, and device-profiles.ts to avoid
|
|
6
|
+
* duplicated detection logic. Single source of truth for chipset family
|
|
7
|
+
* classification, known modem device node paths, and dual SIM detection.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Known modem device node paths by chipset family.
|
|
11
|
+
* Ordered by likelihood — detection tries each path until one responds.
|
|
12
|
+
*/
|
|
13
|
+
export declare const MODEM_PATHS: Record<string, string[]>;
|
|
14
|
+
/**
|
|
15
|
+
* Detect the chipset family from device properties.
|
|
16
|
+
* Returns the family key for MODEM_PATHS lookup.
|
|
17
|
+
*/
|
|
18
|
+
export declare function detectChipsetFamily(props: Record<string, string>): string;
|
|
19
|
+
export interface SimConfig {
|
|
20
|
+
dualSim: boolean;
|
|
21
|
+
simSlots: number;
|
|
22
|
+
multisimMode: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Detect SIM configuration from device properties.
|
|
26
|
+
* Returns dual SIM status, slot count, and multisim mode string.
|
|
27
|
+
*/
|
|
28
|
+
export declare function detectSimConfig(props: Record<string, string>): SimConfig;
|
|
29
|
+
//# sourceMappingURL=chipset.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chipset.d.ts","sourceRoot":"","sources":["../../src/middleware/chipset.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAgDhD,CAAC;AAEF;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAkDzE;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAKD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAOxE"}
|