From 2d6216e224909c07b36504a850ce48911baed2fb Mon Sep 17 00:00:00 2001 From: Stefan Zerkalica Date: Thu, 14 Nov 2024 13:11:34 +0300 Subject: [PATCH] $mol_build_server refactor, restart bugs with request --- build/server/server.node.ts | 204 +++++++++++++++++------------------- file/base/base.ts | 8 +- 2 files changed, 101 insertions(+), 111 deletions(-) diff --git a/build/server/server.node.ts b/build/server/server.node.ts index d5dd507365..331960f10d 100644 --- a/build/server/server.node.ts +++ b/build/server/server.node.ts @@ -3,7 +3,6 @@ namespace $ { export class $mol_build_server extends $mol_server { static trace = false - sync_middleware( mdl: ( @@ -11,32 +10,36 @@ namespace $ { res : typeof $node.express.response , ) => boolean | void ) { - const pending_urls = {} as Record | undefined> - const wrapped = $mol_wire_async(mdl) + // const wrapped = $mol_wire_async(mdl) - const cb = async ( + 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() - delete pending_urls[req.url] + + // await Promise.resolve() next() - } catch (err) { - delete pending_urls[req.url] - console.error(err) - next(err) + + } catch (error: any) { + if (! this.$.$mol_build_server.trace) { + error.message += '\n' + 'Set $mol_build_server.trace = true for stacktraces' + } + + res.status(500).send( error.toString() ).end() + + this.$.$mol_log3_fail({ + place: `${this}.${mdl.name}()`, + uri: req.path, + stack: this.$.$mol_build_server.trace ? error.stack : undefined, + message: error.message, + }) } } - - return ( - req : typeof $node.express.request , - res : typeof $node.express.response , - next : (err?: unknown) => any - ) => pending_urls[req.url] = pending_urls[req.url] ?? cb(req, res, next) } @@ -46,8 +49,7 @@ namespace $ { req : typeof $node.express.request , res : typeof $node.express.response, ) { - - res.set( 'Cache-Control', 'no-cache, public' ) + $mol_wire_sync(res).set( 'Cache-Control', 'no-cache, public' ) try { @@ -62,40 +64,24 @@ namespace $ { // } this.generate( req.url ) - return true + return true // next } catch( error: any ) { + if ($mol_promise_like(error)) $mol_fail_hidden(error) - if( $mol_fail_catch( error ) ) { - this.$.$mol_log3_fail({ - place: `${this}.handleRequest()`, - uri: req.path, - message: error.message, - stack: error.stack, - }) - } - - if( req.url.match( /\.js$/ ) ) { - - const script = ( error as Error ).message.split( '\n\n' ).map( msg => { - return `console.error( ${ JSON.stringify( msg ) } )` - } ).join( '\n' ) - - res.send( script ).end() - - } else { - if (! this.$.$mol_build_server.trace) { - error.message += '\n' + 'Set $mol_build_server.trace = true for stacktraces' - } + if (! req.url.match( /\.js$/ ) ) $mol_fail_hidden(error) - res.status(500).send( error.toString() ).end() - this.$.$mol_log3_fail({ - place: `${this}.handleRequest()`, - uri: req.path, - stack: this.$.$mol_build_server.trace ? error.stack : undefined, - message: error.message, - }) - } + this.$.$mol_log3_fail({ + place: `${this}.handleRequest()`, + uri: req.path, + message: error.message, + stack: error.stack, + }) + const script = ( error as Error ).message.split( '\n\n' ).map( msg => { + return `console.error( ${ JSON.stringify( msg ) } )` + } ).join( '\n' ) + + res.send( script ).end() } } @@ -125,9 +111,9 @@ namespace $ { } const path = mod.path() - build.bundle( [ path , bundle ] ) - return new Date + return build.bundle( [ path , bundle ] ) } + @ $mol_mem_key ensure_index(path: string) { $mol_wire_solid() @@ -141,7 +127,7 @@ namespace $ { req : typeof $node.express.request , res : typeof $node.express.response , ) { - const root = $mol_file.absolute( this.rootPublic() ) + const root = this.$.$mol_file.absolute( this.rootPublic() ) const dir = root.resolve( req.path ) this.ensure_index( dir.path() ) @@ -152,67 +138,71 @@ namespace $ { const file = root.resolve( `${req.path}index.html` ) if( file.exists() ) { - return res.redirect( 301, `${match[1]}-/test.html${match[2] ?? ''}` ) - } + res.redirect( 301, `${match[1]}-/test.html${match[2] ?? ''}` ) + return + } - if( dir.type() === 'dir' ) { - const files = [ {name: '-', type: 'dir'} ] - for( const file of dir.sub() ) { - if (!files.find(( {name} ) => name === file.name())) { - files.push( {name: file.name(), type: file.type()} ) - } - if( /\.meta\.tree$/.test( file.name() ) ) { - const meta = $$.$mol_tree2_from_string( file.text() ) - for( const pack of meta.select( 'pack', null ).kids ) { - if (!files.find(( {name} ) => name === pack.type)) - files.push( {name: pack.type, type: 'dir'} ) - } + if( dir.type() !== 'dir' ) return true + + const files = [ {name: '-', type: 'dir'} ] + + for( const file of dir.sub() ) { + + if (!files.find(( {name} ) => name === file.name())) { + files.push( {name: file.name(), type: file.type()} ) + } + + if( /\.meta\.tree$/.test( file.name() ) ) { + const meta = $$.$mol_tree2_from_string( file.text() ) + + for( const pack of meta.select( 'pack', null ).kids ) { + if ( files.find(( {name} ) => name === pack.type) ) continue + + files.push( {name: pack.type, type: 'dir'} ) } } - const html = ` - - - 📁 .. - ` + files - .sort($mol_compare_text((item) => item.type)) - .map( file => `${file.type === 'dir' ? '📁' : '📄'} ${file.name}` ) - .join( '\n' ) - - res.writeHead( 200, { - 'Content-Type': 'text/html', - 'Access-Control-Allow-Origin': '*', - } ) - - res.end( html ) - return false } + + const html = ` + + + 📁 .. + ` + files + .sort($mol_compare_text((item) => item.type)) + .map( file => `${file.type === 'dir' ? '📁' : '📄'} ${file.name}` ) + .join( '\n' ) - return true + res.writeHead( 200, { + 'Content-Type': 'text/html', + 'Access-Control-Allow-Origin': '*', + } ) + + res.end( html ) } port() { diff --git a/file/base/base.ts b/file/base/base.ts index a4b269d48d..35146a5ee2 100644 --- a/file/base/base.ts +++ b/file/base/base.ts @@ -32,7 +32,8 @@ namespace $ { // Отслеживать проверку наличия родительской папки не стоит до корня диска // Лучше ограничить mam-ом - if ( path !== this.$.$mol_file_base.watch_root && path !== parent.path() ) { + const root = (this.constructor as typeof $mol_file_base).watch_root + if ( path !== root && path !== parent.path() ) { /* Если родитель удалился, надо ресетнуть все дочерние на любой глубине Родитель может удалиться, потом создасться, а дочерняя папка только удалиться. @@ -58,7 +59,7 @@ namespace $ { protected static frame = null as null | $mol_after_timeout protected static changed_add(type: 'addDir' | 'unlinkDir' | 'add' | 'change' | 'unlink', path: string) { - const file = this.$.$mol_file_base.relative( path.at(-1) === '/' ? path.slice(0, -1) : path ) + const file = this.relative( path.at(-1) === '/' ? path.slice(0, -1) : path ) if (type === 'add') { // добавился файл - у parent надо обновить список sub, если он был заюзан @@ -97,7 +98,6 @@ namespace $ { @ $mol_action static flush() { - // this.flush_counter() // Пока flush работает, вотчер сюда не заходит, но может добавлять новые изменения // на каждом перезапуске они применятся // Пока run выполняется, изменения накапливаются, в конце run вызывается flush @@ -147,7 +147,7 @@ namespace $ { на следующем перезапуске вызывается git pull, т.к. с точки зрения реактивной системы hyoo/board еще не существует. */ - this.changed.add(this.$.$mol_file_base.absolute(path)) + this.changed.add(this.absolute(path)) } static watch_off(side_effect: () => Result, affected_dir: string) {