Skip to content

Commit

Permalink
$mol_build_server refactor, restart bugs with request
Browse files Browse the repository at this point in the history
  • Loading branch information
zerkalica committed Nov 14, 2024
1 parent 0b98ef2 commit 2d6216e
Show file tree
Hide file tree
Showing 2 changed files with 101 additions and 111 deletions.
204 changes: 97 additions & 107 deletions build/server/server.node.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,40 +3,43 @@ namespace $ {
export class $mol_build_server extends $mol_server {

static trace = false


sync_middleware(
mdl: (
req : typeof $node.express.request ,
res : typeof $node.express.response ,
) => boolean | void
) {
const pending_urls = {} as Record<string, Promise<unknown> | 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)
}


Expand All @@ -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 {

Expand All @@ -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()
}
}

Expand Down Expand Up @@ -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()
Expand All @@ -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() )
Expand All @@ -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 = `
<style>
body {
display: flex;
flex-direction: column;
flex-wrap: wrap;
font: 1rem/1.5rem sans-serif;
height: 100%;
margin: 0;
padding: 0.75rem;
box-sizing: border-box;
}
a {
text-decoration: none;
color: rgb(57, 115, 172);
font-weight: bolder;
}
a:hover {
background: hsl( 0deg, 0%, 0%, .05 )
}
a[href^="."], a[href^="-"], a[href="node_modules"] {
opacity: 0.5;
}
a[href=".."], a[href="-"] {
opacity: 1;
}
</style>
<link href="/_logo.png" rel="icon" />
<a href="..">&#x1F4C1; ..</a>
` + files
.sort($mol_compare_text((item) => item.type))
.map( file => `<a href="${file.name}">${file.type === 'dir' ? '&#x1F4C1;' : '&#128196;'} ${file.name}</a>` )
.join( '\n' )

res.writeHead( 200, {
'Content-Type': 'text/html',
'Access-Control-Allow-Origin': '*',
} )

res.end( html )
return false
}

const html = `
<style>
body {
display: flex;
flex-direction: column;
flex-wrap: wrap;
font: 1rem/1.5rem sans-serif;
height: 100%;
margin: 0;
padding: 0.75rem;
box-sizing: border-box;
}
a {
text-decoration: none;
color: rgb(57, 115, 172);
font-weight: bolder;
}
a:hover {
background: hsl( 0deg, 0%, 0%, .05 )
}
a[href^="."], a[href^="-"], a[href="node_modules"] {
opacity: 0.5;
}
a[href=".."], a[href="-"] {
opacity: 1;
}
</style>
<link href="/_logo.png" rel="icon" />
<a href="..">&#x1F4C1; ..</a>
` + files
.sort($mol_compare_text((item) => item.type))
.map( file => `<a href="${file.name}">${file.type === 'dir' ? '&#x1F4C1;' : '&#128196;'} ${file.name}</a>` )
.join( '\n' )

return true
res.writeHead( 200, {
'Content-Type': 'text/html',
'Access-Control-Allow-Origin': '*',
} )

res.end( html )
}

port() {
Expand Down
8 changes: 4 additions & 4 deletions file/base/base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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() ) {
/*
Если родитель удалился, надо ресетнуть все дочерние на любой глубине
Родитель может удалиться, потом создасться, а дочерняя папка только удалиться.
Expand All @@ -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, если он был заюзан
Expand Down Expand Up @@ -97,7 +98,6 @@ namespace $ {

@ $mol_action
static flush() {
// this.flush_counter()
// Пока flush работает, вотчер сюда не заходит, но может добавлять новые изменения
// на каждом перезапуске они применятся
// Пока run выполняется, изменения накапливаются, в конце run вызывается flush
Expand Down Expand Up @@ -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<Result>(side_effect: () => Result, affected_dir: string) {
Expand Down

0 comments on commit 2d6216e

Please sign in to comment.