Skip to content

Commit

Permalink
$mol_build fix naming, better keep bundle
Browse files Browse the repository at this point in the history
  • Loading branch information
zerkalica committed Nov 14, 2024
1 parent b04f90c commit 48301eb
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 65 deletions.
4 changes: 2 additions & 2 deletions build/build.node.ts
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ namespace $ {
let content = ''
for( const step of tree.select( 'build' , null ).kids ) {

const res = this.$.$mol_file.watch_off(() => this.$.$mol_run.spawn( { command: step.text(), dir } ), dir )
const res = this.$.$mol_file.unwatched(() => this.$.$mol_run.spawn( { command: step.text(), dir } ), dir )
.stdout.toString().trim()
if( step.type ) content += `let ${ step.type } = ${ JSON.stringify( res ) }`

Expand Down Expand Up @@ -988,7 +988,7 @@ namespace $ {
if( bundle === 'node' ) {
const dir = this.root().path()

this.$.$mol_file.watch_off(() =>
this.$.$mol_file.unwatched(() =>
this.$.$mol_run.spawn( {
command: ['node', '--enable-source-maps', '--trace-uncaught', target.relate( this.root() ) ],
dir
Expand Down
6 changes: 3 additions & 3 deletions build/ensure/vcs/vcs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ namespace $ {
if (this.update_disabled) return false

try {
return this.$.$mol_file.watch_off(() => this.update(dir), dir)
return this.$.$mol_file.unwatched(() => this.update(dir), dir)
} catch (e) {
if (e instanceof $mol_run_error && e.cause.timeout_kill) {

Expand Down Expand Up @@ -76,7 +76,7 @@ namespace $ {
if (! this.inited(path)) {
if (! this.repo(path) ) return false

this.$.$mol_file.watch_off(() => this.init_existing(path), path)
this.$.$mol_file.unwatched(() => this.init_existing(path), path)
return true
}

Expand All @@ -90,7 +90,7 @@ namespace $ {

if (this.repo(path)) {

this.$.$mol_file.watch_off(() => this.init(path), path)
this.$.$mol_file.unwatched(() => this.init(path), path)

// mod.reset()
// for ( const sub of mod.sub() ) sub.reset()
Expand Down
53 changes: 28 additions & 25 deletions file/base/base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,13 +37,11 @@ namespace $ {
const root = (this.constructor as typeof $mol_file_base).watch_root
if ( path !== root && path !== parent.path() ) {
/*
Если родитель удалился, надо ресетнуть все дочерние на любой глубине
Родитель может удалиться, потом создасться, а дочерняя папка только удалиться.
Если папка удалилась, надо ресетнуть все объекты в ней на любой глубине.
rm -rf с последующим git pull: parent папка может удалиться, потом создасться, а текущая папка только удалиться.
Поэтому parent.exists() не запустит перевычисления
parent.version() меняется не только при удалении, будет ложное срабатывание
события вотчера addDir сбрасывает только parent.sub(), а parent.version() может остаться та же
тогда дочерний не перзапустится
Если addDir будет сбрасывать parent.version(), то будет лишний раз перевычислен parent, хоть и он сам не поменялся
*/

Expand All @@ -70,24 +68,26 @@ namespace $ {
protected static frame = null as null | $mol_after_timeout

protected static changed_add(type: 'change' | 'rename', path: string) {
if (/([\/\\]\.|___$)/.test( path )) return

const file = this.relative( path.at(-1) === '/' ? path.slice(0, -1) : path )
console.log(type, path)

// add: добавился файл - у parent надо обновить список sub, если он был заюзан
// change, unlink: обновился или удалился файл - ресетим
// addDir, добавилась папка, у parent обновляем список директорий в sub
// add (change): добавился файл - у parent надо обновить список sub, если он был заюзан
// change, unlink (rename): обновился или удалился файл - ресетим
// addDir (change), добавилась папка, у parent обновляем список директорий в sub
// дочерние ресетим
// версию папки не меняем, т.к. иначе выполнится логика, связанная

// unlinkDir, удалилась папка, ресетим ее
// unlinkDir (rename), удалилась папка, ресетим ее
// stat у всех дочерних обновится сам, т.к. связан с parent.version()
this.changed.add(file)

if (! this.watching) return

// throttle, пока события поступают файл может записываться, нельзя сбрасывать, аналог awaitWriteFinish из chokidar
// интервалы между change-сообщениями модифицируемого файла должны быть меньше watch_debounce
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()
Expand All @@ -107,28 +107,31 @@ namespace $ {
const parent = file.parent()

try {
if ( $mol_wire_probe(() => parent.sub())) parent.sub(null)
if ( $mol_wire_probe(() => parent.sub()) ) parent.sub(null)
file.reset()
} catch (error) {
if ($mol_fail_catch(error)) $mol_fail_log(error)
}
}

this.changed.clear()

// Выставляем обратно в true, что б watch мог зайти сюда
this.watching = true
this.watch_wd?.destructor()
this.watch_wd = null

// this.watch_wd?.destructor()
// this.watch_wd = null
}

protected static watching = true

protected static lock = new $mol_lock

@ $mol_action
protected static watching_off(path: string) {
protected static watch_off(path: string) {
this.watching = false
// run должен ожидать конца flush
this.flush()
this.watching = false

/*
watch запаздывает и событие может прилететь через 3 сек после окончания сайд эффекта
поэтому добавляем папку, которую меняет side_effect
Expand All @@ -141,20 +144,20 @@ 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)
})
// 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
// protected static watch_wd = null as null | $mol_after_timeout

static watch_off<Result>(side_effect: () => Result, affected_dir: string) {
// ждем, пока выполнится предыдущий watch_off
static unwatched<Result>(side_effect: () => Result, affected_dir: string) {
// ждем, пока выполнится предыдущий unwatched
const unlock = this.lock.grab()
this.watching_off(affected_dir)
this.watch_off(affected_dir)

try {
const result = side_effect()
Expand Down
59 changes: 24 additions & 35 deletions file/file.node.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,14 +51,10 @@ namespace $ {
}

@ $mol_mem_key
static watcher2(base: string) {
const watcher = $node.fs.watch( base, (type, name) => {
static watcher(path: string) {
const watcher = $node.fs.watch( path, (type, name) => {
if (! name) return
if (/([\/\\]\.|___$)/.test( name )) return

const path = $node.path.join( base, name )

this.changed_add(type, path)
this.changed_add(type, $node.path.join( path, name ))
})

watcher.on('error', e => this.$.$mol_fail_log(e) )
Expand All @@ -68,41 +64,34 @@ namespace $ {
watcher.close()
}
}
}

@ $mol_mem_key
static watcher(path: string) {
return this.watcher2(path)

const watcher = $node.chokidar.watch( path , {
persistent : true ,
ignored: path => /([\/\\]\.|___$)/.test( path ),
depth : 0 ,
ignoreInitial : true ,
awaitWriteFinish: {
stabilityThreshold: 100,
},
} )

watcher
.on( 'all' , (type: 'add' | 'change' | 'unlink' | 'addDir' | 'unlinkDir', path) => {
const normalized = type === 'unlink' || type === 'unlinkDir' ? 'rename' : 'change'
this.changed_add(normalized, path)
} )
.on( 'error' , e => this.$.$mol_fail_log(e) )
// const watcher = $node.chokidar.watch( path , {
// persistent : true ,
// ignored: path => /([\/\\]\.|___$)/.test( path ),
// depth : 0 ,
// ignoreInitial : true ,
// awaitWriteFinish: {
// stabilityThreshold: 100,
// },
// } )

// watcher
// .on( 'all' , (type: 'add' | 'change' | 'unlink' | 'addDir' | 'unlinkDir', path) => {
// const normalized = type === 'unlink' || type === 'unlinkDir' ? 'rename' : 'change'
// this.changed_add(normalized, path)
// } )
// .on( 'error' , e => this.$.$mol_fail_log(e) )

return {
destructor() {
watcher.close()
}
}
// return {
// destructor() {
// watcher.close()
// }
// }

}

override watcher() { return this.$.$mol_file_node.watcher(this.path()) }

protected fs() { return $mol_wire_sync($node.fs.promises) }

@ $mol_action
protected override info( path: string ) {
try {
Expand Down

0 comments on commit 48301eb

Please sign in to comment.