Rust implementation of NextGraph, a Decentralized and local-first web 3.0 ecosystem
				https://nextgraph.org
			
			
		
		byzantine-fault-tolerancecrdtsdappsdecentralizede2eeeventual-consistencyjson-ldlocal-firstmarkdownocapoffline-firstp2pp2p-networkprivacy-protectionrdfrich-text-editorself-hostedsemantic-websparqlweb3collaboration
		
		
		
		
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							207 lines
						
					
					
						
							5.3 KiB
						
					
					
				
			
		
		
	
	
							207 lines
						
					
					
						
							5.3 KiB
						
					
					
				| // Copyright (c) 2022-2025 Niko Bonnieure, Par le Peuple, NextGraph.org developers
 | |
| // All rights reserved.
 | |
| // Licensed under the Apache License, Version 2.0
 | |
| // <LICENSE-APACHE2 or http://www.apache.org/licenses/LICENSE-2.0>
 | |
| // or the MIT license <LICENSE-MIT or http://opensource.org/licenses/MIT>,
 | |
| // at your option. All files in the project carrying such
 | |
| // notice may not be copied, modified, or distributed except
 | |
| // according to those terms.
 | |
| 
 | |
| 
 | |
| const macNameMap = new Map([
 | |
| 	[23, ['Sonoma', '14']],
 | |
| 	[22, ['Ventura', '13']],
 | |
| 	[21, ['Monterey', '12']],
 | |
| 	[20, ['Big Sur', '11']],
 | |
| 	[19, ['Catalina', '10.15']],
 | |
| 	[18, ['Mojave', '10.14']],
 | |
| 	[17, ['High Sierra', '10.13']],
 | |
| 	[16, ['Sierra', '10.12']],
 | |
| 	[15, ['El Capitan', '10.11']],
 | |
| 	[14, ['Yosemite', '10.10']],
 | |
| 	[13, ['Mavericks', '10.9']],
 | |
| 	[12, ['Mountain Lion', '10.8']],
 | |
| 	[11, ['Lion', '10.7']],
 | |
| 	[10, ['Snow Leopard', '10.6']],
 | |
| 	[9, ['Leopard', '10.5']],
 | |
| 	[8, ['Tiger', '10.4']],
 | |
| 	[7, ['Panther', '10.3']],
 | |
| 	[6, ['Jaguar', '10.2']],
 | |
| 	[5, ['Puma', '10.1']],
 | |
| ]);
 | |
| 
 | |
| function macosRelease(release) {
 | |
|   let split = (release).split('.');
 | |
| 	rel = Number(split[0]);
 | |
| 	let [name, version] = macNameMap.get(rel) || ['Unknown', release];
 | |
|   if (name!='Unknown') {
 | |
|     if (split.length>1) version += '.'+split[1];
 | |
|     //if (split.length>2 && split[2]) version += '.'+split[2];
 | |
|   }
 | |
| 	return {
 | |
|     name: "macOS",
 | |
| 		versionName: name,
 | |
| 		version,
 | |
|     release
 | |
| 	};
 | |
| }
 | |
| 
 | |
| const winNames = new Map([
 | |
| 	['10.0.2', '11'], // It's unclear whether future Windows 11 versions will use this version scheme: https://github.com/sindresorhus/windows-release/pull/26/files#r744945281
 | |
|   ['10.0.22', 'Server 2022'],
 | |
| 	['10.0', '10 or Server 2016/2019'],
 | |
| 	['6.3', '8.1 or Server 2012 R2'],
 | |
| 	['6.2', '8 or Server 2012'],
 | |
| 	['6.1', '7 or Server 2008 R2'],
 | |
| 	['6.0', 'Vista or Server 2008'],
 | |
| 	['5.2', 'Server 2003'],
 | |
| 	['5.1', 'XP'],
 | |
| 	['5.0', '2000'],
 | |
| 	['4.90', 'ME'],
 | |
| 	['4.10', '98'],
 | |
| 	['4.03', '95'],
 | |
| 	['4.00', '95'],
 | |
|   ['3.00', 'NT'],
 | |
| ]);
 | |
| 
 | |
| function windowsRelease(release) {
 | |
| 	const version = /(\d+\.\d+)(?:\.(\d+))?/.exec(release);
 | |
| 
 | |
| 	let ver = version[1] || '';
 | |
| 	const build = version[2] || '';
 | |
| 
 | |
|   if (ver.startsWith('3.')) {
 | |
|     ver = '3.00';
 | |
|   }
 | |
|   if (ver === '10.0' && build.startsWith('20348')) {
 | |
|     // Windows Server 2022
 | |
|     ver = '10.0.22';
 | |
|   } else if (ver === '10.0' && build.startsWith('2')) {
 | |
|     // Windows 11
 | |
| 		ver = '10.0.2';
 | |
| 	}
 | |
| 
 | |
| 	return {
 | |
|     name: "Windows",
 | |
|     versionName: winNames.get(ver),
 | |
|     version: build,
 | |
|     release
 | |
|   };
 | |
| }
 | |
