晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。 林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。 见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝) 既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。 南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。
| DIR:/proc/self/root/opt/alt/alt-nodejs20/root/usr/lib/node_modules/npm/lib/utils/ |
| Current File : //proc/self/root/opt/alt/alt-nodejs20/root/usr/lib/node_modules/npm/lib/utils/timers.js |
const EE = require('node:events')
const fs = require('node:fs')
const { log, time } = require('proc-log')
const INITIAL_TIMER = 'npm'
class Timers extends EE {
#file
#timing
#unfinished = new Map()
#finished = {}
constructor () {
super()
this.on()
time.start(INITIAL_TIMER)
this.started = this.#unfinished.get(INITIAL_TIMER)
}
on () {
process.on('time', this.#timeHandler)
}
off () {
process.off('time', this.#timeHandler)
}
load ({ path, timing } = {}) {
this.#timing = timing
this.#file = `${path}timing.json`
}
finish (metadata) {
time.end(INITIAL_TIMER)
for (const [name, timer] of this.#unfinished) {
log.silly('unfinished npm timer', name, timer)
}
if (!this.#timing) {
// Not in timing mode, nothing else to do here
return
}
try {
this.#writeFile(metadata)
log.info('timing', `Timing info written to: ${this.#file}`)
} catch (e) {
log.warn('timing', `could not write timing file: ${e}`)
}
}
#writeFile (metadata) {
const globalStart = this.started
const globalEnd = this.#finished[INITIAL_TIMER]
const content = {
metadata,
timers: this.#finished,
// add any unfinished timers with their relative start/end
unfinishedTimers: [...this.#unfinished.entries()].reduce((acc, [name, start]) => {
acc[name] = [start - globalStart, globalEnd - globalStart]
return acc
}, {}),
}
fs.writeFileSync(this.#file, JSON.stringify(content) + '\n')
}
#timeHandler = (level, name) => {
const now = Date.now()
switch (level) {
case time.KEYS.start:
this.#unfinished.set(name, now)
break
case time.KEYS.end: {
if (this.#unfinished.has(name)) {
const ms = now - this.#unfinished.get(name)
this.#finished[name] = ms
this.#unfinished.delete(name)
log.timing(name, `Completed in ${ms}ms`)
} else {
log.silly('timing', `Tried to end timer that doesn't exist: ${name}`)
}
}
}
}
}
module.exports = Timers
|