妈见打编码系列之 ssr 链接 encode/decode

1,362 阅读1分钟

链接基础格式

ssr://server:port:protocol:method:obfs:password_base64/?params_base64

decode

const url = require('url')
const qs = require('querystring')

const decode = (ssr_link) => {
  const link = Buffer.from(
    ssr_link.replace(/^ssr:\/\//, ''),
    'base64',
  ).toString()

  const [server, port, protocol, method, obfs, pwd_and_params] = link.split(':')

  const [pwd, params] = (({ query, pathname } = {}) => [
    Buffer.from(pathname, 'base64').toString(),
    Object.entries(qs.parse(query)).map(([key, val]) => [
      key,
      Buffer.from(val.toString(), 'base64').toString(),
    ]),
  ])(url.parse(pwd_and_params))

  return { server, port, protocol, method, obfs, pwd, params }
}

encode

const url = require('url')
const qs = require('querystring')

const encode = ({
  server,
  port,
  protocol,
  method,
  obfs,
  pwd,
  params,
} = {}) => {
  const password_base64 = Buffer.from(pwd).toString('base64')
  const params_base64 = params
    .map(([key, val] = []) =>
      [key, val ? Buffer.from(val).toString('base64') : '0'].join('='),
    )
    .join('&')

  const ssr_info = Buffer.from(
    `${server}:${port}:${protocol}:${method}:${obfs}:${password_base64}/?${params_base64}`,
  )
    .toString('base64')
    .replace(/\//g, '_')

  return `ssr://${ssr_info}`
}

Q:为啥要用 const 声明函数?

A:防止投毒

const a = 1

a = 2 // error

function b() {}

b = 'fun'

const bb = () => {}

bb = 'fun' // error

Q:为啥使用(()=>{})()自执行函数

A:减少中间变量,整合逻辑上下文、资源回收,减少投毒机会

const [pwd, params] = (({ query, pathname } = {}) => [
  Buffer.from(pathname, 'base64').toString(),
  Object.entries(qs.parse(query)).map(([key, val]) => [
    key,
    Buffer.from(val.toString(), 'base64').toString(),
  ]),
])(url.parse(pwd_and_params))