From c7666cbebccd58fd8e57a5e34d5aa6cd334baf49 Mon Sep 17 00:00:00 2001 From: Stefan Zerkalica Date: Thu, 14 Nov 2024 16:14:28 +0300 Subject: [PATCH] $mol_build_server fixes --- build/ensure/ensure.ts | 3 +++ build/server/server.node.ts | 43 ++++++++++++++++--------------------- file/base/base.ts | 19 ++++++++++++++-- file/file.node.ts | 1 + file/file.web.ts | 3 ++- run/run.node.ts | 5 ++++- 6 files changed, 46 insertions(+), 28 deletions(-) diff --git a/build/ensure/ensure.ts b/build/ensure/ensure.ts index b30e2359db..a9cf98f88c 100644 --- a/build/ensure/ensure.ts +++ b/build/ensure/ensure.ts @@ -50,6 +50,9 @@ namespace $ { @ $mol_mem_key ensure( path : string ): boolean { + if (path.includes('/-/')) { + console.warn('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ensure build', new Error().stack) + } const mod = $mol_file.absolute( path ) const parent = mod.parent() diff --git a/build/server/server.node.ts b/build/server/server.node.ts index 331960f10d..734955b965 100644 --- a/build/server/server.node.ts +++ b/build/server/server.node.ts @@ -8,23 +8,20 @@ namespace $ { mdl: ( req : typeof $node.express.request , res : typeof $node.express.response , - ) => boolean | void + ) => void | boolean ) { - // const wrapped = $mol_wire_async(mdl) + const wrapped = $mol_wire_async(mdl) return async ( req : typeof $node.express.request , res : typeof $node.express.response , next : (err?: unknown) => any ) => { - const wrapped = $mol_wire_async(mdl) - try { - const call_next = await wrapped(req, res) - if (! call_next) return - - // await Promise.resolve() - next() + // const wrapped = $mol_wire_async(mdl) + try { + const stopped = await wrapped(req, res) + if (! stopped) Promise.resolve().then(next) } catch (error: any) { if (! this.$.$mol_build_server.trace) { error.message += '\n' + 'Set $mol_build_server.trace = true for stacktraces' @@ -49,7 +46,6 @@ namespace $ { req : typeof $node.express.request , res : typeof $node.express.response, ) { - $mol_wire_sync(res).set( 'Cache-Control', 'no-cache, public' ) try { @@ -64,7 +60,7 @@ namespace $ { // } this.generate( req.url ) - return true // next + res.set( 'Cache-Control', 'no-cache, public' ) } catch( error: any ) { if ($mol_promise_like(error)) $mol_fail_hidden(error) @@ -82,6 +78,7 @@ namespace $ { } ).join( '\n' ) res.send( script ).end() + return true } } @@ -114,35 +111,32 @@ namespace $ { return build.bundle( [ path , bundle ] ) } - @ $mol_mem_key - ensure_index(path: string) { - $mol_wire_solid() - - return this.build().modEnsure( path ) - } - override expressIndex() { return this.sync_middleware(this.expressIndexRequest.bind(this)) } expressIndexRequest( req : typeof $node.express.request , res : typeof $node.express.response , ) { + // a/b/?c#d, a/b/-/ + const match = req.url.match( /(\/|.*[^\-]\/)([\?#].*)?$/ ) + if( !match) return + const root = this.$.$mol_file.absolute( this.rootPublic() ) const dir = root.resolve( req.path ) - this.ensure_index( dir.path() ) + const path = dir.path() - const match = req.url.match( /(\/|.*[^\-]\/)([\?#].*)?$/ ) - if( !match) return true + // ensure загружает сорцы, делает git pull, это не стоит делать на build-папках + this.build().modEnsure( path ) const file = root.resolve( `${req.path}index.html` ) if( file.exists() ) { res.redirect( 301, `${match[1]}-/test.html${match[2] ?? ''}` ) - return + return true } - if( dir.type() !== 'dir' ) return true + if( dir.type() !== 'dir' ) return const files = [ {name: '-', type: 'dir'} ] @@ -153,7 +147,7 @@ namespace $ { } if( /\.meta\.tree$/.test( file.name() ) ) { - const meta = $$.$mol_tree2_from_string( file.text() ) + const meta = this.$.$mol_tree2_from_string( file.text() ) for( const pack of meta.select( 'pack', null ).kids ) { if ( files.find(( {name} ) => name === pack.type) ) continue @@ -203,6 +197,7 @@ namespace $ { } ) res.end( html ) + return true } port() { diff --git a/file/base/base.ts b/file/base/base.ts index 35146a5ee2..e5b290bc63 100644 --- a/file/base/base.ts +++ b/file/base/base.ts @@ -60,6 +60,7 @@ namespace $ { protected static changed_add(type: 'addDir' | 'unlinkDir' | 'add' | 'change' | 'unlink', path: string) { const file = this.relative( path.at(-1) === '/' ? path.slice(0, -1) : path ) + console.log(type, path) if (type === 'add') { // добавился файл - у parent надо обновить список sub, если он был заюзан @@ -88,6 +89,7 @@ namespace $ { this.frame?.destructor() this.frame = new this.$.$mol_after_timeout(this.watch_debounce(), () => { + console.log('changed_add scheduled: ', this.watching ? 'yes' : 'no') if (! this.watching) return this.watching = false $mol_wire_async(this).flush() @@ -127,7 +129,9 @@ namespace $ { // Выставляем обратно в true, что б watch мог зайти сюда this.watching = true - } + this.watch_wd?.destructor() + this.watch_wd = null + } protected static watching = true @@ -148,8 +152,16 @@ namespace $ { с точки зрения реактивной системы hyoo/board еще не существует. */ this.changed.add(this.absolute(path)) + const stack = new Error().stack + this.watch_wd = new $mol_after_timeout(10000, () => { + console.error('Lock timeout') + console.error(stack) + }) + } + protected static watch_wd = null as null | $mol_after_timeout + static watch_off(side_effect: () => Result, affected_dir: string) { // ждем, пока выполнится предыдущий watch_off const unlock = this.lock.grab() @@ -178,7 +190,9 @@ namespace $ { @ $mol_mem version() { - return this.stat()?.mtime.getTime().toString( 36 ).toUpperCase() ?? '' + const next = this.stat()?.mtime.getTime().toString( 36 ).toUpperCase() ?? '' + console.log('version', next, this.path()) + return next } protected info( path: string ) { return null as null | $mol_file_stat } @@ -289,6 +303,7 @@ namespace $ { const exists = Boolean( this.stat() ) + console.log('exists current', exists, 'next', next, this.path()) if( next === undefined ) return exists if( next === exists ) return exists diff --git a/file/file.node.ts b/file/file.node.ts index d2a22d1372..60a6321e94 100644 --- a/file/file.node.ts +++ b/file/file.node.ts @@ -52,6 +52,7 @@ namespace $ { @ $mol_mem_key static watcher(path: string) { + // const w = $node.fs.watch(path) const watcher = $node.chokidar.watch( path , { persistent : true , ignored: path => /([\/\\]\.|___$)/.test( path ), diff --git a/file/file.web.ts b/file/file.web.ts index 722343cbdc..17a332ca0c 100644 --- a/file/file.web.ts +++ b/file/file.web.ts @@ -7,7 +7,8 @@ namespace $ { : '' // Вотчер выключен, версия всегда будет одна - override version() { return '' } + // Если пустая строка - будет считаться, что файла нет + override version() { return '1' } // Ворнинги подавляем, иначе в каждом приложении, загружающим локали, будет ворнинг // override watcher() { return { destructor() {} }} diff --git a/run/run.node.ts b/run/run.node.ts index ebfcc5abc2..6e0d9e32e6 100644 --- a/run/run.node.ts +++ b/run/run.node.ts @@ -88,7 +88,10 @@ namespace $ { let sub try { - sub = this.$.$mol_run_spawn(app, args, opts) + sub = this.$.$mol_run_spawn(app, args, { + ...opts, + stdio: [ 'pipe', 'inherit', 'inherit' ], + }) } catch (error) { throw new $mol_run_error( this.error_message(undefined),