✨ MAJOR FEATURES: • Auto-zoom intelligence với smart bounds fitting • Enhanced 3D GPS markers với pulsing effects • Professional route display với 6-layer rendering • Status-based parking icons với availability indicators • Production-ready build optimizations 🗺️ AUTO-ZOOM FEATURES: • Smart bounds fitting cho GPS + selected parking • Adaptive padding (50px) cho visual balance • Max zoom control (level 16) để tránh quá gần • Dynamic centering khi không có selection 🎨 ENHANCED VISUALS: • 3D GPS marker với multi-layer pulse effects • Advanced parking icons với status colors • Selection highlighting với animation • Dimming system cho non-selected items 🛣️ ROUTE SYSTEM: • OpenRouteService API integration • Multi-layer route rendering (glow, shadow, main, animated) • Real-time distance & duration calculation • Visual route info trong popup 📱 PRODUCTION READY: • SSR safe với dynamic imports • Build errors resolved • Global deployment via Vercel • Optimized performance 🌍 DEPLOYMENT: • Vercel: https://whatever-ctk2auuxr-phong12hexdockworks-projects.vercel.app • Bundle size: 22.8 kB optimized • Global CDN distribution • HTTPS enabled 💾 VERSION CONTROL: • MapView-v2.0.tsx backup created • MAPVIEW_VERSIONS.md documentation • Full version history tracking
119 lines
3.1 KiB
JavaScript
Executable File
119 lines
3.1 KiB
JavaScript
Executable File
'use strict';
|
|
|
|
var childProcess = require('child_process');
|
|
var spawn = childProcess.spawn;
|
|
var exec = childProcess.exec;
|
|
|
|
module.exports = function (pid, signal, callback) {
|
|
if (typeof signal === 'function' && callback === undefined) {
|
|
callback = signal;
|
|
signal = undefined;
|
|
}
|
|
|
|
pid = parseInt(pid);
|
|
if (Number.isNaN(pid)) {
|
|
if (callback) {
|
|
return callback(new Error("pid must be a number"));
|
|
} else {
|
|
throw new Error("pid must be a number");
|
|
}
|
|
}
|
|
|
|
var tree = {};
|
|
var pidsToProcess = {};
|
|
tree[pid] = [];
|
|
pidsToProcess[pid] = 1;
|
|
|
|
switch (process.platform) {
|
|
case 'win32':
|
|
exec('taskkill /pid ' + pid + ' /T /F', callback);
|
|
break;
|
|
case 'darwin':
|
|
buildProcessTree(pid, tree, pidsToProcess, function (parentPid) {
|
|
return spawn('pgrep', ['-P', parentPid]);
|
|
}, function () {
|
|
killAll(tree, signal, callback);
|
|
});
|
|
break;
|
|
// case 'sunos':
|
|
// buildProcessTreeSunOS(pid, tree, pidsToProcess, function () {
|
|
// killAll(tree, signal, callback);
|
|
// });
|
|
// break;
|
|
default: // Linux
|
|
buildProcessTree(pid, tree, pidsToProcess, function (parentPid) {
|
|
return spawn('ps', ['-o', 'pid', '--no-headers', '--ppid', parentPid]);
|
|
}, function () {
|
|
killAll(tree, signal, callback);
|
|
});
|
|
break;
|
|
}
|
|
};
|
|
|
|
function killAll (tree, signal, callback) {
|
|
var killed = {};
|
|
try {
|
|
Object.keys(tree).forEach(function (pid) {
|
|
tree[pid].forEach(function (pidpid) {
|
|
if (!killed[pidpid]) {
|
|
killPid(pidpid, signal);
|
|
killed[pidpid] = 1;
|
|
}
|
|
});
|
|
if (!killed[pid]) {
|
|
killPid(pid, signal);
|
|
killed[pid] = 1;
|
|
}
|
|
});
|
|
} catch (err) {
|
|
if (callback) {
|
|
return callback(err);
|
|
} else {
|
|
throw err;
|
|
}
|
|
}
|
|
if (callback) {
|
|
return callback();
|
|
}
|
|
}
|
|
|
|
function killPid(pid, signal) {
|
|
try {
|
|
process.kill(parseInt(pid, 10), signal);
|
|
}
|
|
catch (err) {
|
|
if (err.code !== 'ESRCH') throw err;
|
|
}
|
|
}
|
|
|
|
function buildProcessTree (parentPid, tree, pidsToProcess, spawnChildProcessesList, cb) {
|
|
var ps = spawnChildProcessesList(parentPid);
|
|
var allData = '';
|
|
ps.stdout.on('data', function (data) {
|
|
var data = data.toString('ascii');
|
|
allData += data;
|
|
});
|
|
|
|
var onClose = function (code) {
|
|
delete pidsToProcess[parentPid];
|
|
|
|
if (code != 0) {
|
|
// no more parent processes
|
|
if (Object.keys(pidsToProcess).length == 0) {
|
|
cb();
|
|
}
|
|
return;
|
|
}
|
|
|
|
allData.match(/\d+/g).forEach(function (pid) {
|
|
pid = parseInt(pid, 10);
|
|
tree[parentPid].push(pid);
|
|
tree[pid] = [];
|
|
pidsToProcess[pid] = 1;
|
|
buildProcessTree(pid, tree, pidsToProcess, spawnChildProcessesList, cb);
|
|
});
|
|
};
|
|
|
|
ps.on('close', onClose);
|
|
}
|