UNPKG

1.78 kBtext/coffeescriptView Raw
1fs = require "fs"
2Crypto = require "crypto"
3{Method} = require "fairmont-multimethods"
4{isBuffer, isString} = require "./type"
5Base64Words = require "base64-words"
6{promise, async} = require "./promise"
7
8md5 = Method.create()
9
10Method.define md5, isString,
11 (string) -> Crypto.createHash('md5').update(string, 'utf-8').digest("hex")
12
13Method.define md5, isBuffer,
14 (buffer) -> Crypto.createHash('md5').update(buffer, 'binary').digest("hex")
15
16base64 = Method.create()
17Method.define base64, isString, (string) -> base64 new Buffer string
18Method.define base64, isBuffer, (buffer) -> buffer.toString 'base64'
19
20
21base64URL = (buffer) ->
22 base64 buffer
23 .replace(/\+/g, '-')
24 .replace(/\//g, '_')
25 .replace(/\=+$/, '')
26
27# Use base64URL so we don't get the trailing delimiters
28toBase64Words = (buffer) ->
29 Base64Words.fromBase64 base64URL buffer
30
31fromBase64Words = (string) ->
32 new Buffer (Base64Words.toBase64 string), 'base64'
33
34# read from /dev/urandom unless on Windows
35# https://github.com/nodejs/node/issues/5798
36randomBytes = unless process.platform == "win32"
37 (n) ->
38 promise (resolve, reject) ->
39 fs.open "/dev/urandom", "r", (error, fd) ->
40 buffer = Buffer.alloc n
41 fs.read fd, buffer, 0, n, 0, (error, m) ->
42 if n == m
43 resolve buffer
44 else
45 reject "Unable to read #{n} bytes from /dev/urandom"
46else
47 (n) ->
48 promise (resolve, reject) ->
49 Crypto.randomBytes n, (error, buffer) ->
50 unless error?
51 resolve buffer
52 else
53 reject error
54
55randomKey = async (n) -> base64URL yield randomBytes n
56randomWords = async (n) -> toBase64Words yield randomBytes n
57
58module.exports = {md5,
59 base64, base64URL,
60 toBase64Words, fromBase64Words
61 randomBytes, randomKey, randomWords}