@@ -2,6 +2,7 @@ import { createProgress, writeFile } from './_utils.js';
22import { getFormat , loader , loadProgress , registerJSModule , run , runAsync , runEvent } from './_python.js' ;
33import { stdio } from './_io.js' ;
44import { IDBMapSync , isArray , fixedRelative , js_modules } from '../utils.js' ;
5+ import _remote_package from './_remote_package.js' ;
56
67const type = 'pyodide' ;
78const toJsOptions = { dict_converter : Object . fromEntries } ;
@@ -84,46 +85,55 @@ export default {
8485 // https://github.com/pyodide/pyodide/issues/5736
8586 const save = config . packages_cache !== 'never' && version !== '0.28.0' ;
8687 await storage . sync ( ) ;
88+ progress ( 'Loaded Storage' ) ;
8789 // packages_cache = 'never' means: erase the whole DB
8890 if ( ! save ) storage . clear ( ) ;
8991 // otherwise check if cache is known
90- else if ( packages ) {
91- // packages_cache = 'passthrough' means: do not use micropip.install
92- if ( config . packages_cache === 'passthrough' ) {
93- options . packages = packages ;
94- packages = null ;
95- storage . clear ( ) ;
92+ if ( packages ) {
93+ if ( config . experimental_remote_packages ) {
94+ progress ( 'Loading remote packages' ) ;
95+ config . packages = ( packages = await _remote_package ( config , packages ) ) ;
96+ progress ( 'Loaded remote packages' ) ;
9697 }
97- else {
98- packages = packages . sort ( ) ;
99- // packages are uniquely stored as JSON key
100- const key = stringify ( packages ) ;
101- if ( storage . has ( key ) ) {
102- const value = storage . get ( key ) ;
98+ if ( save ) {
99+ // packages_cache = 'passthrough' means: do not use micropip.install
100+ if ( config . packages_cache === 'passthrough' ) {
101+ options . packages = packages ;
102+ packages = null ;
103+ storage . clear ( ) ;
104+ }
105+ else {
106+ packages = packages . sort ( ) ;
107+ // packages are uniquely stored as JSON key
108+ const key = stringify ( packages ) ;
109+ if ( storage . has ( key ) ) {
110+ const value = storage . get ( key ) ;
103111
104- // versions are not currently understood by pyodide when
105- // a lockFileURL is used instead of micropip.install(packages)
106- // https://github.com/pyodide/pyodide/issues/5135#issuecomment-2441038644
107- // https://github.com/pyscript/pyscript/issues/2245
108- options . packages = packages . map ( name => name . split ( / [ > = < ] = / ) [ 0 ] ) ;
112+ // versions are not currently understood by pyodide when
113+ // a lockFileURL is used instead of micropip.install(packages)
114+ // https://github.com/pyodide/pyodide/issues/5135#issuecomment-2441038644
115+ // https://github.com/pyscript/pyscript/issues/2245
116+ options . packages = packages . map ( name => name . split ( / [ > = < ] = / ) [ 0 ] ) ;
109117
110- if ( version . startsWith ( '0.27' ) ) {
111- const blob = new Blob ( [ value ] , { type : 'application/json' } ) ;
112- options . lockFileURL = URL . createObjectURL ( blob ) ;
113- }
114- else {
115- options . lockFileContents = value ;
116- }
118+ if ( version . startsWith ( '0.27' ) ) {
119+ const blob = new Blob ( [ value ] , { type : 'application/json' } ) ;
120+ options . lockFileURL = URL . createObjectURL ( blob ) ;
121+ }
122+ else {
123+ options . lockFileContents = value ;
124+ }
117125
118- packages = null ;
126+ packages = null ;
127+ }
119128 }
120129 }
121130 }
122- progress ( 'Loaded Storage' ) ;
123131 const { stderr, stdout, get } = stdio ( ) ;
132+ progress ( 'Loading interpreter' ) ;
124133 const interpreter = await get (
125134 loadPyodide ( { stderr, stdout, ...options } ) ,
126135 ) ;
136+ progress ( 'Loaded interpreter' ) ;
127137 globalThis [ js_modules ] . set ( '-T-' , this . transform . bind ( this , interpreter ) ) ;
128138 if ( config . debug ) interpreter . setDebug ( true ) ;
129139 const py_imports = importPackages . bind ( interpreter ) ;
0 commit comments