woah's notebooks

  • Untitled - /woah/prr
    Last edited 7 years ago
    const prr = require('prettycats') prr.isStringOfLengthBetween(1, 11)('3')
  • Decision prototype - /woah/decision-prototype
    Last edited 7 years ago
    const log = [ { type: 'b', result: 0 }, { type: 'b', result: 0 }, { type: 'b', result: 0 }, { type: 'b', result: 0 }, { type: 'b', result: 0 }, { type: 'v', result: 0 }, { type: 'v', result: 0 }, { type: 'v', result: 1 }, { type: 'v', result: 0 }, { type: 'p', result: 100 }, { type: 'p', result: 20 }, { type: 'p', result: 0 }, { type: 'p', result: 0 }, { type: 'f', result: 0 }, { type: 'f', result: 0 }, { type: 'f', result: 0 }, { type: 'f', result: 0 }, ] function evaluate (log) { const basic = log.filter(log => log.type === 'b') .reduce((acc, item) => item.result > acc ? item.result : acc, 0) const variable = log.filter(log => log.type === 'v') .reduce((acc, item) => item.result < acc ? item.result : acc, 1) const points = log.filter(log => log.type === 'p') .reduce((acc, item) => item.result > acc ? item.result : acc, 0) const fraud = log.filter(log => log.type === 'f') .reduce((acc, item) => item.result > acc ? item.result : acc, 0) if (basic !== 0) { return basic } if (fraud !== 0) { return fraud } if (variable === 0) { return variable } return points } function evaluate2 (log) { let basic = log.filter(log => log.type === 'b').map(o => o.result) let variable = log.filter(log => log.type === 'v').map(o => o.result) let points = log.filter(log => log.type === 'p').map(o => o.result) let fraud = log.filter(log => log.type === 'f').map(o => o.result) const allMustBeOk = arr => arr.reduce( (acc, item) => item > acc ? item : acc, 0 ) const oneMustBeOk = arr => arr.reduce( (acc, item) => item < acc ? item : acc, 1 ) const mustSumTo120 = arr => 120 < arr.reduce( (acc, item) => acc + item ) variable = [ ...variable, mustAddUp(points) ] const overall = [ allMustBeOk(basic), oneMustBeOk(variable), allMustBeOk(fraud) ] return allMustBeOk(overall) }
  • Pubkey JWT - /woah/pubkey-jwt
    Last edited 7 years ago
    const jwt = require('jsonwebtoken'); const R = require('ramda') // public key for fooservice // accessible by all services in vault at `/services/pubkeys/FOO` const fooPubkey = `-----BEGIN RSA PUBLIC KEY----- MIIBCgKCAQEAvzoCEC2rpSpJQaWZbUmlsDNwp83Jr4fi6KmBWIwnj1MZ6CUQ7rBa suLI8AcfX5/10scSfQNCsTLV2tMKQaHuvyrVfwY0dINk+nkqB74QcT2oCCH9XduJ jDuwWA4xLqAKuF96FsIes52opEM50W7/W7DZCKXkC8fFPFj6QF5ZzApDw2Qsu3yM Rmr7/W9uWeaTwfPx24YdY7Ah+fdLy3KN40vXv9c4xiSafVvnx9BwYL7H1Q8NiK9L GEN6+JSWfgckQCs6UUBOXSZdreNN9zbQCwyzee7bOJqXUDAuLcFARzPw1EsZAyjV tGCKIQ0/btqK+jFunT2NBC8RItanDZpptQIDAQAB -----END RSA PUBLIC KEY-----` // private key for fooservice // accessible by only foo service in vault at `/services/privkeys/FOO` const fooPrivkey = `-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAvzoCEC2rpSpJQaWZbUmlsDNwp83Jr4fi6KmBWIwnj1MZ6CUQ 7rBasuLI8AcfX5/10scSfQNCsTLV2tMKQaHuvyrVfwY0dINk+nkqB74QcT2oCCH9 XduJjDuwWA4xLqAKuF96FsIes52opEM50W7/W7DZCKXkC8fFPFj6QF5ZzApDw2Qs u3yMRmr7/W9uWeaTwfPx24YdY7Ah+fdLy3KN40vXv9c4xiSafVvnx9BwYL7H1Q8N iK9LGEN6+JSWfgckQCs6UUBOXSZdreNN9zbQCwyzee7bOJqXUDAuLcFARzPw1EsZ AyjVtGCKIQ0/btqK+jFunT2NBC8RItanDZpptQIDAQABAoIBAQCsssO4Pra8hFMC gX7tr0x+tAYy1ewmpW8stiDFilYT33YPLKJ9HjHbSms0MwqHftwwTm8JDc/GXmW6 qUui+I64gQOtIzpuW1fvyUtHEMSisI83QRMkF6fCSQm6jJ6oQAtOdZO6R/gYOPNb 3gayeS8PbMilQcSRSwp6tNTVGyC33p43uUUKAKHnpvAwUSc61aVOtw2wkD062XzM hJjYpHm65i4V31AzXo8HF42NrAtZ8K/AuQZne5F/6F4QFVlMKzUoHkSUnTp60XZx X77GuyDeDmCgSc2J7xvR5o6VpjsHMo3ek0gJk5ZBnTgkHvnpbULCRxTmDfjeVPue v3NN2TBFAoGBAPxbqNEsXPOckGTvG3tUOAAkrK1hfW3TwvrW/7YXg1/6aNV4sklc vqn/40kCK0v9xJIv9FM/l0Nq+CMWcrb4sjLeGwHAa8ASfk6hKHbeiTFamA6FBkvQ //7GP5khD+y62RlWi9PmwJY21lEkn2mP99THxqvZjQiAVNiqlYdwiIc7AoGBAMH8 f2Ay7Egc2KYRYU2qwa5E/Cljn/9sdvUnWM+gOzUXpc5sBi+/SUUQT8y/rY4AUVW6 YaK7chG9YokZQq7ZwTCsYxTfxHK2pnG/tXjOxLFQKBwppQfJcFSRLbw0lMbQoZBk S+zb0ufZzxc2fJfXE+XeJxmKs0TS9ltQuJiSqCPPAoGBALEc84K7DBG+FGmCl1sb ZKJVGwwknA90zCeYtadrIT0/VkxchWSPvxE5Ep+u8gxHcqrXFTdILjWW4chefOyF 5ytkTrgQAI+xawxsdyXWUZtd5dJq8lxLtx9srD4gwjh3et8ZqtFx5kCHBCu29Fr2 PA4OmBUMfrs0tlfKgV+pT2j5AoGBAKnA0Z5XMZlxVM0OTH3wvYhI6fk2Kx8TxY2G nxsh9m3hgcD/mvJRjEaZnZto6PFoqcRBU4taSNnpRr7+kfH8sCht0k7D+l8AIutL ffx3xHv9zvvGHZqQ1nHKkaEuyjqo+5kli6N8QjWNzsFbdvBQ0CLJoqGhVHsXuWnz W3Z4cBbVAoGAEtnwY1OJM7+R2u1CW0tTjqDlYU2hUNa9t1AbhyGdI2arYp+p+umA b5VoYLNsdvZhqjVFTrYNEuhTJFYCF7jAiZLYvYm0C99BqcJnJPl7JjWynoNHNKw3 9f6PIOE1rAmPE8Cfz/GFF5115ZKVlq+2BY8EKNxbCIy2d/vMEvisnXI= -----END RSA PRIVATE KEY-----` // whitelist of audiences issuer is allowed to talk to // accessible by all services in vault at `/services/whitelist/` const whitelist = { 'FOO': [ // issuer ("caller") 'BAR' // audience ("callee") ] } // In the SDK on the foo service // Foo service gets its privkey from vault at `/services/privkeys/FOO` let myAud = 'FOO' const token = jwt.sign({}, fooPrivkey, { expiresIn: '60m', algorithm: 'RS256', issuer: myAud, audience: 'BAR' }) // -- foo service sends request to bar service --> // In the SDK on the bar service // Bar service gets foo's pubkey from vault at `/services/pubkeys/FOO` myAud = 'BAR' jwt.verify( token, fooPubkey, { audience: myAud }, (err, decoded) => { if (err) { console.error(err) } else { if (!R.contains(decoded.aud, whitelist[decoded.iss])) { return console.error(new Error("issuer is not allowed to talk to audience")) } return console.log("ok") } } )
  • validate - /woah/validator
    Last edited 7 years ago
    const isObjectOf = schema => obj => { Object.keys(schema).forEach(key => { const value = obj[key] const predicate = schema[key] try { if (predicate(value) === false) { throw new Error('invalid') } } catch(err) { throw new Error(`${key} ${err.message}`) } }) return true } const isArrayOf = predicate => arr => { arr.forEach((value, i) => { try { if (predicate(value) === false) { throw new Error('invalid') } } catch(err) { throw new Error(`[${i}] ${err.message}`) } }) } const isRequired = predicate => value => { if (value === undefined) { throw new Error('missing') } else { return predicate(value) } } const isOptional = predicate => value => { if (value === undefined) { return true } else { return predicate(value) } } // const { // isObjectOf, // isArrayOf, // isRequired, // isOptional // } = require('foo-validator') const isString = isRequired(s => { if (typeof s !== 'string') { throw new Error('You messed up')} return true }) const isNumber = isRequired(n => typeof n === 'number') const awesomeErrorHandler = predicate => value => { try { predicate(value) } catch(err) { const err = new Error(`Holy crap: ${err.message}`) err.code = 7002 throw err } } const isMyType = isObjectOf({ foo: isOptional(isString), bar: isNumber, arr: isRequired(isArrayOf(isNumber)) }) isMyOtherType = isObjectOf({ baz: isString, myType: isMyType }) isMyOtherType({ baz: 'dop', myType:{ foo: 3, bar: 3, arr: [3, 3] } })