| 
 | |
| function osName(platform, release) {
 | |
|   if (platform === 'darwin') {
 | |
|     return release? macosRelease(release) : {name: "macOS"};
 | |
|   }
 | |
| 
 | |
|   if (platform === 'linux') {
 | |
|     id = release ? release.replace(/^(\d+\.\d+).*/, '$1') : '';
 | |
|     return {name:'Linux', version: id || release, release};
 | |
|   }
 | |
| 
 | |
|   if (platform === 'win32') {
 | |
|     return release ? windowsRelease(release) : {name: "Windows"};
 | |
|   }
 | |
|   if (platform === 'aix') { platform = 'AIX'; }
 | |
|   else if (platform === 'freebsd') { platform = 'FreeBSD'; }
 | |
|   else if (platform === 'openbsd') { platform = 'OpenBSD'; }
 | |
|   else if (platform === 'android') { platform = 'Android'; }
 | |
|   else if (platform === 'sunos') { platform = 'SunOS'; }
 | |
|   return {name:platform, version:release};
 | |
| }
 | |
| module.exports.version = function () {
 | |
|   return require('../../../../package.json').version;
 | |
| }
 | |
| 
 | |
| module.exports.get_env_vars = function () {
 | |
| 
 | |
|   return {
 | |
|     server_addr: process.env.NG_HEADLESS_SERVER_ADDR,
 | |
|     server_peer_id: process.env.NG_HEADLESS_SERVER_PEER_ID,
 | |
|     client_peer_key: process.env.NG_HEADLESS_CLIENT_PEER_KEY,
 | |
|     admin_user_key: process.env.NG_HEADLESS_ADMIN_USER_KEY
 | |
|   };
 | |
| }
 | |
| 
 | |
| const path = require('path'); 
 | |
| const fs = require('fs');
 | |
| 
 | |
| module.exports.upload_file = async ( filename, callback, end) => {
 | |
|   let readStream = fs.createReadStream(filename,{ highWaterMark: 1048564 });
 | |
| 
 | |
|   return new Promise(async (resolve, reject) => {
 | |
|     readStream.on('data', async function(chunk) {
 | |
|       try {
 | |
|         let ret = await callback(chunk);
 | |
|       }
 | |
|       catch (e) {
 | |
|         readStream.destroy();
 | |
|         reject(e);
 | |
|       }
 | |
|     }).on('end', async function() {
 | |
|         let reference = await end(path.basename(filename));  
 | |
|         resolve(reference);
 | |
|     }).on('error', async function(e) {
 | |
|       reject(e.message);
 | |
| 
 | |
|   });
 | |
|   })
 | |
| }
 | |
| 
 | |
| 
 | |
| module.exports.client_details = function () {
 | |
|   const process = require('process');
 | |
|   const osnode = require('os');
 | |
|   let arch = osnode.machine? osnode.machine() : process.arch;
 | |
|   if (arch=="ia32") {arch="x86"}
 | |
|   else if (arch=="x64") {arch="x86_64"}
 | |
|   else if (arch=="i386") {arch="x86"}
 | |
|   else if (arch=="i686") {arch="x86"}
 | |
|   else if (arch=="amd64") {arch="x86_64"}
 | |
|   else if (arch=="arm64") {arch="aarch64"}
 | |
|   let os = osName(osnode.platform(),osnode.release());
 | |
|   if (osnode.version) os.uname = osnode.version();
 | |
|   os.type = osnode.type();
 | |
| 
 | |
|   return JSON.stringify({
 | |
|     platform: { type: "server", arch },
 | |
|     os,
 | |
|     engine: {
 | |
|       name: "nodejs",
 | |
|       version: process.version,
 | |
|       arch : process.arch,
 | |
|       machine: osnode.machine? osnode.machine() : undefined,
 | |
|       versions: process.versions
 | |
|     }
 | |
|   });
 | |
| };
 | |
| 
 | |
| 
 | |
| module.exports.is_browser = function() {
 | |
|     return false;
 | |
| }
 | |
| 
 | |
| 
 | |
| module.exports.session_save = function(key,value) {
 | |
|     
 | |
| }
 | |
| 
 | |
| module.exports.storage_clear = function() {
 | |
|     
 | |
| }
 | |
| 
 | |
| module.exports.session_get = function(key) {
 | |
|     
 | |
| }
 | |
| 
 | |
| module.exports.session_remove = function(key) {
 | |
|     
 | |
| }
 | |
| 
 | |
| module.exports.local_save = function(key,value) {
 | |
|     
 | |
| }
 | |
| 
 | |
| module.exports.local_get = function(key) {
 | |
|     
 | |
| }
 | |
| 
 |