logixlysia 5.2.0 → 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +68 -85
- package/dist/index.js +5 -12
- package/package.json +27 -73
- package/src/extensions/banner.ts +26 -0
- package/src/extensions/index.ts +28 -0
- package/src/helpers/status.ts +58 -0
- package/src/index.ts +106 -0
- package/src/interfaces.ts +117 -0
- package/src/logger/create-logger.ts +246 -0
- package/src/logger/handle-http-error.ts +51 -0
- package/src/logger/index.ts +126 -0
- package/src/output/file.ts +85 -0
- package/src/output/fs.ts +5 -0
- package/src/output/index.ts +58 -0
- package/src/output/rotation-manager.ts +122 -0
- package/src/utils/error.ts +15 -0
- package/src/utils/rotation.ts +91 -0
- package/LICENSE +0 -21
- package/README.md +0 -51
- package/dist/index.cjs +0 -13
- package/dist/index.d.cts +0 -88
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { appendFile } from 'node:fs/promises'
|
|
2
|
+
import { dirname } from 'node:path'
|
|
3
|
+
import type { LogLevel, Options, RequestInfo, StoreData } from '../interfaces'
|
|
4
|
+
import { ensureDir } from './fs'
|
|
5
|
+
import { performRotation, shouldRotate } from './rotation-manager'
|
|
6
|
+
|
|
7
|
+
type LogToFileInput = {
|
|
8
|
+
filePath: string
|
|
9
|
+
level: LogLevel
|
|
10
|
+
request: RequestInfo
|
|
11
|
+
data: Record<string, unknown>
|
|
12
|
+
store: StoreData
|
|
13
|
+
options: Options
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export const logToFile = async (
|
|
17
|
+
...args:
|
|
18
|
+
| [LogToFileInput]
|
|
19
|
+
| [
|
|
20
|
+
string,
|
|
21
|
+
LogLevel,
|
|
22
|
+
RequestInfo,
|
|
23
|
+
Record<string, unknown>,
|
|
24
|
+
StoreData,
|
|
25
|
+
Options
|
|
26
|
+
]
|
|
27
|
+
): Promise<void> => {
|
|
28
|
+
const input: LogToFileInput =
|
|
29
|
+
typeof args[0] === 'string'
|
|
30
|
+
? (() => {
|
|
31
|
+
const [
|
|
32
|
+
filePathArg,
|
|
33
|
+
levelArg,
|
|
34
|
+
requestArg,
|
|
35
|
+
dataArg,
|
|
36
|
+
storeArg,
|
|
37
|
+
optionsArg
|
|
38
|
+
] = args as [
|
|
39
|
+
string,
|
|
40
|
+
LogLevel,
|
|
41
|
+
RequestInfo,
|
|
42
|
+
Record<string, unknown>,
|
|
43
|
+
StoreData,
|
|
44
|
+
Options
|
|
45
|
+
]
|
|
46
|
+
return {
|
|
47
|
+
filePath: filePathArg,
|
|
48
|
+
level: levelArg,
|
|
49
|
+
request: requestArg,
|
|
50
|
+
data: dataArg,
|
|
51
|
+
store: storeArg,
|
|
52
|
+
options: optionsArg
|
|
53
|
+
}
|
|
54
|
+
})()
|
|
55
|
+
: args[0]
|
|
56
|
+
|
|
57
|
+
const { filePath, level, request, data, store, options } = input
|
|
58
|
+
const config = options.config
|
|
59
|
+
const useTransportsOnly = config?.useTransportsOnly === true
|
|
60
|
+
const disableFileLogging = config?.disableFileLogging === true
|
|
61
|
+
if (useTransportsOnly || disableFileLogging) {
|
|
62
|
+
return
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const message = typeof data.message === 'string' ? data.message : ''
|
|
66
|
+
const durationMs =
|
|
67
|
+
store.beforeTime === BigInt(0)
|
|
68
|
+
? 0
|
|
69
|
+
: Number(process.hrtime.bigint() - store.beforeTime) / 1_000_000
|
|
70
|
+
|
|
71
|
+
const line = `${level} ${durationMs.toFixed(2)}ms ${request.method} ${new URL(request.url).pathname} ${message}\n`
|
|
72
|
+
|
|
73
|
+
await ensureDir(dirname(filePath))
|
|
74
|
+
await appendFile(filePath, line, { encoding: 'utf-8' })
|
|
75
|
+
|
|
76
|
+
const rotation = config?.logRotation
|
|
77
|
+
if (!rotation) {
|
|
78
|
+
return
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const should = await shouldRotate(filePath, rotation)
|
|
82
|
+
if (should) {
|
|
83
|
+
await performRotation(filePath, rotation)
|
|
84
|
+
}
|
|
85
|
+
}
|
package/src/output/fs.ts
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { LogLevel, Options, RequestInfo, StoreData } from '../interfaces'
|
|
2
|
+
|
|
3
|
+
type LogToTransportsInput = {
|
|
4
|
+
level: LogLevel
|
|
5
|
+
request: RequestInfo
|
|
6
|
+
data: Record<string, unknown>
|
|
7
|
+
store: StoreData
|
|
8
|
+
options: Options
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export const logToTransports = (
|
|
12
|
+
...args:
|
|
13
|
+
| [LogToTransportsInput]
|
|
14
|
+
| [LogLevel, RequestInfo, Record<string, unknown>, StoreData, Options]
|
|
15
|
+
): void => {
|
|
16
|
+
const input: LogToTransportsInput =
|
|
17
|
+
typeof args[0] === 'string'
|
|
18
|
+
? {
|
|
19
|
+
level: args[0],
|
|
20
|
+
request: args[1],
|
|
21
|
+
data: args[2],
|
|
22
|
+
store: args[3],
|
|
23
|
+
options: args[4]
|
|
24
|
+
}
|
|
25
|
+
: args[0]
|
|
26
|
+
|
|
27
|
+
const { level, request, data, store, options } = input
|
|
28
|
+
const transports = options.config?.transports ?? []
|
|
29
|
+
if (transports.length === 0) {
|
|
30
|
+
return
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const message = typeof data.message === 'string' ? data.message : ''
|
|
34
|
+
const meta: Record<string, unknown> = {
|
|
35
|
+
request: {
|
|
36
|
+
method: request.method,
|
|
37
|
+
url: request.url
|
|
38
|
+
},
|
|
39
|
+
...data,
|
|
40
|
+
beforeTime: store.beforeTime
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
for (const transport of transports) {
|
|
44
|
+
try {
|
|
45
|
+
const result = transport.log(level, message, meta)
|
|
46
|
+
if (
|
|
47
|
+
result &&
|
|
48
|
+
typeof (result as { catch?: unknown }).catch === 'function'
|
|
49
|
+
) {
|
|
50
|
+
;(result as Promise<void>).catch(() => {
|
|
51
|
+
// Ignore errors
|
|
52
|
+
})
|
|
53
|
+
}
|
|
54
|
+
} catch {
|
|
55
|
+
// Transport failures must never crash application logging.
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { promises as fs } from 'node:fs'
|
|
2
|
+
import { promisify } from 'node:util'
|
|
3
|
+
import { gzip } from 'node:zlib'
|
|
4
|
+
import type { LogRotationConfig } from '../interfaces'
|
|
5
|
+
import {
|
|
6
|
+
getRotatedFiles,
|
|
7
|
+
parseRetention,
|
|
8
|
+
parseSize,
|
|
9
|
+
shouldRotateBySize
|
|
10
|
+
} from '../utils/rotation'
|
|
11
|
+
|
|
12
|
+
const gzipAsync = promisify(gzip)
|
|
13
|
+
|
|
14
|
+
const pad2 = (value: number): string => String(value).padStart(2, '0')
|
|
15
|
+
|
|
16
|
+
export const getRotatedFileName = (filePath: string, date: Date): string => {
|
|
17
|
+
const yyyy = date.getFullYear()
|
|
18
|
+
const mm = pad2(date.getMonth() + 1)
|
|
19
|
+
const dd = pad2(date.getDate())
|
|
20
|
+
const HH = pad2(date.getHours())
|
|
21
|
+
const MM = pad2(date.getMinutes())
|
|
22
|
+
const ss = pad2(date.getSeconds())
|
|
23
|
+
return `${filePath}.${yyyy}-${mm}-${dd}-${HH}-${MM}-${ss}`
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export const rotateFile = async (filePath: string): Promise<string> => {
|
|
27
|
+
try {
|
|
28
|
+
const stat = await fs.stat(filePath)
|
|
29
|
+
if (stat.size === 0) {
|
|
30
|
+
return ''
|
|
31
|
+
}
|
|
32
|
+
} catch {
|
|
33
|
+
return ''
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const rotated = getRotatedFileName(filePath, new Date())
|
|
37
|
+
await fs.rename(filePath, rotated)
|
|
38
|
+
return rotated
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export const compressFile = async (filePath: string): Promise<void> => {
|
|
42
|
+
const content = await fs.readFile(filePath)
|
|
43
|
+
const compressed = await gzipAsync(content)
|
|
44
|
+
await fs.writeFile(`${filePath}.gz`, compressed)
|
|
45
|
+
await fs.rm(filePath, { force: true })
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export const shouldRotate = async (
|
|
49
|
+
filePath: string,
|
|
50
|
+
config: LogRotationConfig
|
|
51
|
+
): Promise<boolean> => {
|
|
52
|
+
if (config.maxSize === undefined) {
|
|
53
|
+
return false
|
|
54
|
+
}
|
|
55
|
+
const maxSize = parseSize(config.maxSize)
|
|
56
|
+
return await shouldRotateBySize(filePath, maxSize)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const cleanupByCount = async (
|
|
60
|
+
filePath: string,
|
|
61
|
+
maxFiles: number
|
|
62
|
+
): Promise<void> => {
|
|
63
|
+
const rotated = await getRotatedFiles(filePath)
|
|
64
|
+
if (rotated.length <= maxFiles) {
|
|
65
|
+
return
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const stats = await Promise.all(
|
|
69
|
+
rotated.map(async p => ({ path: p, stat: await fs.stat(p) }))
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
stats.sort((a, b) => b.stat.mtimeMs - a.stat.mtimeMs)
|
|
73
|
+
const toDelete = stats.slice(maxFiles)
|
|
74
|
+
await Promise.all(toDelete.map(({ path }) => fs.rm(path, { force: true })))
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const cleanupByTime = async (
|
|
78
|
+
filePath: string,
|
|
79
|
+
maxAgeMs: number
|
|
80
|
+
): Promise<void> => {
|
|
81
|
+
const rotated = await getRotatedFiles(filePath)
|
|
82
|
+
if (rotated.length === 0) {
|
|
83
|
+
return
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const now = Date.now()
|
|
87
|
+
const stats = await Promise.all(
|
|
88
|
+
rotated.map(async p => ({ path: p, stat: await fs.stat(p) }))
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
const toDelete = stats.filter(({ stat }) => now - stat.mtimeMs > maxAgeMs)
|
|
92
|
+
await Promise.all(toDelete.map(({ path }) => fs.rm(path, { force: true })))
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export const performRotation = async (
|
|
96
|
+
filePath: string,
|
|
97
|
+
config: LogRotationConfig
|
|
98
|
+
): Promise<void> => {
|
|
99
|
+
const rotated = await rotateFile(filePath)
|
|
100
|
+
if (!rotated) {
|
|
101
|
+
return
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const shouldCompress = config.compress === true
|
|
105
|
+
if (shouldCompress) {
|
|
106
|
+
const algo = config.compression ?? 'gzip'
|
|
107
|
+
if (algo === 'gzip') {
|
|
108
|
+
await compressFile(rotated)
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (config.maxFiles !== undefined) {
|
|
113
|
+
const retention = parseRetention(config.maxFiles)
|
|
114
|
+
if (retention.type === 'count') {
|
|
115
|
+
await cleanupByCount(filePath, retention.value)
|
|
116
|
+
} else {
|
|
117
|
+
await cleanupByTime(filePath, retention.value)
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Optional interval-based rotation cleanup (create interval directories / naming) is not required by tests.
|
|
122
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export const parseError = (error: unknown): string => {
|
|
2
|
+
let message = 'An error occurred'
|
|
3
|
+
|
|
4
|
+
if (error instanceof Error) {
|
|
5
|
+
message = error.message
|
|
6
|
+
} else if (error && typeof error === 'object' && 'message' in error) {
|
|
7
|
+
message = error.message as string
|
|
8
|
+
} else {
|
|
9
|
+
message = String(error)
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
console.error(`Parsing error: ${message}`)
|
|
13
|
+
|
|
14
|
+
return message
|
|
15
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { promises as fs } from 'node:fs'
|
|
2
|
+
import { basename, dirname } from 'node:path'
|
|
3
|
+
|
|
4
|
+
const SIZE_REGEX = /^(\d+(?:\.\d+)?)(k|kb|m|mb|g|gb)$/i
|
|
5
|
+
const INTERVAL_REGEX = /^(\d+)(h|d|w)$/i
|
|
6
|
+
const ROTATED_REGEX = /\.(\d{4}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2})(?:\.gz)?$/
|
|
7
|
+
|
|
8
|
+
export const parseSize = (value: number | string): number => {
|
|
9
|
+
if (typeof value === 'number') {
|
|
10
|
+
return value
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const trimmed = value.trim()
|
|
14
|
+
const asNumber = Number(trimmed)
|
|
15
|
+
if (Number.isFinite(asNumber)) {
|
|
16
|
+
return asNumber
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const match = trimmed.match(SIZE_REGEX)
|
|
20
|
+
if (!match) {
|
|
21
|
+
throw new Error(`Invalid size format: ${value}`)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const amount = Number(match[1])
|
|
25
|
+
const unit = match[2].toLowerCase()
|
|
26
|
+
|
|
27
|
+
let base = 1024
|
|
28
|
+
if (unit.startsWith('m')) {
|
|
29
|
+
base = 1024 * 1024
|
|
30
|
+
} else if (unit.startsWith('g')) {
|
|
31
|
+
base = 1024 * 1024 * 1024
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return Math.floor(amount * base)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export const parseInterval = (value: string): number => {
|
|
38
|
+
const match = value.trim().match(INTERVAL_REGEX)
|
|
39
|
+
if (!match) {
|
|
40
|
+
throw new Error(`Invalid interval format: ${value}`)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const amount = Number(match[1])
|
|
44
|
+
const unit = match[2].toLowerCase()
|
|
45
|
+
|
|
46
|
+
let ms = 60 * 60 * 1000
|
|
47
|
+
if (unit === 'd') {
|
|
48
|
+
ms = 24 * 60 * 60 * 1000
|
|
49
|
+
} else if (unit === 'w') {
|
|
50
|
+
ms = 7 * 24 * 60 * 60 * 1000
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return amount * ms
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export const parseRetention = (
|
|
57
|
+
value: number | string
|
|
58
|
+
): { type: 'count' | 'time'; value: number } => {
|
|
59
|
+
if (typeof value === 'number') {
|
|
60
|
+
return { type: 'count', value }
|
|
61
|
+
}
|
|
62
|
+
return { type: 'time', value: parseInterval(value) }
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export const shouldRotateBySize = async (
|
|
66
|
+
filePath: string,
|
|
67
|
+
maxSizeBytes: number
|
|
68
|
+
): Promise<boolean> => {
|
|
69
|
+
try {
|
|
70
|
+
const stat = await fs.stat(filePath)
|
|
71
|
+
return stat.size > maxSizeBytes
|
|
72
|
+
} catch {
|
|
73
|
+
return false
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export const getRotatedFiles = async (filePath: string): Promise<string[]> => {
|
|
78
|
+
const dir = dirname(filePath)
|
|
79
|
+
const base = basename(filePath)
|
|
80
|
+
|
|
81
|
+
let entries: string[]
|
|
82
|
+
try {
|
|
83
|
+
entries = await fs.readdir(dir)
|
|
84
|
+
} catch {
|
|
85
|
+
return []
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return entries
|
|
89
|
+
.filter(name => name.startsWith(`${base}.`) && ROTATED_REGEX.test(name))
|
|
90
|
+
.map(name => `${dir}/${name}`)
|
|
91
|
+
}
|
package/LICENSE
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2023 PunGrumpy
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
package/README.md
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
<div align="center">
|
|
2
|
-
<h1><code>🦊</code> Logixlysia</h1>
|
|
3
|
-
<strong>Logixlysia is a logging library for ElysiaJS</strong>
|
|
4
|
-
<img src="./website/app/opengraph-image.png" alt="Logixlysia" width="100%" height="auto" />
|
|
5
|
-
</div>
|
|
6
|
-
|
|
7
|
-
## `📩` Installation
|
|
8
|
-
|
|
9
|
-
```bash
|
|
10
|
-
bun add logixlysia
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
## `📝` Usage
|
|
14
|
-
|
|
15
|
-
```ts
|
|
16
|
-
import { Elysia } from 'elysia'
|
|
17
|
-
import logixlysia from 'logixlysia'
|
|
18
|
-
|
|
19
|
-
const app = new Elysia({
|
|
20
|
-
name: 'Logixlysia Example'
|
|
21
|
-
}).use(
|
|
22
|
-
logixlysia({
|
|
23
|
-
config: {
|
|
24
|
-
showStartupMessage: true,
|
|
25
|
-
startupMessageFormat: 'simple',
|
|
26
|
-
timestamp: {
|
|
27
|
-
translateTime: 'yyyy-mm-dd HH:MM:ss'
|
|
28
|
-
},
|
|
29
|
-
ip: true,
|
|
30
|
-
logFilePath: './logs/example.log',
|
|
31
|
-
customLogFormat:
|
|
32
|
-
'🦊 {now} {level} {duration} {method} {pathname} {status} {message} {ip} {epoch}',
|
|
33
|
-
logFilter: {
|
|
34
|
-
level: ['ERROR', 'WARNING'],
|
|
35
|
-
status: [500, 404],
|
|
36
|
-
method: 'GET'
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
})
|
|
40
|
-
)
|
|
41
|
-
|
|
42
|
-
app.listen(3000)
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
## `📚` Documentation
|
|
46
|
-
|
|
47
|
-
Check out the [website](https://logixlysia.vercel.app) for more detailed documentation and examples.
|
|
48
|
-
|
|
49
|
-
## `📄` License
|
|
50
|
-
|
|
51
|
-
Licensed under the [MIT License](LICENSE).
|
package/dist/index.cjs
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
var Z=require("node:module");var J=Object.create;var{getPrototypeOf:j,defineProperty:h,getOwnPropertyNames:q,getOwnPropertyDescriptor:K}=Object,B=Object.prototype.hasOwnProperty;var x=(r,o,t)=>{t=r!=null?J(j(r)):{};let e=o||!r||!r.__esModule?h(t,"default",{value:r,enumerable:!0}):t;for(let n of q(r))if(!B.call(e,n))h(e,n,{get:()=>r[n],enumerable:!0});return e},N=new WeakMap,Q=(r)=>{var o=N.get(r),t;if(o)return o;if(o=h({},"__esModule",{value:!0}),r&&typeof r==="object"||typeof r==="function")q(r).map((e)=>!B.call(o,e)&&h(o,e,{get:()=>r[e],enumerable:!(t=K(r,e))||t.enumerable}));return N.set(r,o),o};var X=(r,o)=>{for(var t in o)h(r,t,{get:o[t],enumerable:!0,configurable:!0,set:(e)=>o[t]=()=>e})};var ar={};X(ar,{logToTransports:()=>p,handleHttpError:()=>d,default:()=>z,createLogger:()=>b});module.exports=Q(ar);var Y=require("elysia");var C=(r,o)=>{let t=Math.max(0,(o-r.length)/2),e=" ".repeat(t);return`${e}${r}${e}`.padEnd(o)};function y(r,o){let t=r?.hostname??"localhost",e=r?.port??3000,n=r?.protocol??"http";if(o?.config?.startupMessageFormat!=="simple"){let i=`\uD83E\uDD8A Elysia is running at ${n}://${t}:${e}`,m=Math.max(22,i.length)+4,T="─".repeat(m),f=C("",m);console.log(`
|
|
2
|
-
┌${T}┐
|
|
3
|
-
│${f}│
|
|
4
|
-
│${C("Elysia with Logixlysia",m)}│
|
|
5
|
-
│${f}│
|
|
6
|
-
│${C(i,m)}│
|
|
7
|
-
│${f}│
|
|
8
|
-
└${T}┘
|
|
9
|
-
`)}else console.log(`\uD83E\uDD8A Elysia is running at ${n}://${t}:${e}`)}var u=x(require("chalk")),G=require("elysia");function F(r){if(typeof r==="number")return r;return G.StatusMap[r]||500}function O(r,o){let t=r.toString();if(!o)return t;if(r>=500)return u.default.red(t);if(r>=400)return u.default.yellow(t);if(r>=300)return u.default.cyan(t);if(r>=200)return u.default.green(t);return u.default.white(t)}var I=x(require("chalk"));var g=x(require("chalk")),M={INFO:g.default.bgGreen.black,WARNING:g.default.bgYellow.black,ERROR:g.default.bgRed.black},P={GET:g.default.green,POST:g.default.yellow,PUT:g.default.blue,PATCH:g.default.magentaBright,DELETE:g.default.red,HEAD:g.default.cyan,OPTIONS:g.default.magenta};var $=x(require("chalk")),V=[{unit:"s",threshold:1e9,decimalPlaces:2},{unit:"ms",threshold:1e6,decimalPlaces:0},{unit:"µs",threshold:1000,decimalPlaces:0},{unit:"ns",threshold:1,decimalPlaces:0}];function E(r,o){let t=Number(process.hrtime.bigint()-r);for(let{unit:e,threshold:n,decimalPlaces:s}of V)if(t>=n){let i=`${(t/n).toFixed(s)}${e}`.padStart(8).padEnd(16);return o?$.default.gray(i):i}return o?$.default.gray("0ns".padStart(8).padEnd(16)):"0ns".padStart(8).padEnd(16)}function R(r,o){let t=r.toUpperCase();return o?M[t]?.(t.padEnd(7))||t:t.padEnd(7)}function v(r,o){let t=P[r];return o&&t?t(r.padEnd(7)):r.padEnd(7)}function w(r){try{return new URL(r.url).pathname}catch{return}}var l=(r)=>r.toString().padStart(2,"0");function rr(r){let o=r.getFullYear(),t=l(r.getMonth()+1),e=l(r.getDate()),n=l(r.getHours()),s=l(r.getMinutes()),a=l(r.getSeconds()),i=r.getMilliseconds().toString().padStart(3,"0");return`${o}-${t}-${e} ${n}:${s}:${a}.${i}`}function tr(r,o){let t={yyyy:r.getFullYear(),yy:r.getFullYear().toString().slice(-2),mm:l(r.getMonth()+1),dd:l(r.getDate()),HH:l(r.getHours()),MM:l(r.getMinutes()),ss:l(r.getSeconds()),SSS:l(r.getMilliseconds()),Z:-r.getTimezoneOffset()/60};return o.replace(/yyyy|yy|mm|dd|HH|MM|ss|SSS|Z/g,(e)=>(t[e]??"").toString())}function D(r,o){if(!o?.translateTime)return r.toISOString();if(o.translateTime===!0||o.translateTime==="SYS:STANDARD")return rr(r);return tr(r,o.translateTime)}var or="\uD83E\uDD8A {now} {level} {duration} {method} {pathname} {status} {message} {context} {ip}";function er(r,o){if(o?.config?.useColors!==void 0)return o.config.useColors&&process.env.NO_COLOR===void 0;return r&&process.env.NO_COLOR===void 0}function c(r,o,t,e,n,s=!0){let a=er(s,n),i=new Date,m={now:a?I.default.bgYellow(I.default.black(D(i,n?.config?.timestamp))):D(i,n?.config?.timestamp),epoch:Math.floor(i.getTime()/1000).toString(),level:R(r,s),duration:E(e.beforeTime,s),method:v(o.method,s),pathname:w(o),status:O(t.status||200,s),message:t.message||"",context:t.context?(()=>{try{return JSON.stringify(t.context)}catch(f){return`[Error serializing context: ${f instanceof Error?f.message:"Unknown error"}]`}})():"",ip:n?.config?.ip&&o.headers.get("x-forwarded-for")?`IP: ${o.headers.get("x-forwarded-for")}`:""};return(n?.config?.customLogFormat||or).replace(/{(\w+)}/g,(f,U)=>{if(U in m)return m[U]||"";return""})}async function p(r,o,t,e,n){if(!n?.config?.transports||n.config.transports.length===0)return;let s=c(r,o,t,e,n,!1),a=n.config.transports.map((i)=>i.log(r,s,{request:o,data:t,store:e}));await Promise.all(a)}var k=require("node:fs"),W=require("node:path");var A=new Set;async function nr(r){let o=W.dirname(r);if(!A.has(o))await k.promises.mkdir(o,{recursive:!0}),A.add(o)}async function L(r,o,t,e,n,s){await nr(r);let a=`${c(o,t,e,n,s,!1)}
|
|
10
|
-
`;await k.promises.appendFile(r,a,{flag:"a"})}var H=(r,o)=>Array.isArray(r)?r.includes(o):r===o;function _(r,o,t,e){let n=e?.config?.logFilter;if(!n)return!0;return(!n.level||H(n.level,r))&&(!n.status||H(n.status,o))&&(!n.method||H(n.method,t))}async function d(r,o,t,e){let s={status:o.status||500,message:o.message,stack:o.stack},a=[];if(!(e?.config?.useTransportsOnly||e?.config?.disableInternalLogger))console.error(c("ERROR",r,s,t,e));if(!e?.config?.useTransportsOnly&&e?.config?.logFilePath&&!e?.config?.disableFileLogging)a.push(L(e.config.logFilePath,"ERROR",r,s,t,e));if(e?.config?.transports?.length)a.push(p("ERROR",r,s,t,e));await Promise.all(a)}function sr(){let r=process.memoryUsage().heapUsed/1024/1024,o=process.cpuUsage();return{memoryUsage:r,cpuUsage:o.user/1e6}}async function S(r,o,t,e,n){if(!_(r,t.status||200,o.method,n))return;if(!t.metrics)t.metrics=sr();if(r==="ERROR"&&!t.stack)t.stack=Error(`Error: ${t.message||"Unknown error"}`).stack;let s=c(r,o,t,e,n,!0),a=[];if(!(n?.config?.useTransportsOnly||n?.config?.disableInternalLogger))console.log(s);if(!n?.config?.useTransportsOnly&&n?.config?.logFilePath&&!n?.config?.disableFileLogging)a.push(L(n.config.logFilePath,r,o,t,e,n));if(n?.config?.transports?.length)a.push(p(r,o,t,e,n));await Promise.all(a)}function b(r){let o={store:void 0,log:(t,e,n,s)=>S(t,e,n,s,r),handleHttpError:async(t,e,n)=>await d(t,e,n,r),customLogFormat:r?.config?.customLogFormat,info:(t,e,n,s)=>{let a=s||o.store||{beforeTime:process.hrtime.bigint()};return a.hasCustomLog=!0,S("INFO",t,{message:e,context:n,status:200},a,r)},error:(t,e,n,s)=>{let a=s||o.store||{beforeTime:process.hrtime.bigint()};return a.hasCustomLog=!0,S("ERROR",t,{message:e,context:n,status:500},a,r)},warn:(t,e,n,s)=>{let a=s||o.store||{beforeTime:process.hrtime.bigint()};return a.hasCustomLog=!0,S("WARNING",t,{message:e,context:n,status:200},a,r)},debug:(t,e,n,s)=>{let a=s||o.store||{beforeTime:process.hrtime.bigint()};return a.hasCustomLog=!0,S("DEBUG",t,{message:e,context:n,status:200},a,r)}};return o}function z(r){let o=b(r);return new Y.Elysia({name:"Logixlysia"}).onStart((t)=>{if(r?.config?.showStartupMessage??!0)y(t.server,r)}).onRequest((t)=>{let e={...t.store,beforeTime:process.hrtime.bigint(),logger:o,hasCustomLog:!1};t.store=e,o.store=e}).onAfterHandle({as:"global"},({request:t,set:e,store:n})=>{let s=n;if(!s.hasCustomLog){let a=F(e.status||200);o.log("INFO",t,{status:a,message:String(e.headers?.["x-message"]||"")},s)}}).onError({as:"global"},async({request:t,error:e,set:n,store:s})=>{let a=F(n.status||500);await o.handleHttpError(t,{...e,status:a},s)})}
|
|
11
|
-
|
|
12
|
-
//# debugId=31613BB08018F53664756E2164756E21
|
|
13
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9leHRlbnNpb25zL3N0YXJ0LXNlcnZlci50cyIsICIuLi9zcmMvaGVscGVycy9zdGF0dXMudHMiLCAiLi4vc3JjL2xvZ2dlci9idWlsZC1sb2ctbWVzc2FnZS50cyIsICIuLi9zcmMvaGVscGVycy9jb2xvci1tYXBwaW5nLnRzIiwgIi4uL3NyYy9oZWxwZXJzL2R1cmF0aW9uLnRzIiwgIi4uL3NyYy9oZWxwZXJzL2xvZy50cyIsICIuLi9zcmMvaGVscGVycy9tZXRob2QudHMiLCAiLi4vc3JjL2hlbHBlcnMvcGF0aC50cyIsICIuLi9zcmMvaGVscGVycy90aW1lc3RhbXAudHMiLCAiLi4vc3JjL291dHB1dC9jb25zb2xlLnRzIiwgIi4uL3NyYy9vdXRwdXQvZmlsZS50cyIsICIuLi9zcmMvbG9nZ2VyL2ZpbHRlci50cyIsICIuLi9zcmMvbG9nZ2VyL2hhbmRsZS1odHRwLWVycm9yLnRzIiwgIi4uL3NyYy9sb2dnZXIvY3JlYXRlLWxvZ2dlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJpbXBvcnQgeyBFbHlzaWEgfSBmcm9tICdlbHlzaWEnXG5cbmltcG9ydCB7IHN0YXJ0U2VydmVyIH0gZnJvbSAnLi9leHRlbnNpb25zJ1xuaW1wb3J0IHsgZ2V0U3RhdHVzQ29kZSB9IGZyb20gJy4vaGVscGVycy9zdGF0dXMnXG5pbXBvcnQgdHlwZSB7IEh0dHBFcnJvciwgT3B0aW9ucywgU2VydmVyLCBTdG9yZURhdGEgfSBmcm9tICcuL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuL2xvZ2dlcidcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbG9naXhseXNpYShvcHRpb25zPzogT3B0aW9ucyk6IEVseXNpYSB7XG4gIGNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcihvcHRpb25zKVxuXG4gIHJldHVybiBuZXcgRWx5c2lhKHtcbiAgICBuYW1lOiAnTG9naXhseXNpYSdcbiAgfSlcbiAgICAub25TdGFydChjdHggPT4ge1xuICAgICAgY29uc3Qgc2hvd1N0YXJ0dXBNZXNzYWdlID0gb3B0aW9ucz8uY29uZmlnPy5zaG93U3RhcnR1cE1lc3NhZ2UgPz8gdHJ1ZVxuICAgICAgaWYgKHNob3dTdGFydHVwTWVzc2FnZSkge1xuICAgICAgICBzdGFydFNlcnZlcihjdHguc2VydmVyIGFzIFNlcnZlciwgb3B0aW9ucylcbiAgICAgIH1cbiAgICB9KVxuICAgIC5vblJlcXVlc3QoY3R4ID0+IHtcbiAgICAgIGNvbnN0IHN0b3JlID0ge1xuICAgICAgICAuLi5jdHguc3RvcmUsXG4gICAgICAgIGJlZm9yZVRpbWU6IHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpLFxuICAgICAgICBsb2dnZXI6IGxvZyxcbiAgICAgICAgaGFzQ3VzdG9tTG9nOiBmYWxzZVxuICAgICAgfVxuICAgICAgY3R4LnN0b3JlID0gc3RvcmVcbiAgICAgIGxvZy5zdG9yZSA9IHN0b3JlXG4gICAgfSlcbiAgICAub25BZnRlckhhbmRsZSh7IGFzOiAnZ2xvYmFsJyB9LCAoeyByZXF1ZXN0LCBzZXQsIHN0b3JlIH0pID0+IHtcbiAgICAgIGNvbnN0IHN0b3JlRGF0YSA9IHN0b3JlIGFzIFN0b3JlRGF0YVxuXG4gICAgICBpZiAoIXN0b3JlRGF0YS5oYXNDdXN0b21Mb2cpIHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gZ2V0U3RhdHVzQ29kZShzZXQuc3RhdHVzIHx8IDIwMClcbiAgICAgICAgbG9nLmxvZyhcbiAgICAgICAgICAnSU5GTycsXG4gICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICBtZXNzYWdlOiBTdHJpbmcoc2V0LmhlYWRlcnM/LlsneC1tZXNzYWdlJ10gfHwgJycpXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdG9yZURhdGFcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0pXG4gICAgLm9uRXJyb3IoeyBhczogJ2dsb2JhbCcgfSwgYXN5bmMgKHsgcmVxdWVzdCwgZXJyb3IsIHNldCwgc3RvcmUgfSkgPT4ge1xuICAgICAgY29uc3Qgc3RhdHVzID0gZ2V0U3RhdHVzQ29kZShzZXQuc3RhdHVzIHx8IDUwMClcbiAgICAgIGF3YWl0IGxvZy5oYW5kbGVIdHRwRXJyb3IoXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIHsgLi4uZXJyb3IsIHN0YXR1cyB9IGFzIEh0dHBFcnJvcixcbiAgICAgICAgc3RvcmUgYXMgU3RvcmVEYXRhXG4gICAgICApXG4gICAgfSlcbn1cblxuZXhwb3J0IHR5cGUge1xuICBIdHRwRXJyb3IsXG4gIExvZ0RhdGEsXG4gIExvZ2dlcixcbiAgTG9naXhseXNpYUNvbnRleHQsXG4gIExvZ0xldmVsLFxuICBPcHRpb25zLFxuICBSZXF1ZXN0SW5mbyxcbiAgU3RvcmVEYXRhLFxuICBUcmFuc3BvcnRcbn0gZnJvbSAnLi9pbnRlcmZhY2VzJ1xuZXhwb3J0IHsgY3JlYXRlTG9nZ2VyLCBoYW5kbGVIdHRwRXJyb3IgfSBmcm9tICcuL2xvZ2dlcidcbmV4cG9ydCB7IGxvZ1RvVHJhbnNwb3J0cyB9IGZyb20gJy4vb3V0cHV0J1xuIiwKICAgICJpbXBvcnQgdHlwZSB7IE9wdGlvbnMsIFNlcnZlciB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5cbmNvbnN0IGNyZWF0ZUJveFRleHQgPSAodGV4dDogc3RyaW5nLCB3aWR0aDogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgY29uc3QgcGFkZGluZ0xlbmd0aCA9IE1hdGgubWF4KDAsICh3aWR0aCAtIHRleHQubGVuZ3RoKSAvIDIpXG4gIGNvbnN0IHBhZGRpbmcgPSAnICcucmVwZWF0KHBhZGRpbmdMZW5ndGgpXG4gIHJldHVybiBgJHtwYWRkaW5nfSR7dGV4dH0ke3BhZGRpbmd9YC5wYWRFbmQod2lkdGgpXG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHN0YXJ0U2VydmVyKGNvbmZpZzogU2VydmVyLCBvcHRpb25zPzogT3B0aW9ucyk6IHZvaWQge1xuICBjb25zdCBob3N0bmFtZSA9IGNvbmZpZz8uaG9zdG5hbWUgPz8gJ2xvY2FsaG9zdCdcbiAgY29uc3QgcG9ydCA9IGNvbmZpZz8ucG9ydCA/PyAzMDAwXG4gIGNvbnN0IHByb3RvY29sID0gY29uZmlnPy5wcm90b2NvbCA/PyAnaHR0cCdcbiAgY29uc3Qgc2hvd0Jhbm5lciA9IG9wdGlvbnM/LmNvbmZpZz8uc3RhcnR1cE1lc3NhZ2VGb3JtYXQgIT09ICdzaW1wbGUnXG5cbiAgaWYgKHNob3dCYW5uZXIpIHtcbiAgICBjb25zdCB0aXRsZSA9ICdFbHlzaWEgd2l0aCBMb2dpeGx5c2lhJ1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBg8J+miiBFbHlzaWEgaXMgcnVubmluZyBhdCAke3Byb3RvY29sfTovLyR7aG9zdG5hbWV9OiR7cG9ydH1gXG4gICAgY29uc3QgYm94V2lkdGggPSBNYXRoLm1heCh0aXRsZS5sZW5ndGgsIG1lc3NhZ2UubGVuZ3RoKSArIDRcbiAgICBjb25zdCBib3JkZXIgPSAn4pSAJy5yZXBlYXQoYm94V2lkdGgpXG4gICAgY29uc3QgZW1wdHlMaW5lID0gY3JlYXRlQm94VGV4dCgnJywgYm94V2lkdGgpXG5cbiAgICBjb25zb2xlLmxvZyhgXG4gICAgICDilIwke2JvcmRlcn3ilJBcbiAgICAgIOKUgiR7ZW1wdHlMaW5lfeKUglxuICAgICAg4pSCJHtjcmVhdGVCb3hUZXh0KHRpdGxlLCBib3hXaWR0aCl94pSCXG4gICAgICDilIIke2VtcHR5TGluZX3ilIJcbiAgICAgIOKUgiR7Y3JlYXRlQm94VGV4dChtZXNzYWdlLCBib3hXaWR0aCl94pSCXG4gICAgICDilIIke2VtcHR5TGluZX3ilIJcbiAgICAgIOKUlCR7Ym9yZGVyfeKUmFxuICAgIGApXG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5sb2coYPCfpoogRWx5c2lhIGlzIHJ1bm5pbmcgYXQgJHtwcm90b2NvbH06Ly8ke2hvc3RuYW1lfToke3BvcnR9YClcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnXG5pbXBvcnQgeyBTdGF0dXNNYXAgfSBmcm9tICdlbHlzaWEnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdGF0dXNDb2RlKHN0YXR1czogc3RyaW5nIHwgbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKHR5cGVvZiBzdGF0dXMgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHN0YXR1c1xuICB9XG4gIHJldHVybiAoU3RhdHVzTWFwIGFzIFJlY29yZDxzdHJpbmcsIG51bWJlcj4pW3N0YXR1c10gfHwgNTAwXG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHN0YXR1c1N0cmluZyhcbiAgc3RhdHVzOiBudW1iZXIsXG4gIHVzZUNvbG9yczogYm9vbGVhblxuKTogc3RyaW5nIHtcbiAgY29uc3Qgc3RhdHVzU3RyID0gc3RhdHVzLnRvU3RyaW5nKClcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gc3RhdHVzU3RyXG4gIH1cblxuICBpZiAoc3RhdHVzID49IDUwMCkge1xuICAgIHJldHVybiBjaGFsay5yZWQoc3RhdHVzU3RyKVxuICB9XG4gIGlmIChzdGF0dXMgPj0gNDAwKSB7XG4gICAgcmV0dXJuIGNoYWxrLnllbGxvdyhzdGF0dXNTdHIpXG4gIH1cbiAgaWYgKHN0YXR1cyA+PSAzMDApIHtcbiAgICByZXR1cm4gY2hhbGsuY3lhbihzdGF0dXNTdHIpXG4gIH1cbiAgaWYgKHN0YXR1cyA+PSAyMDApIHtcbiAgICByZXR1cm4gY2hhbGsuZ3JlZW4oc3RhdHVzU3RyKVxuICB9XG4gIHJldHVybiBjaGFsay53aGl0ZShzdGF0dXNTdHIpXG59XG4iLAogICAgImltcG9ydCBjaGFsayBmcm9tICdjaGFsaydcblxuaW1wb3J0IHtcbiAgZHVyYXRpb25TdHJpbmcsXG4gIGZvcm1hdFRpbWVzdGFtcCxcbiAgbG9nU3RyaW5nLFxuICBtZXRob2RTdHJpbmcsXG4gIHBhdGhTdHJpbmcsXG4gIHN0YXR1c1N0cmluZ1xufSBmcm9tICcuLi9oZWxwZXJzJ1xuaW1wb3J0IHR5cGUge1xuICBMb2dDb21wb25lbnRzLFxuICBMb2dEYXRhLFxuICBMb2dMZXZlbCxcbiAgT3B0aW9ucyxcbiAgUmVxdWVzdEluZm8sXG4gIFN0b3JlRGF0YVxufSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG5jb25zdCBkZWZhdWx0TG9nRm9ybWF0ID1cbiAgJ/Cfpooge25vd30ge2xldmVsfSB7ZHVyYXRpb259IHttZXRob2R9IHtwYXRobmFtZX0ge3N0YXR1c30ge21lc3NhZ2V9IHtjb250ZXh0fSB7aXB9J1xuXG5mdW5jdGlvbiBzaG91bGRVc2VDb2xvcnModXNlQ29sb3JzOiBib29sZWFuLCBvcHRpb25zPzogT3B0aW9ucyk6IGJvb2xlYW4ge1xuICBpZiAob3B0aW9ucz8uY29uZmlnPy51c2VDb2xvcnMgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBvcHRpb25zLmNvbmZpZy51c2VDb2xvcnMgJiYgcHJvY2Vzcy5lbnYuTk9fQ09MT1IgPT09IHVuZGVmaW5lZFxuICB9XG4gIHJldHVybiB1c2VDb2xvcnMgJiYgcHJvY2Vzcy5lbnYuTk9fQ09MT1IgPT09IHVuZGVmaW5lZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRMb2dNZXNzYWdlKFxuICBsZXZlbDogTG9nTGV2ZWwsXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICBkYXRhOiBMb2dEYXRhLFxuICBzdG9yZTogU3RvcmVEYXRhLFxuICBvcHRpb25zPzogT3B0aW9ucyxcbiAgdXNlQ29sb3JzID0gdHJ1ZVxuKTogc3RyaW5nIHtcbiAgY29uc3QgYWN0dWFsbHlVc2VDb2xvcnMgPSBzaG91bGRVc2VDb2xvcnModXNlQ29sb3JzLCBvcHRpb25zKVxuICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpXG4gIGNvbnN0IGNvbXBvbmVudHM6IExvZ0NvbXBvbmVudHMgPSB7XG4gICAgbm93OiBhY3R1YWxseVVzZUNvbG9yc1xuICAgICAgPyBjaGFsay5iZ1llbGxvdyhcbiAgICAgICAgICBjaGFsay5ibGFjayhmb3JtYXRUaW1lc3RhbXAobm93LCBvcHRpb25zPy5jb25maWc/LnRpbWVzdGFtcCkpXG4gICAgICAgIClcbiAgICAgIDogZm9ybWF0VGltZXN0YW1wKG5vdywgb3B0aW9ucz8uY29uZmlnPy50aW1lc3RhbXApLFxuICAgIGVwb2NoOiBNYXRoLmZsb29yKG5vdy5nZXRUaW1lKCkgLyAxMDAwKS50b1N0cmluZygpLFxuICAgIGxldmVsOiBsb2dTdHJpbmcobGV2ZWwsIHVzZUNvbG9ycyksXG4gICAgZHVyYXRpb246IGR1cmF0aW9uU3RyaW5nKHN0b3JlLmJlZm9yZVRpbWUsIHVzZUNvbG9ycyksXG4gICAgbWV0aG9kOiBtZXRob2RTdHJpbmcocmVxdWVzdC5tZXRob2QsIHVzZUNvbG9ycyksXG4gICAgcGF0aG5hbWU6IHBhdGhTdHJpbmcocmVxdWVzdCksXG4gICAgc3RhdHVzOiBzdGF0dXNTdHJpbmcoZGF0YS5zdGF0dXMgfHwgMjAwLCB1c2VDb2xvcnMpLFxuICAgIG1lc3NhZ2U6IGRhdGEubWVzc2FnZSB8fCAnJyxcbiAgICBjb250ZXh0OiBkYXRhLmNvbnRleHRcbiAgICAgID8gKCgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEuY29udGV4dClcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGBbRXJyb3Igc2VyaWFsaXppbmcgY29udGV4dDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31dYFxuICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuICAgICAgOiAnJyxcbiAgICBpcDpcbiAgICAgIG9wdGlvbnM/LmNvbmZpZz8uaXAgJiYgcmVxdWVzdC5oZWFkZXJzLmdldCgneC1mb3J3YXJkZWQtZm9yJylcbiAgICAgICAgPyBgSVA6ICR7cmVxdWVzdC5oZWFkZXJzLmdldCgneC1mb3J3YXJkZWQtZm9yJyl9YFxuICAgICAgICA6ICcnXG4gIH1cblxuICBjb25zdCBsb2dGb3JtYXQgPSBvcHRpb25zPy5jb25maWc/LmN1c3RvbUxvZ0Zvcm1hdCB8fCBkZWZhdWx0TG9nRm9ybWF0XG5cbiAgcmV0dXJuIGxvZ0Zvcm1hdC5yZXBsYWNlKC97KFxcdyspfS9nLCAoXywga2V5OiBzdHJpbmcpID0+IHtcbiAgICBpZiAoa2V5IGluIGNvbXBvbmVudHMpIHtcbiAgICAgIHJldHVybiBjb21wb25lbnRzW2tleSBhcyBrZXlvZiBMb2dDb21wb25lbnRzXSB8fCAnJ1xuICAgIH1cbiAgICByZXR1cm4gJydcbiAgfSlcbn1cbiIsCiAgICAiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJ1xuXG5pbXBvcnQgdHlwZSB7IENvbG9yTWFwIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcblxuZXhwb3J0IGNvbnN0IExvZ0xldmVsQ29sb3JNYXA6IENvbG9yTWFwID0ge1xuICBJTkZPOiBjaGFsay5iZ0dyZWVuLmJsYWNrLFxuICBXQVJOSU5HOiBjaGFsay5iZ1llbGxvdy5ibGFjayxcbiAgRVJST1I6IGNoYWxrLmJnUmVkLmJsYWNrXG59XG5cbmV4cG9ydCBjb25zdCBIdHRwTWV0aG9kQ29sb3JNYXA6IENvbG9yTWFwID0ge1xuICBHRVQ6IGNoYWxrLmdyZWVuLFxuICBQT1NUOiBjaGFsay55ZWxsb3csXG4gIFBVVDogY2hhbGsuYmx1ZSxcbiAgUEFUQ0g6IGNoYWxrLm1hZ2VudGFCcmlnaHQsXG4gIERFTEVURTogY2hhbGsucmVkLFxuICBIRUFEOiBjaGFsay5jeWFuLFxuICBPUFRJT05TOiBjaGFsay5tYWdlbnRhXG59XG4iLAogICAgImltcG9ydCBjaGFsayBmcm9tICdjaGFsaydcblxuY29uc3QgdGltZVVuaXRzID0gW1xuICB7IHVuaXQ6ICdzJywgdGhyZXNob2xkOiAxZTksIGRlY2ltYWxQbGFjZXM6IDIgfSxcbiAgeyB1bml0OiAnbXMnLCB0aHJlc2hvbGQ6IDFlNiwgZGVjaW1hbFBsYWNlczogMCB9LFxuICB7IHVuaXQ6ICfCtXMnLCB0aHJlc2hvbGQ6IDFlMywgZGVjaW1hbFBsYWNlczogMCB9LFxuICB7IHVuaXQ6ICducycsIHRocmVzaG9sZDogMSwgZGVjaW1hbFBsYWNlczogMCB9XG5dXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGR1cmF0aW9uU3RyaW5nKFxuICBiZWZvcmVUaW1lOiBiaWdpbnQsXG4gIHVzZUNvbG9yczogYm9vbGVhblxuKTogc3RyaW5nIHtcbiAgY29uc3QgbmFub3NlY29uZHMgPSBOdW1iZXIocHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkgLSBiZWZvcmVUaW1lKVxuXG4gIGZvciAoY29uc3QgeyB1bml0LCB0aHJlc2hvbGQsIGRlY2ltYWxQbGFjZXMgfSBvZiB0aW1lVW5pdHMpIHtcbiAgICBpZiAobmFub3NlY29uZHMgPj0gdGhyZXNob2xkKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IChuYW5vc2Vjb25kcyAvIHRocmVzaG9sZCkudG9GaXhlZChkZWNpbWFsUGxhY2VzKVxuICAgICAgY29uc3QgdGltZVN0ciA9IGAke3ZhbHVlfSR7dW5pdH1gLnBhZFN0YXJ0KDgpLnBhZEVuZCgxNilcbiAgICAgIHJldHVybiB1c2VDb2xvcnMgPyBjaGFsay5ncmF5KHRpbWVTdHIpIDogdGltZVN0clxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1c2VDb2xvcnNcbiAgICA/IGNoYWxrLmdyYXkoJzBucycucGFkU3RhcnQoOCkucGFkRW5kKDE2KSlcbiAgICA6ICcwbnMnLnBhZFN0YXJ0KDgpLnBhZEVuZCgxNilcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBMb2dMZXZlbCB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBMb2dMZXZlbENvbG9yTWFwIH0gZnJvbSAnLi9jb2xvci1tYXBwaW5nJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsb2dTdHJpbmcobGV2ZWw6IExvZ0xldmVsLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBsZXZlbFN0ciA9IGxldmVsLnRvVXBwZXJDYXNlKClcbiAgcmV0dXJuIHVzZUNvbG9yc1xuICAgID8gTG9nTGV2ZWxDb2xvck1hcFtsZXZlbFN0cl0/LihsZXZlbFN0ci5wYWRFbmQoNykpIHx8IGxldmVsU3RyXG4gICAgOiBsZXZlbFN0ci5wYWRFbmQoNylcbn1cbiIsCiAgICAiaW1wb3J0IHsgSHR0cE1ldGhvZENvbG9yTWFwIH0gZnJvbSAnLi9jb2xvci1tYXBwaW5nJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtZXRob2RTdHJpbmcoXG4gIG1ldGhvZDogc3RyaW5nLFxuICB1c2VDb2xvcnM6IGJvb2xlYW5cbik6IHN0cmluZyB7XG4gIGNvbnN0IGNvbG9yRnVuY3Rpb24gPSBIdHRwTWV0aG9kQ29sb3JNYXBbbWV0aG9kXVxuICByZXR1cm4gdXNlQ29sb3JzICYmIGNvbG9yRnVuY3Rpb25cbiAgICA/IGNvbG9yRnVuY3Rpb24obWV0aG9kLnBhZEVuZCg3KSlcbiAgICA6IG1ldGhvZC5wYWRFbmQoNylcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBSZXF1ZXN0SW5mbyB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHBhdGhTdHJpbmcoXG4gIHJlcXVlc3RJbmZvOiBSZXF1ZXN0SW5mb1xuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IFVSTChyZXF1ZXN0SW5mby51cmwpLnBhdGhuYW1lXG4gIH0gY2F0Y2gge1xuICAgIHJldHVyblxuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgVGltZXN0YW1wQ29uZmlnIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcblxuLy8gY29uc3QgREVGQVVMVF9USU1FU1RBTVBfRk9STUFUID0gJ3l5eXktbW0tZGQgSEg6TU06c3MnXG5jb25zdCBTWVNfVElNRSA9ICdTWVM6U1RBTkRBUkQnXG5cbmNvbnN0IHBhZCA9IChuOiBudW1iZXIpOiBzdHJpbmcgPT4gbi50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJylcblxuZnVuY3Rpb24gZm9ybWF0U3lzdGVtVGltZShkYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKVxuICBjb25zdCBtb250aCA9IHBhZChkYXRlLmdldE1vbnRoKCkgKyAxKVxuICBjb25zdCBkYXkgPSBwYWQoZGF0ZS5nZXREYXRlKCkpXG4gIGNvbnN0IGhvdXJzID0gcGFkKGRhdGUuZ2V0SG91cnMoKSlcbiAgY29uc3QgbWludXRlcyA9IHBhZChkYXRlLmdldE1pbnV0ZXMoKSlcbiAgY29uc3Qgc2Vjb25kcyA9IHBhZChkYXRlLmdldFNlY29uZHMoKSlcbiAgY29uc3QgbXMgPSBkYXRlLmdldE1pbGxpc2Vjb25kcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMywgJzAnKVxuXG4gIHJldHVybiBgJHt5ZWFyfS0ke21vbnRofS0ke2RheX0gJHtob3Vyc306JHttaW51dGVzfToke3NlY29uZHN9LiR7bXN9YFxufVxuXG5mdW5jdGlvbiBmb3JtYXRDdXN0b21UaW1lKGRhdGU6IERhdGUsIGZvcm1hdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdG9rZW5zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB9ID0ge1xuICAgIHl5eXk6IGRhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICB5eTogZGF0ZS5nZXRGdWxsWWVhcigpLnRvU3RyaW5nKCkuc2xpY2UoLTIpLFxuICAgIG1tOiBwYWQoZGF0ZS5nZXRNb250aCgpICsgMSksXG4gICAgZGQ6IHBhZChkYXRlLmdldERhdGUoKSksXG4gICAgSEg6IHBhZChkYXRlLmdldEhvdXJzKCkpLFxuICAgIE1NOiBwYWQoZGF0ZS5nZXRNaW51dGVzKCkpLFxuICAgIHNzOiBwYWQoZGF0ZS5nZXRTZWNvbmRzKCkpLFxuICAgIFNTUzogcGFkKGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkpLFxuICAgIFo6IC1kYXRlLmdldFRpbWV6b25lT2Zmc2V0KCkgLyA2MFxuICB9XG5cbiAgcmV0dXJuIGZvcm1hdC5yZXBsYWNlKC95eXl5fHl5fG1tfGRkfEhIfE1NfHNzfFNTU3xaL2csIG1hdGNoID0+XG4gICAgKHRva2Vuc1ttYXRjaF0gPz8gJycpLnRvU3RyaW5nKClcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0VGltZXN0YW1wKGRhdGU6IERhdGUsIGNvbmZpZz86IFRpbWVzdGFtcENvbmZpZyk6IHN0cmluZyB7XG4gIGlmICghY29uZmlnPy50cmFuc2xhdGVUaW1lKSB7XG4gICAgcmV0dXJuIGRhdGUudG9JU09TdHJpbmcoKVxuICB9XG5cbiAgaWYgKGNvbmZpZy50cmFuc2xhdGVUaW1lID09PSB0cnVlIHx8IGNvbmZpZy50cmFuc2xhdGVUaW1lID09PSBTWVNfVElNRSkge1xuICAgIHJldHVybiBmb3JtYXRTeXN0ZW1UaW1lKGRhdGUpXG4gIH1cblxuICByZXR1cm4gZm9ybWF0Q3VzdG9tVGltZShkYXRlLCBjb25maWcudHJhbnNsYXRlVGltZSlcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUge1xuICBMb2dEYXRhLFxuICBMb2dMZXZlbCxcbiAgT3B0aW9ucyxcbiAgUmVxdWVzdEluZm8sXG4gIFN0b3JlRGF0YVxufSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgYnVpbGRMb2dNZXNzYWdlIH0gZnJvbSAnLi4vbG9nZ2VyL2J1aWxkLWxvZy1tZXNzYWdlJ1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9nVG9UcmFuc3BvcnRzKFxuICBsZXZlbDogTG9nTGV2ZWwsXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICBkYXRhOiBMb2dEYXRhLFxuICBzdG9yZTogU3RvcmVEYXRhLFxuICBvcHRpb25zPzogT3B0aW9uc1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghb3B0aW9ucz8uY29uZmlnPy50cmFuc3BvcnRzIHx8IG9wdGlvbnMuY29uZmlnLnRyYW5zcG9ydHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBtZXNzYWdlID0gYnVpbGRMb2dNZXNzYWdlKGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSwgb3B0aW9ucywgZmFsc2UpXG5cbiAgY29uc3QgcHJvbWlzZXMgPSBvcHRpb25zLmNvbmZpZy50cmFuc3BvcnRzLm1hcCh0cmFuc3BvcnQgPT5cbiAgICB0cmFuc3BvcnQubG9nKGxldmVsLCBtZXNzYWdlLCB7IHJlcXVlc3QsIGRhdGEsIHN0b3JlIH0pXG4gIClcblxuICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcylcbn1cbiIsCiAgICAiaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gJ25vZGU6cGF0aCdcblxuaW1wb3J0IHR5cGUge1xuICBMb2dEYXRhLFxuICBMb2dMZXZlbCxcbiAgT3B0aW9ucyxcbiAgUmVxdWVzdEluZm8sXG4gIFN0b3JlRGF0YVxufSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgYnVpbGRMb2dNZXNzYWdlIH0gZnJvbSAnLi4vbG9nZ2VyL2J1aWxkLWxvZy1tZXNzYWdlJ1xuXG5jb25zdCBkaXJDYWNoZSA9IG5ldyBTZXQ8c3RyaW5nPigpXG5cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZURpcmVjdG9yeUV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRpciA9IGRpcm5hbWUoZmlsZVBhdGgpXG4gIGlmICghZGlyQ2FjaGUuaGFzKGRpcikpIHtcbiAgICBhd2FpdCBmcy5ta2RpcihkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgZGlyQ2FjaGUuYWRkKGRpcilcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9nVG9GaWxlKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBsZXZlbDogTG9nTGV2ZWwsXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICBkYXRhOiBMb2dEYXRhLFxuICBzdG9yZTogU3RvcmVEYXRhLFxuICBvcHRpb25zPzogT3B0aW9uc1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGVuc3VyZURpcmVjdG9yeUV4aXN0cyhmaWxlUGF0aClcbiAgY29uc3QgbG9nTWVzc2FnZSA9IGAke2J1aWxkTG9nTWVzc2FnZShsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMsIGZhbHNlKX1cXG5gXG4gIGF3YWl0IGZzLmFwcGVuZEZpbGUoZmlsZVBhdGgsIGxvZ01lc3NhZ2UsIHsgZmxhZzogJ2EnIH0pXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgTG9nTGV2ZWwsIE9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG5jb25zdCBjaGVja0ZpbHRlciA9IChmaWx0ZXJWYWx1ZTogdW5rbm93biwgdmFsdWU6IHVua25vd24pID0+XG4gIEFycmF5LmlzQXJyYXkoZmlsdGVyVmFsdWUpXG4gICAgPyBmaWx0ZXJWYWx1ZS5pbmNsdWRlcyh2YWx1ZSlcbiAgICA6IGZpbHRlclZhbHVlID09PSB2YWx1ZVxuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyTG9nKFxuICBsb2dMZXZlbDogTG9nTGV2ZWwsXG4gIHN0YXR1czogbnVtYmVyLFxuICBtZXRob2Q6IHN0cmluZyxcbiAgb3B0aW9ucz86IE9wdGlvbnNcbik6IGJvb2xlYW4ge1xuICBjb25zdCBmaWx0ZXIgPSBvcHRpb25zPy5jb25maWc/LmxvZ0ZpbHRlclxuICBpZiAoIWZpbHRlcikge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICByZXR1cm4gKFxuICAgICghZmlsdGVyLmxldmVsIHx8IGNoZWNrRmlsdGVyKGZpbHRlci5sZXZlbCwgbG9nTGV2ZWwpKSAmJlxuICAgICghZmlsdGVyLnN0YXR1cyB8fCBjaGVja0ZpbHRlcihmaWx0ZXIuc3RhdHVzLCBzdGF0dXMpKSAmJlxuICAgICghZmlsdGVyLm1ldGhvZCB8fCBjaGVja0ZpbHRlcihmaWx0ZXIubWV0aG9kLCBtZXRob2QpKVxuICApXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgSHR0cEVycm9yLCBPcHRpb25zLCBSZXF1ZXN0SW5mbywgU3RvcmVEYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGxvZ1RvRmlsZSwgbG9nVG9UcmFuc3BvcnRzIH0gZnJvbSAnLi4vb3V0cHV0J1xuaW1wb3J0IHsgYnVpbGRMb2dNZXNzYWdlIH0gZnJvbSAnLi9idWlsZC1sb2ctbWVzc2FnZSdcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUh0dHBFcnJvcihcbiAgcmVxdWVzdDogUmVxdWVzdEluZm8sXG4gIGVycm9yOiBIdHRwRXJyb3IsXG4gIHN0b3JlOiBTdG9yZURhdGEsXG4gIG9wdGlvbnM/OiBPcHRpb25zXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgc3RhdHVzQ29kZSA9IGVycm9yLnN0YXR1cyB8fCA1MDBcbiAgY29uc3QgbG9nRGF0YSA9IHtcbiAgICBzdGF0dXM6IHN0YXR1c0NvZGUsXG4gICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSxcbiAgICBzdGFjazogZXJyb3Iuc3RhY2tcbiAgfVxuXG4gIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXVxuXG4gIC8vIEhhbmRsZSBjb25zb2xlIGxvZ2dpbmdcbiAgaWYgKFxuICAgICEoXG4gICAgICBvcHRpb25zPy5jb25maWc/LnVzZVRyYW5zcG9ydHNPbmx5IHx8XG4gICAgICBvcHRpb25zPy5jb25maWc/LmRpc2FibGVJbnRlcm5hbExvZ2dlclxuICAgIClcbiAgKSB7XG4gICAgY29uc29sZS5lcnJvcihidWlsZExvZ01lc3NhZ2UoJ0VSUk9SJywgcmVxdWVzdCwgbG9nRGF0YSwgc3RvcmUsIG9wdGlvbnMpKVxuICB9XG5cbiAgLy8gSGFuZGxlIGZpbGUgbG9nZ2luZ1xuICBpZiAoXG4gICAgIW9wdGlvbnM/LmNvbmZpZz8udXNlVHJhbnNwb3J0c09ubHkgJiZcbiAgICBvcHRpb25zPy5jb25maWc/LmxvZ0ZpbGVQYXRoICYmXG4gICAgIW9wdGlvbnM/LmNvbmZpZz8uZGlzYWJsZUZpbGVMb2dnaW5nXG4gICkge1xuICAgIHByb21pc2VzLnB1c2goXG4gICAgICBsb2dUb0ZpbGUoXG4gICAgICAgIG9wdGlvbnMuY29uZmlnLmxvZ0ZpbGVQYXRoLFxuICAgICAgICAnRVJST1InLFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICBsb2dEYXRhLFxuICAgICAgICBzdG9yZSxcbiAgICAgICAgb3B0aW9uc1xuICAgICAgKVxuICAgIClcbiAgfVxuXG4gIC8vIEhhbmRsZSB0cmFuc3BvcnQgbG9nZ2luZ1xuICBpZiAob3B0aW9ucz8uY29uZmlnPy50cmFuc3BvcnRzPy5sZW5ndGgpIHtcbiAgICBwcm9taXNlcy5wdXNoKGxvZ1RvVHJhbnNwb3J0cygnRVJST1InLCByZXF1ZXN0LCBsb2dEYXRhLCBzdG9yZSwgb3B0aW9ucykpXG4gIH1cblxuICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcylcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUge1xuICBMb2dEYXRhLFxuICBMb2dnZXIsXG4gIExvZ0xldmVsLFxuICBPcHRpb25zLFxuICBSZXF1ZXN0SW5mbyxcbiAgU3RvcmVEYXRhXG59IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBsb2dUb0ZpbGUsIGxvZ1RvVHJhbnNwb3J0cyB9IGZyb20gJy4uL291dHB1dCdcbmltcG9ydCB7IGJ1aWxkTG9nTWVzc2FnZSB9IGZyb20gJy4vYnVpbGQtbG9nLW1lc3NhZ2UnXG5pbXBvcnQgeyBmaWx0ZXJMb2cgfSBmcm9tICcuL2ZpbHRlcidcbmltcG9ydCB7IGhhbmRsZUh0dHBFcnJvciB9IGZyb20gJy4vaGFuZGxlLWh0dHAtZXJyb3InXG5cbmZ1bmN0aW9uIGdldE1ldHJpY3MoKTogTG9nRGF0YVsnbWV0cmljcyddIHtcbiAgY29uc3QgbWVtb3J5VXNhZ2UgPSBwcm9jZXNzLm1lbW9yeVVzYWdlKCkuaGVhcFVzZWQgLyAxMDI0IC8gMTAyNCAvLyBNQlxuICBjb25zdCBjcHVVc2FnZSA9IHByb2Nlc3MuY3B1VXNhZ2UoKVxuXG4gIHJldHVybiB7XG4gICAgbWVtb3J5VXNhZ2UsXG4gICAgY3B1VXNhZ2U6IGNwdVVzYWdlLnVzZXIgLyAxXzAwMF8wMDAgLy8gY29udmVydCB0byBzZWNvbmRzXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9nKFxuICBsZXZlbDogTG9nTGV2ZWwsXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICBkYXRhOiBMb2dEYXRhLFxuICBzdG9yZTogU3RvcmVEYXRhLFxuICBvcHRpb25zPzogT3B0aW9uc1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghZmlsdGVyTG9nKGxldmVsLCBkYXRhLnN0YXR1cyB8fCAyMDAsIHJlcXVlc3QubWV0aG9kLCBvcHRpb25zKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gQWRkIG1ldHJpY3MgaWYgbm90IHByb3ZpZGVkXG4gIGlmICghZGF0YS5tZXRyaWNzKSB7XG4gICAgZGF0YS5tZXRyaWNzID0gZ2V0TWV0cmljcygpXG4gIH1cblxuICAvLyBBZGQgc3RhY2sgdHJhY2UgZm9yIGVycm9yc1xuICBpZiAobGV2ZWwgPT09ICdFUlJPUicgJiYgIWRhdGEuc3RhY2spIHtcbiAgICBkYXRhLnN0YWNrID0gbmV3IEVycm9yKGBFcnJvcjogJHtkYXRhLm1lc3NhZ2UgfHwgJ1Vua25vd24gZXJyb3InfWApLnN0YWNrXG4gIH1cblxuICBjb25zdCBsb2dNZXNzYWdlID0gYnVpbGRMb2dNZXNzYWdlKGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSwgb3B0aW9ucywgdHJ1ZSlcblxuICBjb25zdCBwcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW11cblxuICAvLyBIYW5kbGUgY29uc29sZSBsb2dnaW5nXG4gIGlmIChcbiAgICAhKFxuICAgICAgb3B0aW9ucz8uY29uZmlnPy51c2VUcmFuc3BvcnRzT25seSB8fFxuICAgICAgb3B0aW9ucz8uY29uZmlnPy5kaXNhYmxlSW50ZXJuYWxMb2dnZXJcbiAgICApXG4gICkge1xuICAgIGNvbnNvbGUubG9nKGxvZ01lc3NhZ2UpXG4gIH1cblxuICAvLyBIYW5kbGUgZmlsZSBsb2dnaW5nXG4gIGlmIChcbiAgICAhb3B0aW9ucz8uY29uZmlnPy51c2VUcmFuc3BvcnRzT25seSAmJlxuICAgIG9wdGlvbnM/LmNvbmZpZz8ubG9nRmlsZVBhdGggJiZcbiAgICAhb3B0aW9ucz8uY29uZmlnPy5kaXNhYmxlRmlsZUxvZ2dpbmdcbiAgKSB7XG4gICAgcHJvbWlzZXMucHVzaChcbiAgICAgIGxvZ1RvRmlsZShcbiAgICAgICAgb3B0aW9ucy5jb25maWcubG9nRmlsZVBhdGgsXG4gICAgICAgIGxldmVsLFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICBkYXRhLFxuICAgICAgICBzdG9yZSxcbiAgICAgICAgb3B0aW9uc1xuICAgICAgKVxuICAgIClcbiAgfVxuXG4gIC8vIEhhbmRsZSB0cmFuc3BvcnQgbG9nZ2luZ1xuICBpZiAob3B0aW9ucz8uY29uZmlnPy50cmFuc3BvcnRzPy5sZW5ndGgpIHtcbiAgICBwcm9taXNlcy5wdXNoKGxvZ1RvVHJhbnNwb3J0cyhsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMpKVxuICB9XG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMb2dnZXIob3B0aW9ucz86IE9wdGlvbnMpOiBMb2dnZXIge1xuICBjb25zdCBsb2dnZXI6IExvZ2dlciA9IHtcbiAgICBzdG9yZTogdW5kZWZpbmVkLFxuICAgIGxvZzogKGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSkgPT5cbiAgICAgIGxvZyhsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMpLFxuICAgIGhhbmRsZUh0dHBFcnJvcjogYXN5bmMgKHJlcXVlc3QsIGVycm9yLCBzdG9yZSkgPT5cbiAgICAgIGF3YWl0IGhhbmRsZUh0dHBFcnJvcihyZXF1ZXN0LCBlcnJvciwgc3RvcmUsIG9wdGlvbnMpLFxuICAgIGN1c3RvbUxvZ0Zvcm1hdDogb3B0aW9ucz8uY29uZmlnPy5jdXN0b21Mb2dGb3JtYXQsXG4gICAgaW5mbzogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQsIHN0b3JlKSA9PiB7XG4gICAgICBjb25zdCBzdG9yZURhdGEgPSBzdG9yZSB8fFxuICAgICAgICBsb2dnZXIuc3RvcmUgfHwgeyBiZWZvcmVUaW1lOiBwcm9jZXNzLmhydGltZS5iaWdpbnQoKSB9XG4gICAgICBzdG9yZURhdGEuaGFzQ3VzdG9tTG9nID0gdHJ1ZVxuICAgICAgcmV0dXJuIGxvZyhcbiAgICAgICAgJ0lORk8nLFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICB7IG1lc3NhZ2UsIGNvbnRleHQsIHN0YXR1czogMjAwIH0sXG4gICAgICAgIHN0b3JlRGF0YSxcbiAgICAgICAgb3B0aW9uc1xuICAgICAgKVxuICAgIH0sXG4gICAgZXJyb3I6IChyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0LCBzdG9yZSkgPT4ge1xuICAgICAgY29uc3Qgc3RvcmVEYXRhID0gc3RvcmUgfHxcbiAgICAgICAgbG9nZ2VyLnN0b3JlIHx8IHsgYmVmb3JlVGltZTogcHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkgfVxuICAgICAgc3RvcmVEYXRhLmhhc0N1c3RvbUxvZyA9IHRydWVcbiAgICAgIHJldHVybiBsb2coXG4gICAgICAgICdFUlJPUicsXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIHsgbWVzc2FnZSwgY29udGV4dCwgc3RhdHVzOiA1MDAgfSxcbiAgICAgICAgc3RvcmVEYXRhLFxuICAgICAgICBvcHRpb25zXG4gICAgICApXG4gICAgfSxcbiAgICB3YXJuOiAocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dCwgc3RvcmUpID0+IHtcbiAgICAgIGNvbnN0IHN0b3JlRGF0YSA9IHN0b3JlIHx8XG4gICAgICAgIGxvZ2dlci5zdG9yZSB8fCB7IGJlZm9yZVRpbWU6IHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpIH1cbiAgICAgIHN0b3JlRGF0YS5oYXNDdXN0b21Mb2cgPSB0cnVlXG4gICAgICByZXR1cm4gbG9nKFxuICAgICAgICAnV0FSTklORycsXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIHsgbWVzc2FnZSwgY29udGV4dCwgc3RhdHVzOiAyMDAgfSxcbiAgICAgICAgc3RvcmVEYXRhLFxuICAgICAgICBvcHRpb25zXG4gICAgICApXG4gICAgfSxcbiAgICBkZWJ1ZzogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQsIHN0b3JlKSA9PiB7XG4gICAgICBjb25zdCBzdG9yZURhdGEgPSBzdG9yZSB8fFxuICAgICAgICBsb2dnZXIuc3RvcmUgfHwgeyBiZWZvcmVUaW1lOiBwcm9jZXNzLmhydGltZS5iaWdpbnQoKSB9XG4gICAgICBzdG9yZURhdGEuaGFzQ3VzdG9tTG9nID0gdHJ1ZVxuICAgICAgcmV0dXJuIGxvZyhcbiAgICAgICAgJ0RFQlVHJyxcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgeyBtZXNzYWdlLCBjb250ZXh0LCBzdGF0dXM6IDIwMCB9LFxuICAgICAgICBzdG9yZURhdGEsXG4gICAgICAgIG9wdGlvbnNcbiAgICAgIClcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGxvZ2dlclxufVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIm96QkFBdUIsSUFBdkIsb0JDRUEsSUFBTSxFQUFnQixDQUFDLEVBQWMsSUFBMEIsQ0FDN0QsSUFBTSxFQUFnQixLQUFLLElBQUksR0FBSSxFQUFRLEVBQUssUUFBVSxDQUFDLEVBQ3JELEVBQVUsSUFBSSxPQUFPLENBQWEsRUFDeEMsTUFBTyxHQUFHLElBQVUsSUFBTyxJQUFVLE9BQU8sQ0FBSyxHQUduRCxTQUF3QixDQUFXLENBQUMsRUFBZ0IsRUFBeUIsQ0FDM0UsSUFBTSxFQUFXLEdBQVEsVUFBWSxZQUMvQixFQUFPLEdBQVEsTUFBUSxLQUN2QixFQUFXLEdBQVEsVUFBWSxPQUdyQyxHQUZtQixHQUFTLFFBQVEsdUJBQXlCLFNBRTdDLENBRWQsSUFBTSxFQUFVLHFDQUEwQixPQUFjLEtBQVksSUFDOUQsRUFBVyxLQUFLLElBQUksR0FBYyxFQUFRLE1BQU0sRUFBSSxFQUNwRCxFQUFTLElBQUcsT0FBTyxDQUFRLEVBQzNCLEVBQVksRUFBYyxHQUFJLENBQVEsRUFFNUMsUUFBUSxJQUFJO0FBQUEsU0FDUjtBQUFB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
|
package/dist/index.d.cts
DELETED
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import { Elysia } from "elysia";
|
|
2
|
-
interface RequestInfo {
|
|
3
|
-
headers: {
|
|
4
|
-
get: (key: string) => string | null
|
|
5
|
-
};
|
|
6
|
-
method: string;
|
|
7
|
-
url: string;
|
|
8
|
-
}
|
|
9
|
-
type LogLevel = "DEBUG" | "INFO" | "WARNING" | "ERROR" | string;
|
|
10
|
-
interface LogData {
|
|
11
|
-
status?: number;
|
|
12
|
-
message?: string;
|
|
13
|
-
context?: Record<string, string | number | boolean | null>;
|
|
14
|
-
stack?: string;
|
|
15
|
-
metrics?: {
|
|
16
|
-
memoryUsage?: number
|
|
17
|
-
cpuUsage?: number
|
|
18
|
-
responseSize?: number
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
interface Logger {
|
|
22
|
-
store?: StoreData;
|
|
23
|
-
log(level: LogLevel, request: RequestInfo, data: LogData, store: StoreData): void;
|
|
24
|
-
handleHttpError(request: RequestInfo, error: HttpError, store: StoreData): Promise<void>;
|
|
25
|
-
customLogFormat?: string;
|
|
26
|
-
info(request: RequestInfo, message: string, context?: Record<string, string | number | boolean | null>, store?: StoreData): void;
|
|
27
|
-
error(request: RequestInfo, message: string, context?: Record<string, string | number | boolean | null>, store?: StoreData): void;
|
|
28
|
-
warn(request: RequestInfo, message: string, context?: Record<string, string | number | boolean | null>, store?: StoreData): void;
|
|
29
|
-
debug(request: RequestInfo, message: string, context?: Record<string, string | number | boolean | null>, store?: StoreData): void;
|
|
30
|
-
}
|
|
31
|
-
interface StoreData {
|
|
32
|
-
beforeTime: bigint;
|
|
33
|
-
logger?: Logger;
|
|
34
|
-
hasCustomLog?: boolean;
|
|
35
|
-
}
|
|
36
|
-
interface LogixlysiaContext {
|
|
37
|
-
store: {
|
|
38
|
-
logger: Logger
|
|
39
|
-
beforeTime: bigint
|
|
40
|
-
hasCustomLog: boolean
|
|
41
|
-
};
|
|
42
|
-
request: RequestInfo;
|
|
43
|
-
}
|
|
44
|
-
declare class HttpError extends Error {
|
|
45
|
-
status: number;
|
|
46
|
-
constructor(status: number, message: string);
|
|
47
|
-
}
|
|
48
|
-
type TransportFunction = (level: LogLevel, message: string, meta: {
|
|
49
|
-
request: RequestInfo
|
|
50
|
-
data: LogData
|
|
51
|
-
store: StoreData
|
|
52
|
-
}) => Promise<void> | void;
|
|
53
|
-
interface Transport {
|
|
54
|
-
log: TransportFunction;
|
|
55
|
-
}
|
|
56
|
-
interface TimestampConfig {
|
|
57
|
-
translateTime?: boolean | string;
|
|
58
|
-
}
|
|
59
|
-
interface Options {
|
|
60
|
-
config?: {
|
|
61
|
-
customLogFormat?: string
|
|
62
|
-
logFilePath?: string
|
|
63
|
-
logRotation?: {
|
|
64
|
-
maxSize?: number
|
|
65
|
-
maxFiles?: number
|
|
66
|
-
compress?: boolean
|
|
67
|
-
}
|
|
68
|
-
logFilter?: {
|
|
69
|
-
level?: LogLevel | LogLevel[]
|
|
70
|
-
method?: string | string[]
|
|
71
|
-
status?: number | number[]
|
|
72
|
-
} | null
|
|
73
|
-
ip?: boolean
|
|
74
|
-
useColors?: boolean
|
|
75
|
-
showStartupMessage?: boolean
|
|
76
|
-
startupMessageFormat?: "banner" | "simple"
|
|
77
|
-
transports?: Transport[]
|
|
78
|
-
timestamp?: TimestampConfig
|
|
79
|
-
disableInternalLogger?: boolean
|
|
80
|
-
disableFileLogging?: boolean
|
|
81
|
-
useTransportsOnly?: boolean
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
|
-
declare function createLogger(options?: Options): Logger;
|
|
85
|
-
declare function handleHttpError2(request: RequestInfo, error: HttpError, store: StoreData, options?: Options): Promise<void>;
|
|
86
|
-
declare function logToTransports(level: LogLevel, request: RequestInfo, data: LogData, store: StoreData, options?: Options): Promise<void>;
|
|
87
|
-
declare function logixlysia(options?: Options): Elysia;
|
|
88
|
-
export { logToTransports, handleHttpError2 as handleHttpError, logixlysia as default, createLogger, Transport, StoreData, RequestInfo, Options, LogixlysiaContext, Logger, LogLevel, LogData, HttpError };
|