185 lines
4.0 KiB
JavaScript
185 lines
4.0 KiB
JavaScript
const { bench, group, run } = require('mitata')
|
|
const slowRedact = require('../index.js')
|
|
const fastRedact = require('fast-redact')
|
|
|
|
// Test objects
|
|
const smallObj = {
|
|
user: { name: 'john', password: 'secret123' },
|
|
headers: { cookie: 'session-token', authorization: 'Bearer abc123' }
|
|
}
|
|
|
|
const largeObj = {
|
|
users: [],
|
|
metadata: {
|
|
version: '1.0.0',
|
|
secret: 'app-secret-key',
|
|
database: {
|
|
host: 'localhost',
|
|
password: 'db-password'
|
|
}
|
|
}
|
|
}
|
|
|
|
// Populate users array with for loop instead of Array.from
|
|
for (let i = 0; i < 100; i++) {
|
|
largeObj.users.push({
|
|
id: i,
|
|
name: `user${i}`,
|
|
email: `user${i}@example.com`,
|
|
password: `secret${i}`,
|
|
profile: {
|
|
age: 20 + (i % 50),
|
|
preferences: {
|
|
theme: 'dark',
|
|
notifications: true,
|
|
apiKey: `key-${i}-secret`
|
|
}
|
|
}
|
|
})
|
|
}
|
|
|
|
// Redaction configurations
|
|
const basicSlowRedact = slowRedact({
|
|
paths: ['user.password', 'headers.cookie']
|
|
})
|
|
|
|
const basicFastRedact = fastRedact({
|
|
paths: ['user.password', 'headers.cookie']
|
|
})
|
|
|
|
const wildcardSlowRedact = slowRedact({
|
|
paths: ['users.*.password', 'users.*.profile.preferences.apiKey']
|
|
})
|
|
|
|
const wildcardFastRedact = fastRedact({
|
|
paths: ['users.*.password', 'users.*.profile.preferences.apiKey']
|
|
})
|
|
|
|
const deepSlowRedact = slowRedact({
|
|
paths: ['metadata.secret', 'metadata.database.password']
|
|
})
|
|
|
|
const deepFastRedact = fastRedact({
|
|
paths: ['metadata.secret', 'metadata.database.password']
|
|
})
|
|
|
|
group('Small Object Redaction - @pinojs/redact', () => {
|
|
bench('basic paths', () => {
|
|
basicSlowRedact(smallObj)
|
|
})
|
|
|
|
bench('serialize: false', () => {
|
|
const redact = slowRedact({
|
|
paths: ['user.password'],
|
|
serialize: false
|
|
})
|
|
redact(smallObj)
|
|
})
|
|
|
|
bench('custom censor function', () => {
|
|
const redact = slowRedact({
|
|
paths: ['user.password'],
|
|
censor: (value, path) => `HIDDEN:${path}`
|
|
})
|
|
redact(smallObj)
|
|
})
|
|
})
|
|
|
|
group('Small Object Redaction - fast-redact', () => {
|
|
bench('basic paths', () => {
|
|
basicFastRedact(smallObj)
|
|
})
|
|
|
|
bench('serialize: false', () => {
|
|
const redact = fastRedact({
|
|
paths: ['user.password'],
|
|
serialize: false
|
|
})
|
|
redact(smallObj)
|
|
})
|
|
|
|
bench('custom censor function', () => {
|
|
const redact = fastRedact({
|
|
paths: ['user.password'],
|
|
censor: (value, path) => `HIDDEN:${path}`
|
|
})
|
|
redact(smallObj)
|
|
})
|
|
})
|
|
|
|
group('Large Object Redaction - @pinojs/redact', () => {
|
|
bench('wildcard patterns', () => {
|
|
wildcardSlowRedact(largeObj)
|
|
})
|
|
|
|
bench('deep nested paths', () => {
|
|
deepSlowRedact(largeObj)
|
|
})
|
|
|
|
bench('multiple wildcards', () => {
|
|
const redact = slowRedact({
|
|
paths: ['users.*.password', 'users.*.profile.preferences.*']
|
|
})
|
|
redact(largeObj)
|
|
})
|
|
})
|
|
|
|
group('Large Object Redaction - fast-redact', () => {
|
|
bench('wildcard patterns', () => {
|
|
wildcardFastRedact(largeObj)
|
|
})
|
|
|
|
bench('deep nested paths', () => {
|
|
deepFastRedact(largeObj)
|
|
})
|
|
|
|
bench('multiple wildcards', () => {
|
|
const redact = fastRedact({
|
|
paths: ['users.*.password', 'users.*.profile.preferences.*']
|
|
})
|
|
redact(largeObj)
|
|
})
|
|
})
|
|
|
|
group('Direct Performance Comparison', () => {
|
|
bench('@pinojs/redact - basic paths', () => {
|
|
basicSlowRedact(smallObj)
|
|
})
|
|
|
|
bench('fast-redact - basic paths', () => {
|
|
basicFastRedact(smallObj)
|
|
})
|
|
|
|
bench('@pinojs/redact - wildcards', () => {
|
|
wildcardSlowRedact(largeObj)
|
|
})
|
|
|
|
bench('fast-redact - wildcards', () => {
|
|
wildcardFastRedact(largeObj)
|
|
})
|
|
})
|
|
|
|
group('Object Cloning Overhead', () => {
|
|
bench('@pinojs/redact - no redaction (clone only)', () => {
|
|
const redact = slowRedact({ paths: [] })
|
|
redact(smallObj)
|
|
})
|
|
|
|
bench('fast-redact - no redaction', () => {
|
|
const redact = fastRedact({ paths: [] })
|
|
redact(smallObj)
|
|
})
|
|
|
|
bench('@pinojs/redact - large object clone', () => {
|
|
const redact = slowRedact({ paths: [] })
|
|
redact(largeObj)
|
|
})
|
|
|
|
bench('fast-redact - large object', () => {
|
|
const redact = fastRedact({ paths: [] })
|
|
redact(largeObj)
|
|
})
|
|
})
|
|
|
|
run()
|