@base44/functions-compiler 0.1.2 → 0.1.4

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.
@@ -11,6 +11,7 @@ const PUBLIC_MODULES = new Set([
11
11
  "mariadb",
12
12
  "mongodb",
13
13
  "mysql",
14
+ "oracle",
14
15
  "postgres",
15
16
  "redis",
16
17
  "sqlserver",
@@ -1 +1 @@
1
- {"version":3,"file":"private-data-sources-virtual.js","sourceRoot":"","sources":["../../../src/esbuild/private-data-sources-virtual.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"private-data-sources-virtual.js","sourceRoot":"","sources":["../../../src/esbuild/private-data-sources-virtual.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@ import nodeNet from "node:net";
3
3
  import { Duplex } from "node:stream";
4
4
 
5
5
  import { isCloudflareTcpSocket } from "./tcp";
6
+ import type { CloudflareTcpSocket } from "./types";
6
7
 
7
8
  interface NodeNetSocket extends Duplex {
8
9
  connecting: boolean;
@@ -95,10 +96,7 @@ export function buildNodeNetSocket(
95
96
  label: string,
96
97
  options: { deferConnectEvent?: boolean } = {},
97
98
  ): NodeNetSocket {
98
- if (!isCloudflareTcpSocket(socket)) {
99
- throw new Error(`${label} did not return a readable/writable TCP socket`);
100
- }
101
- const cloudflareSocket = socket;
99
+ let cloudflareSocket: CloudflareTcpSocket | undefined;
102
100
 
103
101
  let reader: ReadableStreamDefaultReader<Uint8Array> | null = null;
104
102
  let writer: WritableStreamDefaultWriter<Uint8Array> | null = null;
@@ -107,6 +105,14 @@ export function buildNodeNetSocket(
107
105
  let readableEnded = false;
108
106
  let timeout: ReturnType<typeof setTimeout> | null = null;
109
107
  let writeChain = Promise.resolve();
108
+ const socketReady = Promise.resolve(socket).then((resolved) => {
109
+ if (!isCloudflareTcpSocket(resolved)) {
110
+ throw new Error(`${label} did not return a readable/writable TCP socket`);
111
+ }
112
+ cloudflareSocket = resolved;
113
+ if (closed) resolved.close?.();
114
+ return resolved;
115
+ });
110
116
 
111
117
  function clearTimer() {
112
118
  if (!timeout) return;
@@ -143,8 +149,9 @@ export function buildNodeNetSocket(
143
149
  const bytes = chunk instanceof Uint8Array ? chunk : Buffer.from(chunk);
144
150
  writeChain = writeChain
145
151
  .then(async () => {
152
+ const connectedSocket = await socketReady;
146
153
  if (closed) throw new Error(`${label} connection is closed`);
147
- const activeWriter = writer ?? cloudflareSocket.writable.getWriter();
154
+ const activeWriter = writer ?? connectedSocket.writable.getWriter();
148
155
  writer = activeWriter;
149
156
  await activeWriter.write(bytes);
150
157
  })
@@ -157,7 +164,7 @@ export function buildNodeNetSocket(
157
164
  writeChain
158
165
  .then(() => {
159
166
  try {
160
- cloudflareSocket.close?.();
167
+ cloudflareSocket?.close?.();
161
168
  } finally {
162
169
  callback();
163
170
  }
@@ -168,7 +175,7 @@ export function buildNodeNetSocket(
168
175
  closed = true;
169
176
  clearTimer();
170
177
  try {
171
- cloudflareSocket.close?.();
178
+ cloudflareSocket?.close?.();
172
179
  } catch {
173
180
  // The stream is already being destroyed; surface the original error below.
174
181
  }
@@ -192,7 +199,7 @@ export function buildNodeNetSocket(
192
199
  };
193
200
 
194
201
  async function readLoop() {
195
- const activeReader = reader ?? cloudflareSocket.readable.getReader();
202
+ const activeReader = reader ?? cloudflareSocket!.readable.getReader();
196
203
  reader = activeReader;
197
204
  try {
198
205
  while (!closed) {
@@ -226,19 +233,15 @@ export function buildNodeNetSocket(
226
233
  }
227
234
  }
228
235
 
229
- if (cloudflareSocket.opened) {
230
- cloudflareSocket.opened.then(
231
- (info) => scheduleConnected(info),
232
- (error) => stream.destroy(error instanceof Error ? error : new Error(String(error))),
233
- );
234
- } else {
235
- queueMicrotask(() => scheduleConnected());
236
- }
237
- cloudflareSocket.closed?.finally(() => {
238
- closed = true;
239
- clearTimer();
240
- endReadable();
241
- releaseLocks();
236
+ socketReady.then(async (connectedSocket) => {
237
+ connectedSocket.closed?.finally(() => {
238
+ closed = true;
239
+ clearTimer();
240
+ endReadable();
241
+ releaseLocks();
242
+ }).catch((error) => stream.destroy(error instanceof Error ? error : new Error(String(error))));
243
+ const info = await connectedSocket.opened;
244
+ scheduleConnected(info);
242
245
  }).catch((error) => stream.destroy(error instanceof Error ? error : new Error(String(error))));
243
246
  return stream;
244
247
  }
@@ -0,0 +1,34 @@
1
+ import { createHash } from "node:crypto";
2
+
3
+ import { privateDataSourceReference } from "./manifest";
4
+ import { installPrivateNodeNetAdapter, registerPrivateNodeNetRoute } from "./node-net-adapter";
5
+ import { buildTcpPrivateDataSource } from "./tcp";
6
+
7
+ export function oracle(name: unknown) {
8
+ installPrivateNodeNetAdapter();
9
+ const entry = privateDataSourceReference(name, "oracle");
10
+ const source = buildTcpPrivateDataSource(entry);
11
+ // A numeric alias avoids Oracle's client-side DNS lookup of private hostnames.
12
+ const hash = createHash("sha256").update(String(entry.name)).digest("hex").slice(0, 28);
13
+ const driverHost = `fd44:${hash.match(/.{4}/g)!.join(":")}`;
14
+
15
+ const extension = {
16
+ oracledbOptions() {
17
+ const serviceName = source.database;
18
+ if (!serviceName || !/^[a-zA-Z0-9_.$#-]+$/.test(serviceName)) {
19
+ throw new Error("Enter an Oracle service name using letters, numbers, underscores, dots, $, #, or hyphens.");
20
+ }
21
+ const port = source.port!;
22
+ registerPrivateNodeNetRoute(driverHost, port, {
23
+ label: `Oracle private data source "${entry.name}"`,
24
+ connect: () => source.connect(),
25
+ });
26
+ return Object.freeze({
27
+ user: source.username,
28
+ password: source.password,
29
+ connectString: `(DESCRIPTION=(TRANSPORT_CONNECT_TIMEOUT=10)(CONNECT_TIMEOUT=15)(RETRY_COUNT=0)(ADDRESS=(PROTOCOL=TCP)(HOST=${driverHost})(PORT=${port}))(CONNECT_DATA=(SERVICE_NAME=${serviceName})(SERVER=DEDICATED)))`,
30
+ });
31
+ },
32
+ };
33
+ return Object.freeze(Object.defineProperties(extension, Object.getOwnPropertyDescriptors(source)) as typeof source & typeof extension);
34
+ }
@@ -12,4 +12,4 @@
12
12
  * drifts from `package.json`, so bumping the package still means editing two
13
13
  * files but cannot mean forgetting one.
14
14
  */
15
- export declare const COMPILER_VERSION = "0.1.2";
15
+ export declare const COMPILER_VERSION = "0.1.4";
@@ -12,5 +12,5 @@
12
12
  * drifts from `package.json`, so bumping the package still means editing two
13
13
  * files but cannot mean forgetting one.
14
14
  */
15
- export const COMPILER_VERSION = "0.1.2";
15
+ export const COMPILER_VERSION = "0.1.4";
16
16
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@base44/functions-compiler",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "Production compiler for Base44 backend functions — turns function sources into a single Cloudflare Workers module.",
5
5
  "license": "MIT",
6
6
  "repository": {