@@ -104,7 +104,8 @@ genericCompiler('pyjs', `${thirdPartyCompilers}/pyjs`, {
104104 es : 'sane' ,
105105 hofs : 'builtin' ,
106106 jsArgs : 'faithful' ,
107- requireRuntime : false
107+ requireRuntime : false ,
108+ eval : false
108109} ) ;
109110
110111genericCompiler ( 'emscripten' , `${ thirdPartyCompilers } /emscripten` , {
@@ -115,7 +116,8 @@ genericCompiler('emscripten', `${thirdPartyCompilers}/emscripten`, {
115116 es : 'sane' ,
116117 hofs : 'builtin' ,
117118 jsArgs : 'simple' ,
118- requireRuntime : false
119+ requireRuntime : false ,
120+ eval : false
119121} ) ;
120122
121123genericCompiler ( 'bucklescript' , `${ thirdPartyCompilers } /bucklescript` , {
@@ -126,7 +128,8 @@ genericCompiler('bucklescript', `${thirdPartyCompilers}/bucklescript`, {
126128 es : 'sane' ,
127129 hofs : 'builtin' ,
128130 jsArgs : 'simple' ,
129- requireRuntime : false
131+ requireRuntime : false ,
132+ eval : false
130133} ) ;
131134
132135genericCompiler ( 'scalajs' , `${ thirdPartyCompilers } /scalajs` , {
@@ -137,7 +140,8 @@ genericCompiler('scalajs', `${thirdPartyCompilers}/scalajs`, {
137140 es : 'sane' ,
138141 hofs : 'builtin' ,
139142 jsArgs : 'simple' ,
140- requireRuntime : false
143+ requireRuntime : false ,
144+ eval : false
141145} ) ;
142146
143147genericCompiler ( 'clojurescript' , `${ thirdPartyCompilers } /clojurescript` , {
@@ -148,7 +152,8 @@ genericCompiler('clojurescript', `${thirdPartyCompilers}/clojurescript`, {
148152 es : 'sane' ,
149153 hofs : 'builtin' ,
150154 jsArgs : 'simple' ,
151- requireRuntime : false
155+ requireRuntime : false ,
156+ eval : false
152157} ) ;
153158
154159genericCompiler ( 'dart2js' , `${ thirdPartyCompilers } /dart2js` , {
@@ -159,5 +164,99 @@ genericCompiler('dart2js', `${thirdPartyCompilers}/dart2js`, {
159164 es : 'sane' ,
160165 hofs : 'builtin' ,
161166 jsArgs : 'simple' ,
162- requireRuntime : false
167+ requireRuntime : false ,
168+ eval : false
169+ } ) ;
170+
171+ stopify . post ( '/pyjs-fast' , bodyParser . text ( { type : '*/*' } ) , async ( req , resp ) => {
172+ try {
173+ resp . set ( 'Access-Control-Allow-Origin' , '*' ) ;
174+ resp . set ( 'Access-Control-Allow-Methods' , 'POST' ) ;
175+
176+ const { filename, exists } = await checkCache ( 'pyjs-fast' , req . body ) ;
177+ if ( exists ) {
178+ return resp . send ( filename ) ;
179+ }
180+ console . info ( `Compiling PyJS (fast) program (${ req . body . length } bytes)` ) ;
181+ const url = `${ thirdPartyCompilers } /pyjs-fast` ;
182+ const jsCode = await request . post ( url , { headers, body : req . body } ) ;
183+ console . info ( `Stopifying program (${ jsCode . length } bytes)` ) ;
184+ const dir = await tmpDir ( ) ;
185+ try {
186+ const jsPath = `${ dir } /original.js` ;
187+ await fs . writeFile ( jsPath , jsCode + '\npygwtOnLoad();' ) ;
188+ const stopifiedJsCode = await stopifyCompiler . stopify ( jsPath , {
189+ compileFunction : 'module' ,
190+ getters : false ,
191+ debug : false ,
192+ captureMethod : 'lazy' ,
193+ newMethod : 'wrapper' ,
194+ es : 'sane' ,
195+ hofs : 'builtin' ,
196+ jsArgs : 'faithful' ,
197+ requireRuntime : false ,
198+ eval : false
199+ } ) ;
200+ const prelude = await fs . readFile ( __dirname + '/../pyjs_prelude.lazy.wrapper.faithful.js' ) ;
201+ await bucket . file ( filename ) . save ( prelude + stopifiedJsCode + `
202+ $__R.delimit(function () {
203+ $S.onEnd();
204+ });`
205+ ) ;
206+ return resp . send ( filename ) ;
207+ }
208+ finally {
209+ await fs . remove ( dir ) ;
210+ }
211+ }
212+ catch ( exn ) {
213+ resp . statusCode = 503 ;
214+ const reason =
215+ ( exn . name === 'StatusCodeError' ? exn . response . body : exn ) . toString ( ) ;
216+ console . error ( `Error: ${ reason } ` ) ;
217+ return resp . send ( reason . toString ( ) ) ;
218+ }
219+ } ) ;
220+
221+ stopify . post ( '/js' , bodyParser . text ( { type : '*/*' } ) , async ( req , resp ) => {
222+ try {
223+ resp . set ( 'Access-Control-Allow-Origin' , '*' ) ;
224+ resp . set ( 'Access-Control-Allow-Methods' , 'POST' ) ;
225+
226+ const { filename, exists } = await checkCache ( 'js' , req . body ) ;
227+ if ( exists ) {
228+ return resp . send ( filename ) ;
229+ }
230+ console . info ( `Compiling JavaScript program (${ req . body . length } bytes)` ) ;
231+ const jsCode = req . body ;
232+ const dir = await tmpDir ( ) ;
233+ try {
234+ const jsPath = `${ dir } /original.js` ;
235+ await fs . writeFile ( jsPath , jsCode ) ;
236+ const stopifiedJsCode = await stopifyCompiler . stopify ( jsPath , {
237+ compileFunction : false ,
238+ getters : false ,
239+ debug : true ,
240+ captureMethod : 'lazy' ,
241+ newMethod : 'wrapper' ,
242+ es : 'sane' ,
243+ hofs : 'builtin' ,
244+ jsArgs : 'faithful' ,
245+ requireRuntime : false ,
246+ eval : false
247+ } ) ;
248+ await bucket . file ( filename ) . save ( stopifiedJsCode ) ;
249+ return resp . send ( filename ) ;
250+ }
251+ finally {
252+ await fs . remove ( dir ) ;
253+ }
254+ }
255+ catch ( exn ) {
256+ resp . statusCode = 503 ;
257+ const reason =
258+ ( exn . name === 'StatusCodeError' ? exn . response . body : exn ) . toString ( ) ;
259+ console . error ( `Error: ${ reason } ` ) ;
260+ return resp . send ( reason . toString ( ) ) ;
261+ }
163262} ) ;
0 commit comments