initial commit
This commit is contained in:
parent
dffa37b3ad
commit
2d16c43325
2
.gitattributes
vendored
2
.gitattributes
vendored
@ -1,2 +0,0 @@
|
|||||||
# Auto detect text files and perform LF normalization
|
|
||||||
* text=auto
|
|
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
chrome_data
|
||||||
|
node_modules
|
4
LICENSE
4
LICENSE
@ -1,6 +1,6 @@
|
|||||||
MIT License
|
MIT License
|
||||||
|
|
||||||
Copyright (c) 2022 CanadaHonk
|
Copyright (c) 2022 OpenAsar
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
@ -18,4 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
SOFTWARE.
|
SOFTWARE.
|
13
README.md
13
README.md
@ -1,2 +1,11 @@
|
|||||||
# gluon
|
# Gluon
|
||||||
Not an Electron alternative
|
*Not* an Electron alternative. Uses system installed Chromium and Node.JS. ***VERY*** early and probably never finished/production ready.
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
## "Comparison"
|
||||||
|
| Part | Electron | Gluon |
|
||||||
|
| ----- | -------- | ----- |
|
||||||
|
| Frontend | Self-contained Chromium | System Installed Chromium |
|
||||||
|
| Backend | Self-contained Node.JS | System Installed Node.JS |
|
||||||
|
| IPC | Electron's Internal API | Gluon's API via CDP |
|
11
glucord/README.md
Normal file
11
glucord/README.md
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
# Glucord
|
||||||
|
Example/demo of Gluon, a minimal Discord client using system-installed Chrome/Node.
|
||||||
|
|
||||||
|
> **Info** |
|
||||||
|
> Gluon is currently **Windows only**.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
1. Have Chrome Stable/Canary installed
|
||||||
|
1. Clone the Gluon repo
|
||||||
|
2. `npm install`
|
||||||
|
3. `node glucord` (with `--canary` if using Chrome Canary)
|
29
glucord/index.js
Normal file
29
glucord/index.js
Normal file
File diff suppressed because one or more lines are too long
6
package.json
Normal file
6
package.json
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"type": "module",
|
||||||
|
"dependencies": {
|
||||||
|
"chrome-remote-interface": "^0.31.3"
|
||||||
|
}
|
||||||
|
}
|
70
src/index.js
Normal file
70
src/index.js
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
const rgb = (r, g, b, msg) => `\x1b[38;2;${r};${g};${b}m${msg}\x1b[0m`;
|
||||||
|
const log = (...args) => console.log(`[${rgb(88, 101, 242, 'Gluon')}]`, ...args);
|
||||||
|
|
||||||
|
const presets = { // Presets from OpenAsar
|
||||||
|
'base': '--autoplay-policy=no-user-gesture-required --disable-features=WinRetrieveSuggestionsOnlyOnDemand,HardwareMediaKeyHandling,MediaSessionService', // Base Discord
|
||||||
|
'perf': `--enable-gpu-rasterization --enable-zero-copy --ignore-gpu-blocklist --enable-hardware-overlays=single-fullscreen,single-on-top,underlay --enable-features=EnableDrDc,CanvasOopRasterization,BackForwardCache:TimeToLiveInBackForwardCacheInSeconds/300/should_ignore_blocklists/true/enable_same_site/true,ThrottleDisplayNoneAndVisibilityHiddenCrossOriginIframes,UseSkiaRenderer,WebAssemblyLazyCompilation --disable-features=Vulkan --force_high_performance_gpu`, // Performance
|
||||||
|
'battery': '--enable-features=TurnOffStreamingMediaCachingOnBattery --force_low_power_gpu', // Known to have better battery life for Chromium?
|
||||||
|
'memory': '--in-process-gpu --js-flags="--lite-mode --optimize_for_size --wasm_opt --wasm_lazy_compilation --wasm_lazy_validation --always_compact" --renderer-process-limit=2 --enable-features=QuickIntensiveWakeUpThrottlingAfterLoading' // Less (?) memory usage
|
||||||
|
};
|
||||||
|
|
||||||
|
import { exec } from 'child_process';
|
||||||
|
import { join, dirname } from 'path';
|
||||||
|
|
||||||
|
import { fileURLToPath } from 'url';
|
||||||
|
|
||||||
|
const __filename = fileURLToPath(import.meta.url);
|
||||||
|
const __dirname = dirname(__filename);
|
||||||
|
|
||||||
|
import CDP from 'chrome-remote-interface';
|
||||||
|
|
||||||
|
|
||||||
|
const findChromePath = () => {
|
||||||
|
const whichChrome = process.argv.includes('--canary') ? 'canary' : 'stable';
|
||||||
|
|
||||||
|
switch (whichChrome) {
|
||||||
|
case 'stable': return join(process.env.PROGRAMFILES, 'Google', 'Chrome', 'Application', 'chrome.exe');
|
||||||
|
case 'canary': return join(process.env.LOCALAPPDATA, 'Google', 'Chrome SxS', 'Application', 'chrome.exe');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const getDataPath = () => join(__dirname, '..', 'chrome_data');
|
||||||
|
|
||||||
|
|
||||||
|
const startChrome = url => new Promise(res => {
|
||||||
|
const dataPath = getDataPath();
|
||||||
|
const chromePath = findChromePath();
|
||||||
|
|
||||||
|
log('chrome path:', chromePath);
|
||||||
|
log('data path:', dataPath);
|
||||||
|
|
||||||
|
const debugPort = 9222;
|
||||||
|
|
||||||
|
exec(`"${chromePath}" --app=${url} --remote-debugging-port=${debugPort} --user-data-dir="${dataPath}" --new-window --disable-extensions --disable-default-apps --disable-breakpad --disable-crashpad --disable-background-networking --disable-domain-reliability --disable-component-update --disable-sync --disable-features=AutofillServerCommunication ${presets.perf}`, (err, stdout, stderr) => {
|
||||||
|
log(err, stdout, stderr);
|
||||||
|
});
|
||||||
|
|
||||||
|
setTimeout(() => res(debugPort), 500);
|
||||||
|
});
|
||||||
|
|
||||||
|
export const open = async (url, onLoad = () => {}) => {
|
||||||
|
log('starting chrome...');
|
||||||
|
|
||||||
|
const debugPort = await startChrome(url);
|
||||||
|
log('connecting to CDP...');
|
||||||
|
|
||||||
|
const { Runtime, Page } = await CDP({ port: debugPort });
|
||||||
|
|
||||||
|
// const run = async js => (await Runtime.evaluate({ expression: js })).result.value;
|
||||||
|
const run = async js => log(await Runtime.evaluate({ expression: js }));
|
||||||
|
|
||||||
|
const toRun = `(() => {
|
||||||
|
if (window.self !== window.top) return; // inside frame
|
||||||
|
(${onLoad})();
|
||||||
|
})()`;
|
||||||
|
|
||||||
|
run(toRun);
|
||||||
|
|
||||||
|
await Page.enable();
|
||||||
|
await Page.addScriptToEvaluateOnNewDocument({ source: toRun });
|
||||||
|
};
|
Loading…
x
Reference in New Issue
Block a user