@@ -14,6 +14,7 @@ import {
1414 getEssentialPackages ,
1515 isFirstRun ,
1616} from "./cache-utils.ts" ;
17+ import type { FileData } from "jsr:@runtimed/schema" ;
1718
1819declare const self : DedicatedWorkerGlobalScope ;
1920
@@ -112,6 +113,76 @@ await run_registered_tool("${data.toolName}", kwargs_string)
112113 break ;
113114 }
114115
116+ case "files" : {
117+ if ( ! pyodide ) {
118+ throw new Error ( "Pyodide not initialized" ) ;
119+ }
120+
121+ try {
122+ // Cast the files to the expected type
123+ const files = data . files as readonly FileData [ ] ;
124+ // Cast the artifact base URL to the expected type
125+ const artifactBaseUrl = data . artifactBaseUrl as string ;
126+
127+ if ( ! artifactBaseUrl ) {
128+ throw new Error ( "Artifact base URL is required" ) ;
129+ }
130+
131+ const filesInDirectory = pyodide . FS . readdir ( "./" ) ;
132+
133+ // Write/delete the new files
134+ for ( const file of files ) {
135+ if ( file . deletedAt ) {
136+ if ( ! filesInDirectory . includes ( file . fileName ) ) {
137+ continue ;
138+ }
139+ console . log ( "worker deleting file" , { file } ) ;
140+ // Just in case we couldn't match the file, we want to put a try/catch
141+ // to avoid the worker crashing
142+ try {
143+ pyodide . FS . unlink ( `./${ file . fileName } ` ) ;
144+ } catch ( error ) {
145+ // File doesn't exist, nothing to delete
146+ console . log ( "file does not exist, skipping deletion" , {
147+ fileName : file . fileName ,
148+ error,
149+ } ) ;
150+ }
151+ } else {
152+ console . log ( "worker fetching file" , { file } ) ;
153+ console . log ( "artifactBaseUrl" , artifactBaseUrl ) ;
154+ const response = await fetch (
155+ artifactBaseUrl + file . artifactId ,
156+ ) ;
157+
158+ // Handle different file types based on mimeType
159+ if ( file . mimeType && file . mimeType . startsWith ( "text/" ) ) {
160+ // Text files
161+ const content = await response . text ( ) ;
162+ pyodide . FS . writeFile ( `./${ file . fileName } ` , content ) ;
163+ } else {
164+ // Binary files (images, etc.)
165+ const arrayBuffer = await response . arrayBuffer ( ) ;
166+ const uint8Array = new Uint8Array ( arrayBuffer ) ;
167+ pyodide . FS . writeFile ( `./${ file . fileName } ` , uint8Array ) ;
168+ }
169+ }
170+ }
171+
172+ console . log ( "worker wrote files and cleaned up old files" , { data } ) ;
173+
174+ self . postMessage ( { id, type : "response" , data : { success : true } } ) ;
175+ } catch ( error ) {
176+ console . error ( "Error in files message handler" , error ) ;
177+ self . postMessage ( {
178+ id,
179+ type : "response" ,
180+ error : error instanceof Error ? error . message : String ( error ) ,
181+ } ) ;
182+ }
183+ break ;
184+ }
185+
115186 case "shutdown" : {
116187 await shutdownWorker ( ) ;
117188 self . postMessage ( { id, type : "response" , data : { success : true } } ) ;
0 commit comments