@projectqai/proto 0.0.26 → 0.0.27

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.
Files changed (2) hide show
  1. package/device.ts +66 -2
  2. package/package.json +2 -3
package/device.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { createClient, type Client, ConnectError, Code } from "@connectrpc/connect";
2
- import { createGrpcTransport } from "@connectrpc/connect-node";
2
+ import { createTransport } from "@connectrpc/connect/protocol-connect";
3
+ import type { UniversalClientFn } from "@connectrpc/connect/protocol";
3
4
  import { create, clone } from "@bufbuild/protobuf";
4
5
  import {
5
6
  WorldService,
@@ -37,9 +38,72 @@ export {
37
38
  type Entity,
38
39
  } from "./dist/world_pb.js";
39
40
 
41
+ // fetch-based universal HTTP client for the Connect protocol.
42
+ // Works in Node, Bun, browsers, and goja — no http2 dependency.
43
+ const universalFetch: UniversalClientFn = async (req) => {
44
+ const body = req.body ? await collectBytes(req.body) : undefined;
45
+ // Prevent the server from gzip-encoding responses — the Connect
46
+ // transport handles its own compression negotiation.
47
+ req.header.set("Accept-Encoding", "identity");
48
+ const resp = await fetch(req.url, {
49
+ method: req.method,
50
+ headers: req.header,
51
+ body,
52
+ signal: (req as any).signal,
53
+ });
54
+ return {
55
+ status: resp.status,
56
+ header: resp.headers,
57
+ body: responseBodyStream(resp),
58
+ trailer: new Headers(),
59
+ };
60
+ };
61
+
62
+ async function collectBytes(iter: AsyncIterable<Uint8Array>): Promise<Uint8Array> {
63
+ const chunks: Uint8Array[] = [];
64
+ for await (const value of iter) {
65
+ chunks.push(value);
66
+ }
67
+ const len = chunks.reduce((n, c) => n + c.length, 0);
68
+ const out = new Uint8Array(len);
69
+ let off = 0;
70
+ for (const c of chunks) { out.set(c, off); off += c.length; }
71
+ return out;
72
+ }
73
+
74
+ function responseBodyStream(resp: Response): AsyncIterable<Uint8Array> {
75
+ if (!resp.body) return { [Symbol.asyncIterator]() { return { next: () => Promise.resolve({ done: true as const, value: undefined }), throw: () => Promise.resolve({ done: true as const, value: undefined }) }; } };
76
+ const reader = resp.body.getReader();
77
+ return {
78
+ [Symbol.asyncIterator]() {
79
+ return {
80
+ async next() {
81
+ const { done, value } = await reader.read();
82
+ if (done) { reader.releaseLock(); return { done: true as const, value: undefined }; }
83
+ return { done: false as const, value };
84
+ },
85
+ async throw(e: unknown) {
86
+ reader.releaseLock();
87
+ return { done: true as const, value: undefined };
88
+ },
89
+ };
90
+ }
91
+ };
92
+ }
93
+
40
94
  export function connect(serverURL?: string): WorldClient {
41
95
  const base = serverURL ?? process.env.HYDRIS_SERVER ?? "http://localhost:50051";
42
- const transport = createGrpcTransport({ baseUrl: base, httpVersion: "2" });
96
+ const transport = createTransport({
97
+ baseUrl: base,
98
+ httpClient: universalFetch,
99
+ useBinaryFormat: true,
100
+ interceptors: [],
101
+ acceptCompression: [],
102
+ sendCompression: null,
103
+ compressMinBytes: Number.MAX_SAFE_INTEGER,
104
+ readMaxBytes: Number.MAX_SAFE_INTEGER,
105
+ writeMaxBytes: Number.MAX_SAFE_INTEGER,
106
+ });
43
107
  return createClient(WorldService, transport);
44
108
  }
45
109
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@projectqai/proto",
3
- "version": "0.0.26",
3
+ "version": "0.0.27",
4
4
  "author": "projectq-release-bot",
5
5
  "type": "module",
6
6
  "exports": {
@@ -23,8 +23,7 @@
23
23
  "@bufbuild/protobuf": "^2.10.1"
24
24
  },
25
25
  "dependencies": {
26
- "@connectrpc/connect": "^2.0.0",
27
- "@connectrpc/connect-node": "^2.0.0"
26
+ "@connectrpc/connect": "^2.0.0"
28
27
  },
29
28
  "devDependencies": {
30
29
  "@bufbuild/protoc-gen-es": "^2.10.1"