リンクベース形式
ssr://server:port:protocol:method:obfs:password_base64/?params_base64
デコード
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 }
}
エンコード
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))