f2e-server3
Version:
f2e-server 3.0
142 lines (141 loc) • 5.47 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.renderHTML = exports.template = exports.isPlainObject = exports.set = exports.get = exports.queryparams = exports.ServerIP = exports.toBuffer = exports.decode = exports.isText = exports.getMimeType = exports.minimatch = exports.createSessionId = exports.pathname_dirname = exports.pathname_fixer = exports.pathname_arr = exports.REG_FILENAME = void 0;
const logger_1 = __importDefault(require("./logger"));
const node_os_1 = require("node:os");
const mime_1 = __importDefault(require("./mime"));
const templates_1 = require("./templates");
exports.REG_FILENAME = /[^\\/,\s\t\n]+/g;
const pathname_arr = (str = '') => (str.split(/[#?]+/)[0].replace(/^\.+\//, '').match(exports.REG_FILENAME) || []);
exports.pathname_arr = pathname_arr;
const pathname_fixer = (str = '') => (0, exports.pathname_arr)(str).join('/');
exports.pathname_fixer = pathname_fixer;
const pathname_dirname = (str = '') => (str.match(exports.REG_FILENAME) || []).slice(0, -1).join('/');
exports.pathname_dirname = pathname_dirname;
const createSessionId = () => 'xxxx-xxxx-xxxx-xxxx'.replace(/xxxx/g, () => Math.floor((1 << 16) + Math.random() * (1 << 24)).toString(16).substring(0, 4));
exports.createSessionId = createSessionId;
const minimatch = (str = '', pattern = '') => {
const reg = new RegExp(pattern.replace(/\./g, '\\.').replace(/\*/g, '.*').replace(/,/g, '|'));
return reg.test(str);
};
exports.minimatch = minimatch;
const getMimeType = (pathname) => {
const suffix = (pathname || '').split('.').pop() || '';
return mime_1.default.getType(suffix) || 'application/octet-stream';
};
exports.getMimeType = getMimeType;
const isText = (pathname) => {
const type = (0, exports.getMimeType)(pathname);
return /\b(html?|txt|javascript|json)\b/.test(type || 'exe');
};
exports.isText = isText;
const decode = (str) => {
try {
return decodeURIComponent(str);
}
catch (e) {
logger_1.default.warn(e);
return str;
}
};
exports.decode = decode;
const toBuffer = function (arrayBuffer) {
const buffer = Buffer.alloc(arrayBuffer.byteLength);
const arrayBufferView = new Uint8Array(arrayBuffer);
for (let i = 0; i < arrayBufferView.length; i++) {
buffer[i] = arrayBufferView[i];
}
return buffer;
};
exports.toBuffer = toBuffer;
exports.ServerIP = (Object.entries((0, node_os_1.networkInterfaces)())
.find(([__, info]) => info?.filter((t) => t.family === 'IPv4' && !t.internal)[0])?.[1]?.filter((t) => t.family === 'IPv4' && !t.internal)[0]
|| { address: '127.0.0.1' }).address;
const queryparams = (search) => {
const searchParams = new URLSearchParams(search);
const params = {};
searchParams.forEach((v, k) => {
if (params[k]) {
params[k] = [].concat(params[k]).concat(v);
}
else {
params[k] = v;
}
});
return params;
};
exports.queryparams = queryparams;
const get = function loopGet(obj, path) {
const [key, ...rest] = path.toString().match(exports.REG_FILENAME) || [];
if (!key || !obj) {
return obj;
}
if (rest.length === 0) {
return obj[key];
}
return loopGet(obj[key], rest);
};
exports.get = get;
const set = function loopSet(obj, path, value) {
const [key, ...rest] = path.toString().match(exports.REG_FILENAME) || [];
if (!key)
return;
if (rest.length === 0) {
Object.assign(obj, {
[key]: value
});
}
else {
if (!obj[key]) {
obj[key] = {};
}
loopSet(obj[key], rest, value);
}
};
exports.set = set;
const isPlainObject = function (value) {
if (!value || typeof value != 'object') {
return false;
}
return Object.prototype.toString.call(value) === '[object Object]';
};
exports.isPlainObject = isPlainObject;
/** 简单字符串模板,类似 handlebars */
const template = function template(tpl, data, toBlank = true, index) {
return tpl
.replace(/{{!--[\s\S]*?--}}/g, '') // 删除注释
.replace(/\{\{#?(\w+)\s+(\w+)[^{}]*\}\}([\s\S\t\r\n]*?)\{\{\/\1\}\}/g, function (_, fn, item_key, line) {
const items = data[item_key];
const _placeholder = toBlank ? '' : _;
switch (fn) {
case 'each':
return items ? items.map((item, index) => template(line, item, toBlank, index)).join('') : _placeholder;
case 'if':
return items ? template(line, items) : _placeholder;
default:
return template(line, items);
}
})
.replace(/\{\{([@\$\.\w]+)\}\}/g, (__, key) => {
const _placeholder = toBlank ? '' : __;
switch (key) {
case '@': return typeof data !== 'undefined' ? data : _placeholder;
case '@index': return index;
default: return typeof data[key] !== 'undefined' ? data[key] : _placeholder;
}
});
};
exports.template = template;
const renderHTML = (body, data) => {
if (!(0, exports.isPlainObject)(data)) {
return body;
}
return (0, exports.template)(templates_1.page_layout, {
title: data.title || 'F2E Page',
body: (0, exports.template)(body, data)
});
};
exports.renderHTML = renderHTML;