Skip to content

LuKks/like-util

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

24 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

like-util

Reusable utility code.

// crypto
const { createHash, createHmac, passwordHash } = require('like-util')
const { randomBytes, randomHex, randomFloat, randomInt } = require('like-util')

// network
const { ip2int, int2ip } = require('like-util')

// errors
const { ErrorHandler } = require('like-util')

// date
const { dateToSeconds, dateToLocale } = require('like-util')

// others
const { sleep, isObjectEqual } = require('like-util')

// shared object
const { shared } = require('like-util')
const shared = require('like-util/shared')

Install

npm i like-util

Examples

crypto

// hashing
createHash('sha1', 'secret text') // => '43de199bc1b7196be767cce745baece4dc95fbf2'
createHmac('sha1', 'secret key', 'secret text') // => '85c15fbb5b1c3afbd645f99977a260c4984086f8'

// password hash
const hashed = await passwordHash('hwy123') // 108 len EcM4...3Fr4+I=
const result = await passwordHash('hwy123', hashed) // EcM4...3Fr4+I= (same output)
const match = hashed === result // true

// All are cryptographically secure:
await randomBytes(4) // => <Buffer 52 62 03 01>
await randomHex(4) // => 'f3a66fa0' (bytes to hex are double in size)
await randomFloat() // => 0.29868882046557754
await randomInt(0, 3) // => 0, 1 or 2
await randomNumber(0, 3) // => 0, 1, 2 or 3

Notice that randomInt(min, max): min is inclusive and max is exclusive
randomFloat() is like Math.random(): 0 (inclusive) and 1 (exclusive)

network

ip2int('142.250.188.14') // => 2398796814
int2ip(2398796814) // => '142.250.188.14'

ip2int('113.5.67.242') // => 1896170482
int2ip(1896170482) // => '113.5.67.242'

ip2int('0.0.0.0') // => 0
ip2int('0.0.0.255') // => 255
ip2int('0.0.255.255') // => 65535

Date

dateToSeconds() // => 1647838051

dateToLocale() // => '21/03/2022, 01:47:21'
dateToLocale({ year: false, second: false }) // => '21/03, 01:47'
dateToLocale({ time: 1647838051337, millis: true }) // => '21/03/2022, 01:47:31.337'

Others

await sleep(1000)

isObjectEqual({ a: 1, b: 2 }, { a: 1, b: 2 }) // => true
isObjectEqual({ a: 1, b: 2 }, { b: 2, a: 1 }) // => true (still true)
isObjectEqual({ a: { b: { c: 1 } } }, { a: { b: { c: 1 } } }) // => true
isObjectEqual({ a: 1, b: 2 }, { a: 1, b: 2, c: 3 }) // => false

const obj = { a: 1, b: function () {} }
isObjectEqual(obj, JSON.parse(JSON.stringify(obj))) // => false

Shared object

It's just a quick access for an object.
At the start-up of your app, you can initialize it and then use it:

// app.js
const shared = require('like-util/shared')
shared.web3 = new Web3()

// route.js
const { web3 } = require('like-util/shared')
// ...

ErrorHandler, optionally with yup

It can help you handling errors in your HTTP server:

const express = require('express')
require('express-async-errors')
const { ErrorHandler } = require('like-util')
const yup = require('yup')

const app = express()

// I really like yup, it's very easy to create schemas for requests
const schema = yup.object().shape({
  email: yup.string().default('').min(5).max(128),
  password: yup.string().default('').min(4),
  repassword: yup.string().default('').oneOf([yup.ref('password')])
})

app.post('/signup', async function (req, res) {
  // We don't need to try-catch,
  // in case there is an error at validation, it will send status 400
  const body = await schema.validate(req.body)

  if (body.password !== body.repassword) {
    throw ErrorHandler(400, 'The passwords are not equals')
  }

  // Let's say this operation throws an error which is a critical error,
  // it will send status 500 with a generic message to avoid leaking internal errors
  await db.insert('users', { ... })

  res.send('ok')
})

app.use(ErrorHandler.middleware) // handle errors

app.listen(3000, () => console.log('listening'))

Tests

There are no tests yet

License

Code released under the MIT License.

About

Reusable utility code

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published