@zhhoceanfly/protoview 0.0.0-stage → 0.1.3

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.
@@ -0,0 +1,326 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.invokeWebSocket = invokeWebSocket;
37
+ const http = __importStar(require("http"));
38
+ const https = __importStar(require("https"));
39
+ /**
40
+ * Lightweight WebSocket client (text frames) without extra dependencies.
41
+ * Sends Message JSON as one text frame, then collects server text frames.
42
+ */
43
+ async function invokeWebSocket(req) {
44
+ const started = Date.now();
45
+ const hostRaw = (req.host || "").trim();
46
+ const path = req.httpPath || "/";
47
+ const label = `WS ${path}`;
48
+ const base = {
49
+ id: req.id,
50
+ host: hostRaw,
51
+ method: label,
52
+ ms: 0,
53
+ };
54
+ if (!hostRaw) {
55
+ return { ...base, ok: false, status: "INVALID", error: "未配置地址" };
56
+ }
57
+ let url;
58
+ try {
59
+ url = buildWsUrl(hostRaw, path, Boolean(req.tls));
60
+ }
61
+ catch (error) {
62
+ return {
63
+ ...base,
64
+ ok: false,
65
+ status: "INVALID",
66
+ ms: Date.now() - started,
67
+ error: `地址无效:${error.message}`,
68
+ };
69
+ }
70
+ const headers = {};
71
+ for (const [name, value] of Object.entries(req.metadata ?? {})) {
72
+ if (name.trim())
73
+ headers[name.trim().toLowerCase()] = String(value ?? "");
74
+ }
75
+ const payload = typeof req.body === "string" ? req.body : JSON.stringify(req.body ?? {});
76
+ const maxMessages = Math.min(100, Math.max(1, Math.floor(req.maxMessages || 20)));
77
+ const timeoutMs = Math.min(60000, Math.max(1000, Math.floor(req.timeoutMs || 8000)));
78
+ try {
79
+ const messages = await wsExchange(url, headers, payload, maxMessages, timeoutMs);
80
+ return {
81
+ ...base,
82
+ ok: true,
83
+ status: "101",
84
+ code: 101,
85
+ ms: Date.now() - started,
86
+ host: url.host,
87
+ method: `WS ${url.pathname}${url.search}`,
88
+ body: {
89
+ messages: messages.map(tryParse),
90
+ count: messages.length,
91
+ },
92
+ };
93
+ }
94
+ catch (error) {
95
+ return {
96
+ ...base,
97
+ ok: false,
98
+ status: "ERROR",
99
+ ms: Date.now() - started,
100
+ host: url.host,
101
+ error: error.message || String(error),
102
+ };
103
+ }
104
+ }
105
+ function buildWsUrl(hostRaw, path, tls) {
106
+ if (/^wss?:\/\//i.test(path))
107
+ return new URL(path);
108
+ if (/^https?:\/\//i.test(path)) {
109
+ const u = new URL(path);
110
+ u.protocol = u.protocol === "https:" ? "wss:" : "ws:";
111
+ return u;
112
+ }
113
+ if (/^wss?:\/\//i.test(hostRaw)) {
114
+ const base = new URL(hostRaw.endsWith("/") ? hostRaw : `${hostRaw}/`);
115
+ return new URL(path.startsWith("/") ? path : `/${path}`, base);
116
+ }
117
+ if (/^https?:\/\//i.test(hostRaw)) {
118
+ const httpUrl = new URL(hostRaw);
119
+ const ws = new URL(httpUrl.toString());
120
+ ws.protocol = httpUrl.protocol === "https:" ? "wss:" : "ws:";
121
+ return new URL(path.startsWith("/") ? path : `/${path}`, ws);
122
+ }
123
+ const origin = `${tls ? "wss" : "ws"}://${hostRaw}`;
124
+ const base = new URL(origin.endsWith("/") ? origin : `${origin}/`);
125
+ return new URL(path.startsWith("/") ? path : `/${path}`, base);
126
+ }
127
+ function wsExchange(url, extraHeaders, payload, maxMessages, timeoutMs) {
128
+ return new Promise((resolve, reject) => {
129
+ const key = randomKey();
130
+ const isSecure = url.protocol === "wss:";
131
+ const lib = isSecure ? https : http;
132
+ const port = url.port ? Number(url.port) : isSecure ? 443 : 80;
133
+ const messages = [];
134
+ let settled = false;
135
+ let socket;
136
+ let buffer = Buffer.alloc(0);
137
+ const done = (err) => {
138
+ if (settled)
139
+ return;
140
+ settled = true;
141
+ clearTimeout(timer);
142
+ try {
143
+ socket?.destroy();
144
+ }
145
+ catch { /* ignore */ }
146
+ if (err)
147
+ reject(err);
148
+ else
149
+ resolve(messages);
150
+ };
151
+ const timer = setTimeout(() => {
152
+ if (messages.length)
153
+ done();
154
+ else
155
+ done(new Error("WebSocket 等待响应超时"));
156
+ }, timeoutMs);
157
+ const req = lib.request({
158
+ protocol: isSecure ? "https:" : "http:",
159
+ hostname: url.hostname,
160
+ port,
161
+ path: `${url.pathname}${url.search}`,
162
+ method: "GET",
163
+ headers: {
164
+ host: url.host,
165
+ upgrade: "websocket",
166
+ connection: "Upgrade",
167
+ "sec-websocket-key": key,
168
+ "sec-websocket-version": "13",
169
+ ...extraHeaders,
170
+ },
171
+ timeout: timeoutMs,
172
+ });
173
+ req.on("upgrade", (res, sock, head) => {
174
+ if (res.statusCode !== 101) {
175
+ done(new Error(`WebSocket 升级失败:HTTP ${res.statusCode}`));
176
+ return;
177
+ }
178
+ socket = sock;
179
+ if (head?.length)
180
+ buffer = Buffer.concat([buffer, head]);
181
+ sock.on("data", (chunk) => {
182
+ buffer = Buffer.concat([buffer, chunk]);
183
+ while (true) {
184
+ const parsed = parseFrame(buffer);
185
+ if (!parsed)
186
+ break;
187
+ buffer = Buffer.from(parsed.rest);
188
+ if (parsed.opcode === 0x8) {
189
+ done();
190
+ return;
191
+ }
192
+ if (parsed.opcode === 0x1 || parsed.opcode === 0x2) {
193
+ messages.push(parsed.payload.toString("utf8"));
194
+ if (messages.length >= maxMessages) {
195
+ try {
196
+ sock.write(closeFrame());
197
+ }
198
+ catch { /* ignore */ }
199
+ done();
200
+ return;
201
+ }
202
+ }
203
+ else if (parsed.opcode === 0x9) {
204
+ try {
205
+ sock.write(pongFrame(parsed.payload));
206
+ }
207
+ catch { /* ignore */ }
208
+ }
209
+ }
210
+ });
211
+ sock.on("error", (err) => done(err));
212
+ sock.on("close", () => done());
213
+ try {
214
+ sock.write(textFrame(payload));
215
+ }
216
+ catch (err) {
217
+ done(err);
218
+ }
219
+ });
220
+ req.on("response", (res) => {
221
+ const chunks = [];
222
+ res.on("data", (c) => chunks.push(Buffer.from(c)));
223
+ res.on("end", () => {
224
+ const body = Buffer.concat(chunks).toString("utf8").slice(0, 500);
225
+ done(new Error(`WebSocket 握手失败:HTTP ${res.statusCode}${body ? ` ${body}` : ""}`));
226
+ });
227
+ });
228
+ req.on("timeout", () => {
229
+ req.destroy();
230
+ done(new Error("WebSocket 连接超时"));
231
+ });
232
+ req.on("error", (err) => done(err));
233
+ req.end();
234
+ });
235
+ }
236
+ function randomKey() {
237
+ return Buffer.from(Array.from({ length: 16 }, () => Math.floor(Math.random() * 256))).toString("base64");
238
+ }
239
+ function textFrame(text) {
240
+ const data = Buffer.from(text, "utf8");
241
+ const len = data.length;
242
+ const mask = Buffer.from(Array.from({ length: 4 }, () => Math.floor(Math.random() * 256)));
243
+ let header;
244
+ if (len < 126) {
245
+ header = Buffer.alloc(2);
246
+ header[0] = 0x81;
247
+ header[1] = 0x80 | len;
248
+ }
249
+ else if (len < 65536) {
250
+ header = Buffer.alloc(4);
251
+ header[0] = 0x81;
252
+ header[1] = 0x80 | 126;
253
+ header.writeUInt16BE(len, 2);
254
+ }
255
+ else {
256
+ header = Buffer.alloc(10);
257
+ header[0] = 0x81;
258
+ header[1] = 0x80 | 127;
259
+ header.writeBigUInt64BE(BigInt(len), 2);
260
+ }
261
+ const masked = Buffer.alloc(len);
262
+ for (let i = 0; i < len; i++)
263
+ masked[i] = data[i] ^ mask[i % 4];
264
+ return Buffer.concat([header, mask, masked]);
265
+ }
266
+ function closeFrame() {
267
+ const mask = Buffer.from([1, 2, 3, 4]);
268
+ return Buffer.from([0x88, 0x80, ...mask]);
269
+ }
270
+ function pongFrame(payload) {
271
+ const len = payload.length;
272
+ const mask = Buffer.from(Array.from({ length: 4 }, () => Math.floor(Math.random() * 256)));
273
+ const header = Buffer.from([0x8a, 0x80 | len]);
274
+ const masked = Buffer.alloc(len);
275
+ for (let i = 0; i < len; i++)
276
+ masked[i] = payload[i] ^ mask[i % 4];
277
+ return Buffer.concat([header, mask, masked]);
278
+ }
279
+ function parseFrame(buf) {
280
+ if (buf.length < 2)
281
+ return null;
282
+ const opcode = buf[0] & 0x0f;
283
+ const masked = (buf[1] & 0x80) !== 0;
284
+ let len = buf[1] & 0x7f;
285
+ let offset = 2;
286
+ if (len === 126) {
287
+ if (buf.length < 4)
288
+ return null;
289
+ len = buf.readUInt16BE(2);
290
+ offset = 4;
291
+ }
292
+ else if (len === 127) {
293
+ if (buf.length < 10)
294
+ return null;
295
+ const big = buf.readBigUInt64BE(2);
296
+ if (big > BigInt(Number.MAX_SAFE_INTEGER))
297
+ return null;
298
+ len = Number(big);
299
+ offset = 10;
300
+ }
301
+ const maskLen = masked ? 4 : 0;
302
+ if (buf.length < offset + maskLen + len)
303
+ return null;
304
+ let payload = buf.subarray(offset + maskLen, offset + maskLen + len);
305
+ if (masked) {
306
+ const mask = buf.subarray(offset, offset + 4);
307
+ const out = Buffer.alloc(len);
308
+ for (let i = 0; i < len; i++)
309
+ out[i] = payload[i] ^ mask[i % 4];
310
+ payload = out;
311
+ }
312
+ return { opcode, payload, rest: buf.subarray(offset + maskLen + len) };
313
+ }
314
+ function tryParse(text) {
315
+ const trimmed = text.trim();
316
+ if (!trimmed)
317
+ return "";
318
+ if (trimmed.startsWith("{") || trimmed.startsWith("[")) {
319
+ try {
320
+ return JSON.parse(trimmed);
321
+ }
322
+ catch { /* keep text */ }
323
+ }
324
+ return text;
325
+ }
326
+ //# sourceMappingURL=wsInvoke.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wsInvoke.js","sourceRoot":"","sources":["../src/wsInvoke.ts"],"names":[],"mappings":"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"}
package/dist/server.js ADDED
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.startServer = startServer;
37
+ const fs = __importStar(require("fs"));
38
+ const http = __importStar(require("http"));
39
+ const path = __importStar(require("path"));
40
+ const child_process_1 = require("child_process");
41
+ const ws_1 = require("ws");
42
+ const uploadProtoDir_1 = require("./uploadProtoDir");
43
+ // Packaged next to dist/ as dist/core/* (copied by scripts/build-cli.js)
44
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
45
+ const { ClientHost } = require("./core/hostCore");
46
+ const MIME = {
47
+ ".html": "text/html; charset=utf-8",
48
+ ".js": "text/javascript; charset=utf-8",
49
+ ".css": "text/css; charset=utf-8",
50
+ ".png": "image/png",
51
+ ".svg": "image/svg+xml",
52
+ ".json": "application/json",
53
+ ".map": "application/json",
54
+ };
55
+ async function startServer(options) {
56
+ const host = new ClientHost({
57
+ workspaceRoot: options.workspaceRoot,
58
+ showGoogle: options.showGoogle,
59
+ initialSource: options.gitUrl
60
+ ? { mode: "git", gitUrl: options.gitUrl, gitBranch: options.gitBranch || "main" }
61
+ : { mode: "workspace" },
62
+ log: (line) => console.log(`[protoview] ${line}`),
63
+ });
64
+ console.log(`[protoview] loading protos from ${options.gitUrl || options.workspaceRoot} …`);
65
+ await host.reload(Boolean(options.gitUrl));
66
+ const server = http.createServer((req, res) => {
67
+ void serveStatic(options.publicDir, req, res);
68
+ });
69
+ const wss = new ws_1.WebSocketServer({ server, path: "/ws" });
70
+ wss.on("connection", (socket) => {
71
+ const send = (message) => {
72
+ if (socket.readyState === ws_1.WebSocket.OPEN) {
73
+ socket.send(JSON.stringify(message));
74
+ }
75
+ };
76
+ socket.on("message", (raw) => {
77
+ void (async () => {
78
+ try {
79
+ const text = typeof raw === "string" ? raw : Buffer.isBuffer(raw)
80
+ ? raw.toString("utf8")
81
+ : Buffer.from(raw).toString("utf8");
82
+ const message = JSON.parse(text);
83
+ // 浏览器原生选目录/文件后上传内容(无完整本机路径)
84
+ if (message.type === "uploadProtoDir") {
85
+ const result = await (0, uploadProtoDir_1.materializeProtoUpload)(message.payload || {});
86
+ if (!result.count) {
87
+ send({ type: "toast", level: "err", text: "目录中未找到 .proto 文件" });
88
+ return;
89
+ }
90
+ send({
91
+ type: "pickedProtoDir",
92
+ path: result.dir,
93
+ label: result.label,
94
+ count: result.count,
95
+ });
96
+ return;
97
+ }
98
+ if (message.type === "uploadGhzBinary") {
99
+ const file = await (0, uploadProtoDir_1.materializeGhzUpload)(message.payload || {});
100
+ if (file)
101
+ send({ type: "pickedGhzBinary", path: file });
102
+ return;
103
+ }
104
+ await host.handleMessage(message, send);
105
+ }
106
+ catch (error) {
107
+ send({
108
+ type: "invokeResult",
109
+ ok: false,
110
+ status: "ERROR",
111
+ error: error instanceof Error ? error.message : String(error),
112
+ });
113
+ }
114
+ })();
115
+ });
116
+ });
117
+ await new Promise((resolve, reject) => {
118
+ server.listen(options.port, "127.0.0.1", () => resolve());
119
+ server.on("error", reject);
120
+ });
121
+ const url = `http://127.0.0.1:${options.port}/`;
122
+ console.log(`[protoview] ProtoView Client → ${url}`);
123
+ console.log(`[protoview] source: ${host.sourceLabel()}`);
124
+ console.log("[protoview] press Ctrl+C to stop");
125
+ if (options.openBrowser)
126
+ openUrl(url);
127
+ }
128
+ async function serveStatic(publicDir, req, res) {
129
+ try {
130
+ const url = new URL(req.url || "/", "http://127.0.0.1");
131
+ let rel = decodeURIComponent(url.pathname);
132
+ if (rel === "/")
133
+ rel = "/index.html";
134
+ const filePath = path.normalize(path.join(publicDir, rel));
135
+ if (!filePath.startsWith(path.normalize(publicDir))) {
136
+ res.writeHead(403);
137
+ res.end("Forbidden");
138
+ return;
139
+ }
140
+ const data = await fs.promises.readFile(filePath);
141
+ const ext = path.extname(filePath).toLowerCase();
142
+ res.writeHead(200, { "Content-Type": MIME[ext] || "application/octet-stream" });
143
+ res.end(data);
144
+ }
145
+ catch {
146
+ res.writeHead(404);
147
+ res.end("Not Found");
148
+ }
149
+ }
150
+ function openUrl(url) {
151
+ const platform = process.platform;
152
+ const cmd = platform === "win32" ? `start "" "${url}"`
153
+ : platform === "darwin" ? `open "${url}"`
154
+ : `xdg-open "${url}"`;
155
+ (0, child_process_1.exec)(cmd, (error) => {
156
+ if (error)
157
+ console.warn(`[protoview] could not open browser: ${error.message}`);
158
+ });
159
+ }
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.materializeProtoUpload = materializeProtoUpload;
37
+ exports.materializeGhzUpload = materializeGhzUpload;
38
+ const fs = __importStar(require("fs"));
39
+ const os = __importStar(require("os"));
40
+ const path = __importStar(require("path"));
41
+ /** 将浏览器选中的 .proto 树落到系统临时目录,返回绝对路径。 */
42
+ async function materializeProtoUpload(options) {
43
+ const files = Array.isArray(options.files) ? options.files : [];
44
+ const label = String(options.name || "proto").trim() || "proto";
45
+ const root = await fs.promises.mkdtemp(path.join(os.tmpdir(), "protoview-dir-"));
46
+ let count = 0;
47
+ for (const file of files) {
48
+ const relRaw = String(file?.path || "").replace(/\\/g, "/").replace(/^\/+/, "");
49
+ if (!relRaw || relRaw.includes("\0"))
50
+ continue;
51
+ const rel = path.normalize(relRaw);
52
+ if (rel.startsWith("..") || path.isAbsolute(rel))
53
+ continue;
54
+ if (!rel.replace(/\\/g, "/").toLowerCase().endsWith(".proto"))
55
+ continue;
56
+ const dest = path.resolve(root, rel);
57
+ if (!dest.startsWith(path.resolve(root) + path.sep) && dest !== path.resolve(root))
58
+ continue;
59
+ await fs.promises.mkdir(path.dirname(dest), { recursive: true });
60
+ await fs.promises.writeFile(dest, String(file.content ?? ""), "utf8");
61
+ count += 1;
62
+ }
63
+ return { dir: root, count, label };
64
+ }
65
+ /** 将浏览器选中的 ghz 可执行文件落到临时目录。 */
66
+ async function materializeGhzUpload(options) {
67
+ const name = path.basename(String(options.name || "ghz").trim() || "ghz");
68
+ const b64 = String(options.base64 || "");
69
+ if (!b64)
70
+ return undefined;
71
+ const dir = await fs.promises.mkdtemp(path.join(os.tmpdir(), "protoview-ghz-"));
72
+ const dest = path.join(dir, name);
73
+ await fs.promises.writeFile(dest, Buffer.from(b64, "base64"));
74
+ if (process.platform !== "win32") {
75
+ await fs.promises.chmod(dest, 0o755);
76
+ }
77
+ return dest;
78
+ }
package/package.json CHANGED
@@ -1,6 +1,55 @@
1
- {
2
- "name": "@zhhoceanfly/protoview",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
1
+ {
2
+ "name": "@zhhoceanfly/protoview",
3
+ "version": "0.1.3",
4
+ "description": "ProtoView Client CLI:本地启动浏览器调试 gRPC / HTTP / SSE / WebSocket(Rider / 任意 IDE 可用)",
5
+ "license": "MIT",
6
+ "author": "zoceanfly",
7
+ "homepage": "https://github.com/zhhOceanfly/ProtoView",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/zhhOceanfly/ProtoView.git",
11
+ "directory": "packages/cli"
12
+ },
13
+ "bugs": {
14
+ "url": "https://github.com/zhhOceanfly/ProtoView/issues"
15
+ },
16
+ "keywords": [
17
+ "protobuf",
18
+ "proto",
19
+ "grpc",
20
+ "protoview",
21
+ "client",
22
+ "rider"
23
+ ],
24
+ "bin": {
25
+ "protoview": "bin/protoview.js"
26
+ },
27
+ "main": "dist/cli.js",
28
+ "files": [
29
+ "bin",
30
+ "dist",
31
+ "public",
32
+ "README.md"
33
+ ],
34
+ "engines": {
35
+ "node": ">=18"
36
+ },
37
+ "scripts": {
38
+ "build": "node ../../scripts/build-cli.js",
39
+ "dev": "node ../../scripts/dev-cli.js",
40
+ "start": "node bin/protoview.js",
41
+ "prepublishOnly": "npm run build"
42
+ },
43
+ "dependencies": {
44
+ "@grpc/grpc-js": "^1.14.6",
45
+ "@grpc/proto-loader": "^0.8.1",
46
+ "ws": "^8.18.0"
47
+ },
48
+ "publishConfig": {
49
+ "access": "public",
50
+ "registry": "https://registry.npmjs.org/"
51
+ },
52
+ "devDependencies": {
53
+ "@types/ws": "^8.18.2"
54
+ }
55
+ }