(code: string, request: Request)
| 150 | |
| 151 | // Execute function in isolated worker |
| 152 | async function executeInWorker(code: string, request: Request): Promise<Response> { |
| 153 | // Get worker template |
| 154 | const template = await getWorkerTemplateCode(); |
| 155 | |
| 156 | // Fetch all function secrets |
| 157 | const secrets = await getFunctionSecrets(); |
| 158 | |
| 159 | // Create blob for worker |
| 160 | const workerBlob = new Blob([template], { type: 'application/javascript' }); |
| 161 | const workerUrl = URL.createObjectURL(workerBlob); |
| 162 | |
| 163 | return new Promise(async (resolve) => { |
| 164 | const worker = new Worker(workerUrl, { |
| 165 | type: 'module', |
| 166 | deno: { |
| 167 | permissions: { |
| 168 | // RESTRICTED: Native environment access is disabled to shield host secrets. |
| 169 | // Secrets are passed explicitly via message payload. |
| 170 | env: false, |
| 171 | // SDK/External REQUIREMENT: Allow network access for API connectivity and external integrations. |
| 172 | net: true, |
| 173 | read: false, |
| 174 | write: false, |
| 175 | run: false, |
| 176 | ffi: false, |
| 177 | sys: false, |
| 178 | import: false, |
| 179 | hrtime: false, |
| 180 | }, |
| 181 | }, |
| 182 | }); |
| 183 | |
| 184 | // Set timeout for worker execution |
| 185 | const timeout = setTimeout(() => { |
| 186 | worker.terminate(); |
| 187 | URL.revokeObjectURL(workerUrl); |
| 188 | resolve( |
| 189 | new Response(JSON.stringify({ error: 'Function timeout' }), { |
| 190 | status: 504, |
| 191 | headers: { 'Content-Type': 'application/json' }, |
| 192 | }) |
| 193 | ); |
| 194 | }, WORKER_TIMEOUT_MS); |
| 195 | |
| 196 | // Handle worker response |
| 197 | worker.onmessage = (e) => { |
| 198 | clearTimeout(timeout); |
| 199 | worker.terminate(); |
| 200 | URL.revokeObjectURL(workerUrl); |
| 201 | |
| 202 | if (e.data.success) { |
| 203 | const { response } = e.data; |
| 204 | // The worker now properly sends null for bodyless responses |
| 205 | resolve( |
| 206 | new Response(response.body, { |
| 207 | status: response.status, |
| 208 | statusText: response.statusText, |
| 209 | headers: response.headers, |
no test coverage detected