@base44-preview/vite-plugin 1.0.48-pr.138.622eb14 → 1.0.48-pr.142.9fcc12e
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/README.md +24 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/dist/private-data-sources/build-http.d.ts +9 -0
- package/dist/private-data-sources/build-http.d.ts.map +1 -0
- package/dist/private-data-sources/build-http.js +38 -0
- package/dist/private-data-sources/build-http.js.map +1 -0
- package/dist/private-data-sources/elasticsearch.d.ts +8 -0
- package/dist/private-data-sources/elasticsearch.d.ts.map +1 -0
- package/dist/private-data-sources/elasticsearch.js +6 -0
- package/dist/private-data-sources/elasticsearch.js.map +1 -0
- package/dist/private-data-sources/http-url.d.ts +10 -0
- package/dist/private-data-sources/http-url.d.ts.map +1 -0
- package/dist/private-data-sources/http-url.js +20 -0
- package/dist/private-data-sources/http-url.js.map +1 -0
- package/dist/private-data-sources/http.d.ts +8 -0
- package/dist/private-data-sources/http.d.ts.map +1 -0
- package/dist/private-data-sources/http.js +6 -0
- package/dist/private-data-sources/http.js.map +1 -0
- package/dist/private-data-sources/hyperdrive.d.ts +28 -0
- package/dist/private-data-sources/hyperdrive.d.ts.map +1 -0
- package/dist/private-data-sources/hyperdrive.js +39 -0
- package/dist/private-data-sources/hyperdrive.js.map +1 -0
- package/dist/private-data-sources/ioredis-adapter.d.ts +35 -0
- package/dist/private-data-sources/ioredis-adapter.d.ts.map +1 -0
- package/dist/private-data-sources/ioredis-adapter.js +203 -0
- package/dist/private-data-sources/ioredis-adapter.js.map +1 -0
- package/dist/private-data-sources/manifest.d.ts +7 -0
- package/dist/private-data-sources/manifest.d.ts.map +1 -0
- package/dist/private-data-sources/manifest.js +95 -0
- package/dist/private-data-sources/manifest.js.map +1 -0
- package/dist/private-data-sources/mariadb.d.ts +14 -0
- package/dist/private-data-sources/mariadb.d.ts.map +1 -0
- package/dist/private-data-sources/mariadb.js +6 -0
- package/dist/private-data-sources/mariadb.js.map +1 -0
- package/dist/private-data-sources/mongodb.d.ts +24 -0
- package/dist/private-data-sources/mongodb.d.ts.map +1 -0
- package/dist/private-data-sources/mongodb.js +52 -0
- package/dist/private-data-sources/mongodb.js.map +1 -0
- package/dist/private-data-sources/mysql.d.ts +14 -0
- package/dist/private-data-sources/mysql.d.ts.map +1 -0
- package/dist/private-data-sources/mysql.js +6 -0
- package/dist/private-data-sources/mysql.js.map +1 -0
- package/dist/private-data-sources/node-net-adapter.d.ts +20 -0
- package/dist/private-data-sources/node-net-adapter.d.ts.map +1 -0
- package/dist/private-data-sources/node-net-adapter.js +219 -0
- package/dist/private-data-sources/node-net-adapter.js.map +1 -0
- package/dist/private-data-sources/oracle.d.ts +20 -0
- package/dist/private-data-sources/oracle.d.ts.map +1 -0
- package/dist/private-data-sources/oracle.js +32 -0
- package/dist/private-data-sources/oracle.js.map +1 -0
- package/dist/private-data-sources/postgres.d.ts +14 -0
- package/dist/private-data-sources/postgres.d.ts.map +1 -0
- package/dist/private-data-sources/postgres.js +6 -0
- package/dist/private-data-sources/postgres.js.map +1 -0
- package/dist/private-data-sources/redis-auth.d.ts +3 -0
- package/dist/private-data-sources/redis-auth.d.ts.map +1 -0
- package/dist/private-data-sources/redis-auth.js +72 -0
- package/dist/private-data-sources/redis-auth.js.map +1 -0
- package/dist/private-data-sources/redis.d.ts +46 -0
- package/dist/private-data-sources/redis.d.ts.map +1 -0
- package/dist/private-data-sources/redis.js +27 -0
- package/dist/private-data-sources/redis.js.map +1 -0
- package/dist/private-data-sources/runtime-environment.d.ts +2 -0
- package/dist/private-data-sources/runtime-environment.d.ts.map +1 -0
- package/dist/private-data-sources/runtime-environment.js +6 -0
- package/dist/private-data-sources/runtime-environment.js.map +1 -0
- package/dist/private-data-sources/sqlserver.d.ts +18 -0
- package/dist/private-data-sources/sqlserver.d.ts.map +1 -0
- package/dist/private-data-sources/sqlserver.js +13 -0
- package/dist/private-data-sources/sqlserver.js.map +1 -0
- package/dist/private-data-sources/tcp.d.ts +29 -0
- package/dist/private-data-sources/tcp.d.ts.map +1 -0
- package/dist/private-data-sources/tcp.js +63 -0
- package/dist/private-data-sources/tcp.js.map +1 -0
- package/dist/private-data-sources/tedious-adapter.d.ts +2 -0
- package/dist/private-data-sources/tedious-adapter.d.ts.map +1 -0
- package/dist/private-data-sources/tedious-adapter.js +63 -0
- package/dist/private-data-sources/tedious-adapter.js.map +1 -0
- package/dist/private-data-sources/types.d.ts +27 -0
- package/dist/private-data-sources/types.d.ts.map +1 -0
- package/dist/private-data-sources/types.js +2 -0
- package/dist/private-data-sources/types.js.map +1 -0
- package/dist/private-data-sources-plugin.d.ts +3 -0
- package/dist/private-data-sources-plugin.d.ts.map +1 -0
- package/dist/private-data-sources-plugin.js +51 -0
- package/dist/private-data-sources-plugin.js.map +1 -0
- package/package.json +1 -1
- package/src/index.ts +9 -2
- package/src/private-data-sources/build-http.ts +51 -0
- package/src/private-data-sources/cloudflare-workers.d.ts +3 -0
- package/src/private-data-sources/elasticsearch.ts +8 -0
- package/src/private-data-sources/http-url.ts +23 -0
- package/src/private-data-sources/http.ts +6 -0
- package/src/private-data-sources/hyperdrive.ts +48 -0
- package/src/private-data-sources/ioredis-adapter.ts +229 -0
- package/src/private-data-sources/manifest.ts +127 -0
- package/src/private-data-sources/mariadb.ts +8 -0
- package/src/private-data-sources/mongodb.ts +70 -0
- package/src/private-data-sources/mysql.ts +8 -0
- package/src/private-data-sources/node-net-adapter.ts +247 -0
- package/src/private-data-sources/oracle.ts +34 -0
- package/src/private-data-sources/postgres.ts +8 -0
- package/src/private-data-sources/redis-auth.ts +83 -0
- package/src/private-data-sources/redis.ts +47 -0
- package/src/private-data-sources/runtime-environment.ts +6 -0
- package/src/private-data-sources/sqlserver.ts +22 -0
- package/src/private-data-sources/tcp.ts +86 -0
- package/src/private-data-sources/tedious-adapter.ts +67 -0
- package/src/private-data-sources/types.ts +29 -0
- package/src/private-data-sources-plugin.ts +55 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
const MAX_AUTH_RESPONSE_BYTES = 4096;
|
|
2
|
+
function isCloudflareTcpSocket(socket) {
|
|
3
|
+
const candidate = socket;
|
|
4
|
+
return (candidate !== null &&
|
|
5
|
+
typeof candidate === "object" &&
|
|
6
|
+
!!candidate.readable &&
|
|
7
|
+
typeof candidate.readable.getReader === "function" &&
|
|
8
|
+
!!candidate.writable &&
|
|
9
|
+
typeof candidate.writable.getWriter === "function");
|
|
10
|
+
}
|
|
11
|
+
function encodeRespArray(values) {
|
|
12
|
+
const encoder = new TextEncoder();
|
|
13
|
+
const chunks = [encoder.encode(`*${values.length}\r\n`)];
|
|
14
|
+
for (const value of values) {
|
|
15
|
+
const bytes = encoder.encode(value);
|
|
16
|
+
chunks.push(encoder.encode(`$${bytes.byteLength}\r\n`), bytes, encoder.encode("\r\n"));
|
|
17
|
+
}
|
|
18
|
+
const result = new Uint8Array(chunks.reduce((total, chunk) => total + chunk.byteLength, 0));
|
|
19
|
+
let offset = 0;
|
|
20
|
+
for (const chunk of chunks) {
|
|
21
|
+
result.set(chunk, offset);
|
|
22
|
+
offset += chunk.byteLength;
|
|
23
|
+
}
|
|
24
|
+
return result;
|
|
25
|
+
}
|
|
26
|
+
async function readResponseLine(reader) {
|
|
27
|
+
const bytes = [];
|
|
28
|
+
while (bytes.length <= MAX_AUTH_RESPONSE_BYTES) {
|
|
29
|
+
const { value, done } = await reader.read();
|
|
30
|
+
if (done)
|
|
31
|
+
break;
|
|
32
|
+
for (const byte of value ?? []) {
|
|
33
|
+
bytes.push(byte);
|
|
34
|
+
const length = bytes.length;
|
|
35
|
+
if (length >= 2 && bytes[length - 2] === 13 && bytes[length - 1] === 10) {
|
|
36
|
+
return new TextDecoder().decode(new Uint8Array(bytes.slice(0, -2)));
|
|
37
|
+
}
|
|
38
|
+
if (length > MAX_AUTH_RESPONSE_BYTES)
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
throw new Error("Redis authentication failed: invalid or missing server response");
|
|
43
|
+
}
|
|
44
|
+
async function authenticateRedisSocket(socket, username, password) {
|
|
45
|
+
if (!isCloudflareTcpSocket(socket)) {
|
|
46
|
+
throw new Error("Redis private data source did not return a readable/writable TCP socket");
|
|
47
|
+
}
|
|
48
|
+
const reader = socket.readable.getReader();
|
|
49
|
+
const writer = socket.writable.getWriter();
|
|
50
|
+
try {
|
|
51
|
+
await socket.opened;
|
|
52
|
+
const auth = username ? ["AUTH", username, password] : ["AUTH", password];
|
|
53
|
+
await writer.write(encodeRespArray(auth));
|
|
54
|
+
const response = await readResponseLine(reader);
|
|
55
|
+
if (response === "+OK")
|
|
56
|
+
return socket;
|
|
57
|
+
const message = response.startsWith("-") ? response.slice(1) : `unexpected response ${JSON.stringify(response)}`;
|
|
58
|
+
throw new Error(`Redis authentication failed: ${message}`);
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
socket.close?.();
|
|
62
|
+
throw error;
|
|
63
|
+
}
|
|
64
|
+
finally {
|
|
65
|
+
reader.releaseLock();
|
|
66
|
+
writer.releaseLock();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
export function authenticateRedisSocketIfNeeded(socket, username, password) {
|
|
70
|
+
return password ? authenticateRedisSocket(socket, username, password) : socket;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=redis-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-auth.js","sourceRoot":"","sources":["../../src/private-data-sources/redis-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export declare function redis(name: unknown): Readonly<Readonly<{
|
|
2
|
+
name: string | undefined;
|
|
3
|
+
type: string | undefined;
|
|
4
|
+
readonly bindingName: string | undefined;
|
|
5
|
+
readonly host: string | undefined;
|
|
6
|
+
readonly port: number | undefined;
|
|
7
|
+
readonly database: string | undefined;
|
|
8
|
+
readonly username: string | undefined;
|
|
9
|
+
readonly user: string | undefined;
|
|
10
|
+
readonly password: string | undefined;
|
|
11
|
+
connect(options?: unknown): unknown;
|
|
12
|
+
readonly binding: unknown;
|
|
13
|
+
}> & {
|
|
14
|
+
connect: (options?: unknown) => unknown;
|
|
15
|
+
} & {
|
|
16
|
+
connect(options?: unknown): unknown;
|
|
17
|
+
ioredisConnector(): {
|
|
18
|
+
new (options?: {
|
|
19
|
+
disconnectTimeout?: number;
|
|
20
|
+
}): {
|
|
21
|
+
firstError?: Error;
|
|
22
|
+
"__#private@#stream": import("./ioredis-adapter.js").IoredisNetStream | undefined;
|
|
23
|
+
"__#private@#disconnectTimeout": number;
|
|
24
|
+
check(): boolean;
|
|
25
|
+
connect(errorEmitter?: (type: string, err: Error) => void): Promise<import("./ioredis-adapter.js").IoredisNetStream>;
|
|
26
|
+
disconnect(): void;
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
ioredisOptions(): Readonly<{
|
|
30
|
+
password?: string;
|
|
31
|
+
username?: string;
|
|
32
|
+
Connector: {
|
|
33
|
+
new (options?: {
|
|
34
|
+
disconnectTimeout?: number;
|
|
35
|
+
}): {
|
|
36
|
+
firstError?: Error;
|
|
37
|
+
"__#private@#stream": import("./ioredis-adapter.js").IoredisNetStream | undefined;
|
|
38
|
+
"__#private@#disconnectTimeout": number;
|
|
39
|
+
check(): boolean;
|
|
40
|
+
connect(errorEmitter?: (type: string, err: Error) => void): Promise<import("./ioredis-adapter.js").IoredisNetStream>;
|
|
41
|
+
disconnect(): void;
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
}>;
|
|
45
|
+
}>;
|
|
46
|
+
//# sourceMappingURL=redis.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../src/private-data-sources/redis.ts"],"names":[],"mappings":"AAKA,wBAAgB,KAAK,CAAC,IAAI,EAAE,OAAO;;;;;;;;;;;;;aAItB,CAAC,OAAO,CAAC,EAAE,OAAO,KAAK,OAAO;;sBAKrB,OAAO;;;6BAiCmpI,CAAC;;;;;;;;;;;;;;;iCAAD,CAAC;;;;;;;;;;;GADhrI"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { buildIoredisConnectorFactory } from "./ioredis-adapter.js";
|
|
2
|
+
import { privateDataSourceReference } from "./manifest.js";
|
|
3
|
+
import { authenticateRedisSocketIfNeeded } from "./redis-auth.js";
|
|
4
|
+
import { buildTcpPrivateDataSource } from "./tcp.js";
|
|
5
|
+
export function redis(name) {
|
|
6
|
+
const source = buildTcpPrivateDataSource(privateDataSourceReference(name, "redis"));
|
|
7
|
+
const { connect: _connect, ...descriptors } = Object.getOwnPropertyDescriptors(source);
|
|
8
|
+
const extension = {
|
|
9
|
+
connect(options) {
|
|
10
|
+
return authenticateRedisSocketIfNeeded(source.connect(options), source.username, source.password);
|
|
11
|
+
},
|
|
12
|
+
ioredisConnector() {
|
|
13
|
+
return buildIoredisConnectorFactory(() => authenticateRedisSocketIfNeeded(source.connect(), source.username, source.password));
|
|
14
|
+
},
|
|
15
|
+
ioredisOptions() {
|
|
16
|
+
return Object.freeze({
|
|
17
|
+
Connector: buildIoredisConnectorFactory(() => source.connect()),
|
|
18
|
+
...(source.password && source.username
|
|
19
|
+
? { username: source.username }
|
|
20
|
+
: {}),
|
|
21
|
+
...(source.password ? { password: source.password } : {}),
|
|
22
|
+
});
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
return Object.freeze(Object.defineProperties(extension, descriptors));
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=redis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis.js","sourceRoot":"","sources":["../../src/private-data-sources/redis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,+BAA+B,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AAErD,MAAM,UAAU,KAAK,CAAC,IAAa;IACjC,MAAM,MAAM,GAAG,yBAAyB,CACtC,0BAA0B,CAAC,IAAI,EAAE,OAAO,CAAC,CAG1C,CAAC;IACF,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,WAAW,EAAE,GACzC,MAAM,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG;QAChB,OAAO,CAAC,OAAiB;YACvB,OAAO,+BAA+B,CACpC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EACvB,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,QAAQ,CAChB,CAAC;QACJ,CAAC;QACD,gBAAgB;YACd,OAAO,4BAA4B,CAAC,GAAG,EAAE,CACvC,+BAA+B,CAC7B,MAAM,CAAC,OAAO,EAAE,EAChB,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,QAAQ,CAChB,CACF,CAAC;QACJ,CAAC;QACD,cAAc;YACZ,OAAO,MAAM,CAAC,MAAM,CAAC;gBACnB,SAAS,EAAE,4BAA4B,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC/D,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ;oBACpC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE;oBAC/B,CAAC,CAAC,EAAE,CAAC;gBACP,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC1D,CAAC,CAAC;QACL,CAAC;KACF,CAAC;IACF,OAAO,MAAM,CAAC,MAAM,CAClB,MAAM,CAAC,gBAAgB,CACrB,SAAS,EACT,WAAW,CACwB,CACtC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-environment.d.ts","sourceRoot":"","sources":["../../src/private-data-sources/runtime-environment.ts"],"names":[],"mappings":"AAGA,wBAAgB,iBAAiB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAE3D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-environment.js","sourceRoot":"","sources":["../../src/private-data-sources/runtime-environment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAEzC,yFAAyF;AACzF,MAAM,UAAU,iBAAiB;IAC/B,OAAO,GAA8B,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare function sqlserver(name: unknown): Readonly<Readonly<{
|
|
2
|
+
name: string | undefined;
|
|
3
|
+
type: string | undefined;
|
|
4
|
+
readonly bindingName: string | undefined;
|
|
5
|
+
readonly host: string | undefined;
|
|
6
|
+
readonly port: number | undefined;
|
|
7
|
+
readonly database: string | undefined;
|
|
8
|
+
readonly username: string | undefined;
|
|
9
|
+
readonly user: string | undefined;
|
|
10
|
+
readonly password: string | undefined;
|
|
11
|
+
connect(options?: unknown): unknown;
|
|
12
|
+
readonly binding: unknown;
|
|
13
|
+
}> & {
|
|
14
|
+
connect: (options?: unknown) => unknown;
|
|
15
|
+
} & {
|
|
16
|
+
tediousConnector(): (_connectOptions?: unknown, _lookup?: unknown, signal?: AbortSignal) => Promise<import("./node-net-adapter.js").NodeNetSocket>;
|
|
17
|
+
}>;
|
|
18
|
+
//# sourceMappingURL=sqlserver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlserver.d.ts","sourceRoot":"","sources":["../../src/private-data-sources/sqlserver.ts"],"names":[],"mappings":"AAIA,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO;;;;;;;;;;;;;aAI1B,CAAC,OAAO,CAAC,EAAE,OAAO,KAAK,OAAO;;;GAa1C"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { buildTediousConnectorFactory } from "./tedious-adapter.js";
|
|
2
|
+
import { privateDataSourceReference } from "./manifest.js";
|
|
3
|
+
import { buildTcpPrivateDataSource } from "./tcp.js";
|
|
4
|
+
export function sqlserver(name) {
|
|
5
|
+
const source = buildTcpPrivateDataSource(privateDataSourceReference(name, "sqlserver"));
|
|
6
|
+
const extension = {
|
|
7
|
+
tediousConnector() {
|
|
8
|
+
return buildTediousConnectorFactory(() => source.connect());
|
|
9
|
+
},
|
|
10
|
+
};
|
|
11
|
+
return Object.freeze(Object.defineProperties(extension, Object.getOwnPropertyDescriptors(source)));
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=sqlserver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlserver.js","sourceRoot":"","sources":["../../src/private-data-sources/sqlserver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AAErD,MAAM,UAAU,SAAS,CAAC,IAAa;IACrC,MAAM,MAAM,GAAG,yBAAyB,CACtC,0BAA0B,CAAC,IAAI,EAAE,WAAW,CAAC,CAG9C,CAAC;IACF,MAAM,SAAS,GAAG;QAChB,gBAAgB;YACd,OAAO,4BAA4B,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9D,CAAC;KACF,CAAC;IACF,OAAO,MAAM,CAAC,MAAM,CAClB,MAAM,CAAC,gBAAgB,CACrB,SAAS,EACT,MAAM,CAAC,yBAAyB,CAAC,MAAM,CAAC,CACL,CACtC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { CloudflareTcpSocket, PrivateDataSourceManifestEntry } from "./types.js";
|
|
2
|
+
export declare function buildTcpPrivateDataSource(entry: PrivateDataSourceManifestEntry): Readonly<{
|
|
3
|
+
name: string | undefined;
|
|
4
|
+
type: string | undefined;
|
|
5
|
+
readonly bindingName: string | undefined;
|
|
6
|
+
readonly host: string | undefined;
|
|
7
|
+
readonly port: number | undefined;
|
|
8
|
+
readonly database: string | undefined;
|
|
9
|
+
readonly username: string | undefined;
|
|
10
|
+
readonly user: string | undefined;
|
|
11
|
+
readonly password: string | undefined;
|
|
12
|
+
connect(options?: unknown): unknown;
|
|
13
|
+
readonly binding: unknown;
|
|
14
|
+
}>;
|
|
15
|
+
export declare function isCloudflareTcpSocket(socket: unknown): socket is CloudflareTcpSocket;
|
|
16
|
+
export declare function tcp(name: unknown, expectedType: string): Readonly<{
|
|
17
|
+
name: string | undefined;
|
|
18
|
+
type: string | undefined;
|
|
19
|
+
readonly bindingName: string | undefined;
|
|
20
|
+
readonly host: string | undefined;
|
|
21
|
+
readonly port: number | undefined;
|
|
22
|
+
readonly database: string | undefined;
|
|
23
|
+
readonly username: string | undefined;
|
|
24
|
+
readonly user: string | undefined;
|
|
25
|
+
readonly password: string | undefined;
|
|
26
|
+
connect(options?: unknown): unknown;
|
|
27
|
+
readonly binding: unknown;
|
|
28
|
+
}>;
|
|
29
|
+
//# sourceMappingURL=tcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tcp.d.ts","sourceRoot":"","sources":["../../src/private-data-sources/tcp.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,mBAAmB,EACnB,8BAA8B,EAE/B,MAAM,YAAY,CAAC;AAUpB,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,8BAA8B;;;;;;;;;;sBAyBzD,OAAO;;GAuB5B;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,mBAAmB,CAUpF;AAED,wBAAgB,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM;;;;;;;;;;sBArCjC,OAAO;;GAyC5B"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { currentPrivateDataSource, privateDataSourceReference, privateDataSourceBinding, } from "./manifest.js";
|
|
2
|
+
function hasConnect(binding) {
|
|
3
|
+
return (binding !== null &&
|
|
4
|
+
typeof binding === "object" &&
|
|
5
|
+
typeof binding.connect === "function");
|
|
6
|
+
}
|
|
7
|
+
export function buildTcpPrivateDataSource(entry) {
|
|
8
|
+
return Object.freeze({
|
|
9
|
+
name: entry.name,
|
|
10
|
+
type: entry.type,
|
|
11
|
+
get bindingName() {
|
|
12
|
+
return currentPrivateDataSource(entry).bindingName;
|
|
13
|
+
},
|
|
14
|
+
get host() {
|
|
15
|
+
return currentPrivateDataSource(entry).host;
|
|
16
|
+
},
|
|
17
|
+
get port() {
|
|
18
|
+
return currentPrivateDataSource(entry).port;
|
|
19
|
+
},
|
|
20
|
+
get database() {
|
|
21
|
+
return currentPrivateDataSource(entry).database;
|
|
22
|
+
},
|
|
23
|
+
get username() {
|
|
24
|
+
return currentPrivateDataSource(entry).username;
|
|
25
|
+
},
|
|
26
|
+
get user() {
|
|
27
|
+
return currentPrivateDataSource(entry).username;
|
|
28
|
+
},
|
|
29
|
+
get password() {
|
|
30
|
+
return currentPrivateDataSource(entry).password;
|
|
31
|
+
},
|
|
32
|
+
connect(options) {
|
|
33
|
+
const current = currentPrivateDataSource(entry);
|
|
34
|
+
const binding = privateDataSourceBinding(current);
|
|
35
|
+
if (!hasConnect(binding)) {
|
|
36
|
+
throw new Error(`Private data source "${current.name}" does not expose connect()`);
|
|
37
|
+
}
|
|
38
|
+
const address = typeof current.host === "string" && typeof current.port === "number"
|
|
39
|
+
? { hostname: current.host, port: current.port }
|
|
40
|
+
: null;
|
|
41
|
+
if (!address) {
|
|
42
|
+
throw new Error(`Private data source "${current.name}" has no TCP address`);
|
|
43
|
+
}
|
|
44
|
+
return binding.connect(address, options);
|
|
45
|
+
},
|
|
46
|
+
get binding() {
|
|
47
|
+
return privateDataSourceBinding(entry);
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
export function isCloudflareTcpSocket(socket) {
|
|
52
|
+
const socketObject = socket;
|
|
53
|
+
return (socketObject !== null &&
|
|
54
|
+
typeof socketObject === "object" &&
|
|
55
|
+
!!socketObject.readable &&
|
|
56
|
+
typeof socketObject.readable.getReader === "function" &&
|
|
57
|
+
!!socketObject.writable &&
|
|
58
|
+
typeof socketObject.writable.getWriter === "function");
|
|
59
|
+
}
|
|
60
|
+
export function tcp(name, expectedType) {
|
|
61
|
+
return buildTcpPrivateDataSource(privateDataSourceReference(name, expectedType));
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=tcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tcp.js","sourceRoot":"","sources":["../../src/private-data-sources/tcp.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,wBAAwB,GACzB,MAAM,eAAe,CAAC;AAOvB,SAAS,UAAU,CAAC,OAAgB;IAClC,OAAO,CACL,OAAO,KAAK,IAAI;QAChB,OAAO,OAAO,KAAK,QAAQ;QAC3B,OAAQ,OAAiC,CAAC,OAAO,KAAK,UAAU,CACjE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,KAAqC;IAC7E,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,IAAI,WAAW;YACb,OAAO,wBAAwB,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC;QACrD,CAAC;QACD,IAAI,IAAI;YACN,OAAO,wBAAwB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC;QAC9C,CAAC;QACD,IAAI,IAAI;YACN,OAAO,wBAAwB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC;QAC9C,CAAC;QACD,IAAI,QAAQ;YACV,OAAO,wBAAwB,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC;QAClD,CAAC;QACD,IAAI,QAAQ;YACV,OAAO,wBAAwB,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC;QAClD,CAAC;QACD,IAAI,IAAI;YACN,OAAO,wBAAwB,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC;QAClD,CAAC;QACD,IAAI,QAAQ;YACV,OAAO,wBAAwB,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC;QAClD,CAAC;QACD,OAAO,CAAC,OAAiB;YACvB,MAAM,OAAO,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;YAChD,MAAM,OAAO,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;YAClD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBACzB,MAAM,IAAI,KAAK,CACb,wBAAwB,OAAO,CAAC,IAAI,6BAA6B,CAClE,CAAC;YACJ,CAAC;YACD,MAAM,OAAO,GACX,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ;gBAClE,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE;gBAChD,CAAC,CAAC,IAAI,CAAC;YACX,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CACb,wBAAwB,OAAO,CAAC,IAAI,sBAAsB,CAC3D,CAAC;YACJ,CAAC;YACD,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC3C,CAAC;QACD,IAAI,OAAO;YACT,OAAO,wBAAwB,CAAC,KAAK,CAAC,CAAC;QACzC,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAe;IACnD,MAAM,YAAY,GAAG,MAA6C,CAAC;IACnE,OAAO,CACL,YAAY,KAAK,IAAI;QACrB,OAAO,YAAY,KAAK,QAAQ;QAChC,CAAC,CAAC,YAAY,CAAC,QAAQ;QACvB,OAAO,YAAY,CAAC,QAAQ,CAAC,SAAS,KAAK,UAAU;QACrD,CAAC,CAAC,YAAY,CAAC,QAAQ;QACvB,OAAO,YAAY,CAAC,QAAQ,CAAC,SAAS,KAAK,UAAU,CACtD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,IAAa,EAAE,YAAoB;IACrD,OAAO,yBAAyB,CAC9B,0BAA0B,CAAC,IAAI,EAAE,YAAY,CAAC,CAC/C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tedious-adapter.d.ts","sourceRoot":"","sources":["../../src/private-data-sources/tedious-adapter.ts"],"names":[],"mappings":"AA4DA,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,OAAO,IACnD,kBAAkB,OAAO,EAAE,UAAU,OAAO,EAAE,SAAS,WAAW,4DAKjF"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { isCloudflareTcpSocket } from "./tcp.js";
|
|
2
|
+
import { buildNodeNetSocket } from "./node-net-adapter.js";
|
|
3
|
+
function abortError(label, signal) {
|
|
4
|
+
return signal.reason instanceof Error
|
|
5
|
+
? signal.reason
|
|
6
|
+
: new Error(`${label} connection aborted`);
|
|
7
|
+
}
|
|
8
|
+
async function waitForCloudflareTcpSocketOpen(socket, label, signal) {
|
|
9
|
+
if (!isCloudflareTcpSocket(socket)) {
|
|
10
|
+
throw new Error(`${label} did not return a readable/writable TCP socket`);
|
|
11
|
+
}
|
|
12
|
+
if (!socket.opened)
|
|
13
|
+
return;
|
|
14
|
+
if (!signal) {
|
|
15
|
+
await socket.opened;
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
if (signal.aborted) {
|
|
19
|
+
try {
|
|
20
|
+
socket.close?.();
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
// Best-effort cleanup; surface the abort reason below.
|
|
24
|
+
}
|
|
25
|
+
throw abortError(label, signal);
|
|
26
|
+
}
|
|
27
|
+
let onAbort = null;
|
|
28
|
+
try {
|
|
29
|
+
await Promise.race([
|
|
30
|
+
socket.opened,
|
|
31
|
+
new Promise((_, reject) => {
|
|
32
|
+
onAbort = () => reject(abortError(label, signal));
|
|
33
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
34
|
+
}),
|
|
35
|
+
]);
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
try {
|
|
39
|
+
socket.close?.();
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// Preserve the original connection/abort error.
|
|
43
|
+
}
|
|
44
|
+
throw error;
|
|
45
|
+
}
|
|
46
|
+
finally {
|
|
47
|
+
if (onAbort)
|
|
48
|
+
signal.removeEventListener("abort", onAbort);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function buildTediousNetSocket(socket) {
|
|
52
|
+
return buildNodeNetSocket(socket, "SQL Server private data source", {
|
|
53
|
+
deferConnectEvent: true,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
export function buildTediousConnectorFactory(connect) {
|
|
57
|
+
return async (_connectOptions, _lookup, signal) => {
|
|
58
|
+
const socket = connect();
|
|
59
|
+
await waitForCloudflareTcpSocketOpen(socket, "SQL Server private data source", signal);
|
|
60
|
+
return buildTediousNetSocket(socket);
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=tedious-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tedious-adapter.js","sourceRoot":"","sources":["../../src/private-data-sources/tedious-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,SAAS,UAAU,CAAC,KAAa,EAAE,MAAmB;IACpD,OAAO,MAAM,CAAC,MAAM,YAAY,KAAK;QACnC,CAAC,CAAC,MAAM,CAAC,MAAM;QACf,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,KAAK,qBAAqB,CAAC,CAAC;AAC/C,CAAC;AAED,KAAK,UAAU,8BAA8B,CAC3C,MAAe,EACf,KAAa,EACb,MAAoB;IAEpB,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,gDAAgD,CAAC,CAAC;IAC5E,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO;IAE3B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,MAAM,CAAC,MAAM,CAAC;QACpB,OAAO;IACT,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;QACnB,CAAC;QAAC,MAAM,CAAC;YACP,uDAAuD;QACzD,CAAC;QACD,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAClC,CAAC;IAED,IAAI,OAAO,GAAwB,IAAI,CAAC;IACxC,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,IAAI,CAAC;YACjB,MAAM,CAAC,MAAM;YACb,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;gBACxB,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;gBAClD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5D,CAAC,CAAC;SACH,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC;YACH,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;QACnB,CAAC;QAAC,MAAM,CAAC;YACP,gDAAgD;QAClD,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;YAAS,CAAC;QACT,IAAI,OAAO;YAAE,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAAC,MAAe;IAC5C,OAAO,kBAAkB,CAAC,MAAM,EAAE,gCAAgC,EAAE;QAClE,iBAAiB,EAAE,IAAI;KACxB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,OAAsB;IACjE,OAAO,KAAK,EAAE,eAAyB,EAAE,OAAiB,EAAE,MAAoB,EAAE,EAAE;QAClF,MAAM,MAAM,GAAG,OAAO,EAAE,CAAC;QACzB,MAAM,8BAA8B,CAAC,MAAM,EAAE,gCAAgC,EAAE,MAAM,CAAC,CAAC;QACvF,OAAO,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface PrivateDataSourceManifestEntry {
|
|
2
|
+
name?: string;
|
|
3
|
+
type?: string;
|
|
4
|
+
bindingName?: string;
|
|
5
|
+
bindingKind?: string;
|
|
6
|
+
networkScope?: string;
|
|
7
|
+
baseUrl?: string;
|
|
8
|
+
host?: string;
|
|
9
|
+
port?: number;
|
|
10
|
+
database?: string;
|
|
11
|
+
username?: string;
|
|
12
|
+
password?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface FetchPrivateDataSourceBinding {
|
|
15
|
+
fetch: (resource: RequestInfo | URL, init?: RequestInit) => Response | Promise<Response>;
|
|
16
|
+
}
|
|
17
|
+
export interface TcpPrivateDataSourceBinding {
|
|
18
|
+
connect: (address: unknown, options?: unknown) => unknown;
|
|
19
|
+
}
|
|
20
|
+
export interface CloudflareTcpSocket {
|
|
21
|
+
readable: ReadableStream<Uint8Array>;
|
|
22
|
+
writable: WritableStream<Uint8Array>;
|
|
23
|
+
opened?: Promise<unknown>;
|
|
24
|
+
close?: () => void;
|
|
25
|
+
closed?: Promise<unknown>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/private-data-sources/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,8BAA8B;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,6BAA6B;IAC5C,KAAK,EAAE,CAAC,QAAQ,EAAE,WAAW,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CAC1F;AAED,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;CAC3D;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;IACrC,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;IACrC,MAAM,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;CAC3B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/private-data-sources/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"private-data-sources-plugin.d.ts","sourceRoot":"","sources":["../src/private-data-sources-plugin.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAiCnC,wBAAgB,wBAAwB,IAAI,MAAM,CAmBjD"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
/**
|
|
4
|
+
* Serves `base44:private-data-sources/<type>` to TanStack server code, so it
|
|
5
|
+
* reaches a workspace private data source with the SAME import a backend
|
|
6
|
+
* function uses:
|
|
7
|
+
*
|
|
8
|
+
* import { sqlserver } from "base44:private-data-sources/sqlserver";
|
|
9
|
+
*
|
|
10
|
+
* The modules are this package's own copy of the backend-function adapters
|
|
11
|
+
* (`@base44/functions-compiler`), reading the worker's bindings and manifest off
|
|
12
|
+
* `env` from `cloudflare:workers`. Each specifier resolves to the compiled file
|
|
13
|
+
* so Vite bundles it like any source module.
|
|
14
|
+
*
|
|
15
|
+
* The bindings exist only on the deployed worker: in the editor's dev preview a
|
|
16
|
+
* lookup throws, saying the source is available on the published app.
|
|
17
|
+
*/
|
|
18
|
+
const PREFIX = "base44:private-data-sources/";
|
|
19
|
+
const SOURCE_TYPES = new Set([
|
|
20
|
+
"elasticsearch",
|
|
21
|
+
"http",
|
|
22
|
+
"mariadb",
|
|
23
|
+
"mongodb",
|
|
24
|
+
"mysql",
|
|
25
|
+
"oracle",
|
|
26
|
+
"postgres",
|
|
27
|
+
"redis",
|
|
28
|
+
"sqlserver",
|
|
29
|
+
]);
|
|
30
|
+
const MODULES_DIR = path.join(path.dirname(fileURLToPath(import.meta.url)), "private-data-sources");
|
|
31
|
+
export function privateDataSourcesPlugin() {
|
|
32
|
+
return {
|
|
33
|
+
name: "base44-private-data-sources",
|
|
34
|
+
// Ahead of Vite's own resolution so the bare scheme is never read as a URL.
|
|
35
|
+
enforce: "pre",
|
|
36
|
+
resolveId(id) {
|
|
37
|
+
if (!id.startsWith(PREFIX))
|
|
38
|
+
return null;
|
|
39
|
+
const sourceType = id.slice(PREFIX.length);
|
|
40
|
+
if (!SOURCE_TYPES.has(sourceType)) {
|
|
41
|
+
this.error(`"${id}" is not a private data source type. Use one of: ${[...SOURCE_TYPES].join(", ")}.`);
|
|
42
|
+
}
|
|
43
|
+
// The source carries credentials, so it must never reach the browser bundle.
|
|
44
|
+
if (this.environment?.name === "client") {
|
|
45
|
+
this.error(`"${id}" is server-only. Move this import into a server function or server route.`);
|
|
46
|
+
}
|
|
47
|
+
return path.join(MODULES_DIR, `${sourceType}.js`);
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=private-data-sources-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"private-data-sources-plugin.js","sourceRoot":"","sources":["../src/private-data-sources-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC;;;;;;;;;;;;;;GAcG;AAEH,MAAM,MAAM,GAAG,8BAA8B,CAAC;AAC9C,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC;IAC3B,eAAe;IACf,MAAM;IACN,SAAS;IACT,SAAS;IACT,OAAO;IACP,QAAQ;IACR,UAAU;IACV,OAAO;IACP,WAAW;CACZ,CAAC,CAAC;AAEH,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,sBAAsB,CAAC,CAAC;AAEpG,MAAM,UAAU,wBAAwB;IACtC,OAAO;QACL,IAAI,EAAE,6BAA6B;QACnC,4EAA4E;QAC5E,OAAO,EAAE,KAAK;QAEd,SAAS,CAAC,EAAE;YACV,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;gBAAE,OAAO,IAAI,CAAC;YACxC,MAAM,UAAU,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC3C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;gBAClC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,oDAAoD,CAAC,GAAG,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACxG,CAAC;YACD,6EAA6E;YAC7E,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACxC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,4EAA4E,CAAC,CAAC;YACjG,CAAC;YACD,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,UAAU,KAAK,CAAC,CAAC;QACpD,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -8,9 +8,12 @@ import { htmlInjectionsPlugin } from "./html-injections-plugin.js";
|
|
|
8
8
|
import { buildStatusPlugin } from "./build-status-plugin.js";
|
|
9
9
|
import { base44RuntimePlugin } from "./base44-runtime-plugin.js";
|
|
10
10
|
import { workerdCompatPlugin } from "./workerd-compat-plugin.js";
|
|
11
|
+
import { privateDataSourcesPlugin } from "./private-data-sources-plugin.js";
|
|
11
12
|
import { routeRequestLogPlugin } from "./route-request-log/vite-plugin.js";
|
|
12
13
|
export type { DocumentScript } from "./consts.js";
|
|
13
14
|
|
|
15
|
+
const PLATFORM_API_PROXY_PATH = "^/api/(apps|app-logs)([/?]|$)";
|
|
16
|
+
|
|
14
17
|
const isRunningInSandbox = !!process.env.MODAL_SANDBOX_ID;
|
|
15
18
|
|
|
16
19
|
// Both optimizer spellings mean the same thing here: treat .js files as JSX,
|
|
@@ -158,12 +161,14 @@ export default function vitePlugin(
|
|
|
158
161
|
: (() => {
|
|
159
162
|
if (env.VITE_BASE44_APP_BASE_URL) {
|
|
160
163
|
console.log(
|
|
161
|
-
`[base44] Proxy enabled: /api -> ${env.VITE_BASE44_APP_BASE_URL}`
|
|
164
|
+
`[base44] Proxy enabled: /api/apps, /api/app-logs -> ${env.VITE_BASE44_APP_BASE_URL}`
|
|
162
165
|
);
|
|
163
166
|
return {
|
|
164
167
|
server: {
|
|
165
168
|
proxy: {
|
|
166
|
-
|
|
169
|
+
// Only the platform's paths: the rest of /api is the app's own server
|
|
170
|
+
// routes, and under `base44 dev` proxying them loops back to the CLI.
|
|
171
|
+
[PLATFORM_API_PROXY_PATH]: {
|
|
167
172
|
target: env.VITE_BASE44_APP_BASE_URL,
|
|
168
173
|
changeOrigin: true,
|
|
169
174
|
},
|
|
@@ -304,6 +309,8 @@ export default function vitePlugin(
|
|
|
304
309
|
// `ws` and `AsyncLocalStorage.enterWith()` for Cloudflare Workers server code.
|
|
305
310
|
// Inert outside environments that resolve with the "workerd" condition.
|
|
306
311
|
workerdCompatPlugin(),
|
|
312
|
+
// Serves `base44:private-data-sources/*` to TanStack server code.
|
|
313
|
+
privateDataSourcesPlugin(),
|
|
307
314
|
// Dev-only: tags a full-stack route's console output with the request's
|
|
308
315
|
// X-B44-Request-Id. Registered as a Nitro module (the `nitro` property)
|
|
309
316
|
// because Nitro runs dev routes in a worker whose console the Vite process
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { resolveHttpPrivateDataSourceUrl } from "./http-url.js";
|
|
2
|
+
import {
|
|
3
|
+
currentPrivateDataSource,
|
|
4
|
+
privateDataSourceBinding,
|
|
5
|
+
} from "./manifest.js";
|
|
6
|
+
import type { FetchPrivateDataSourceBinding, PrivateDataSourceManifestEntry } from "./types.js";
|
|
7
|
+
|
|
8
|
+
// Internal, NOT a public virtual module: app code cannot import this builder to
|
|
9
|
+
// hand-forge a manifest entry. The only public entrypoints — http()/elasticsearch()
|
|
10
|
+
// — resolve their entry from the immutable runtime manifest via lookupPrivateDataSource.
|
|
11
|
+
|
|
12
|
+
function hasFetch(binding: unknown): binding is FetchPrivateDataSourceBinding {
|
|
13
|
+
return (
|
|
14
|
+
binding !== null &&
|
|
15
|
+
typeof binding === "object" &&
|
|
16
|
+
typeof (binding as { fetch?: unknown }).fetch === "function"
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function buildHttpPrivateDataSource(entry: PrivateDataSourceManifestEntry) {
|
|
21
|
+
return Object.freeze({
|
|
22
|
+
name: entry.name,
|
|
23
|
+
type: entry.type,
|
|
24
|
+
get bindingName() {
|
|
25
|
+
return currentPrivateDataSource(entry).bindingName;
|
|
26
|
+
},
|
|
27
|
+
fetch(resource: RequestInfo | URL, init?: RequestInit) {
|
|
28
|
+
const current = currentPrivateDataSource(entry);
|
|
29
|
+
const binding = privateDataSourceBinding(current);
|
|
30
|
+
if (!hasFetch(binding)) {
|
|
31
|
+
throw new Error(
|
|
32
|
+
`Private data source "${current.name}" does not expose fetch()`,
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
return binding.fetch(
|
|
36
|
+
resolveHttpPrivateDataSourceUrl(current, resource),
|
|
37
|
+
init,
|
|
38
|
+
);
|
|
39
|
+
},
|
|
40
|
+
// Fixed services expose the raw binding (Cloudflare pins their single
|
|
41
|
+
// target). Deferred Actor handles decide this from the request manifest,
|
|
42
|
+
// after their request environment exists.
|
|
43
|
+
get binding() {
|
|
44
|
+
const current = currentPrivateDataSource(entry);
|
|
45
|
+
return current.bindingName !== undefined
|
|
46
|
+
&& current.networkScope !== "network"
|
|
47
|
+
? privateDataSourceBinding(current)
|
|
48
|
+
: undefined;
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { buildHttpPrivateDataSource } from "./build-http.js";
|
|
2
|
+
import { privateDataSourceReference } from "./manifest.js";
|
|
3
|
+
|
|
4
|
+
export function elasticsearch(name: unknown) {
|
|
5
|
+
return buildHttpPrivateDataSource(
|
|
6
|
+
privateDataSourceReference(name, "elasticsearch"),
|
|
7
|
+
);
|
|
8
|
+
}
|