• Есть ли выгода от использования Golang вместо Node.js?

    @Abcdefgk
    Сразу узнаётся настоящий специалист.
  • Как сделать трансляцию в fluent-ffmpeg?

    @Abcdefgk
    Wasya UK, Я вот так отправил поток с веб-камеры на сервер
    ffmpeg -y -loglevel warning -f dshow -i video="WebCam SCB-0385N" -vf crop=640:480:136:0 -r 30 -s 962x388 -threads 2 -vcodec libx264 -f flv rtmp:///live/myStream.sdp

    некоторый прогресс, гы.
  • Как сделать трансляцию в fluent-ffmpeg?

    @Abcdefgk
    Wasya UK, Ну вот понятно, что не стыкуются аргументы -f flv и rtmp://localhost/live/STREAM_NAME
    flv - это ж фомат файла, как я понимаю (или нет?).
    Может, кто научит - было б интересно.
  • Как сделать трансляцию в fluent-ffmpeg?

    @Abcdefgk
    Wasya UK, Ну вот я делаю так
    const execFile = require('child_process').execFile;
    execFile('ffmpeg', ['-i', 'd:/A.mp4', 'd:/A.avi'], function() {
    	console.log('ok');
    });

    и всё нормально.
    Я почему и интересуюсь, насколько там всё сложнее?
  • Как сделать трансляцию в fluent-ffmpeg?

    @Abcdefgk
    Wasya UK, Вообще-то, child_process.execFile
    Но да, это.
  • Как сделать трансляцию в fluent-ffmpeg?

    @Abcdefgk
    А куда трансляцию-то? И чего "ок" получается в командной строке?
    Потому что запустить в дочернем процессе любую команду из CLI - плёвое дело.
  • Многопоточность в nodejs?

    @Abcdefgk
    Гы. В "настоящей многопоточности" процессов может быть, конечно, сколько угодно, но они же просто выстроятся в очереди к тем 4 ядрам, какие есть в наличии. Существуют даже специальные "решения" для балансировки этих очередей.
  • Почему не удаётся авторизоваться?

    @Abcdefgk
    Забирай, чистовой вариант.
    Файл server.js
    const express = require('express');           // For web server
    const bodyParser = require('body-parser');    // Receive JSON format
    const querystring = require('querystring');
    
    // Set up Express web server
    var app = express();
    app.use(bodyParser.json());
    // this line say of server, that we run server.js he open html file from public directory
    app.use(express.static(path.join(__dirname, 'public'))); // it was static(__ + 'public or www')
    
    // let's importing config.js file where are the configuration for dotenv/env and credentials_id/secret/url/PORT and scopes
    const config = require('./config');
    
    const PORT = config.credentials.PORT; // import from bim start.js
    const scopes = 'data:read data:write data:create bucket:create bucket:read';
    
    var indRouter = require('./routes/indRouter');
    indRouter(app);
    
    app.use((err, req, res, next) => {
      console.error(err);
      res.status(err.statusCode).json(err);
    });
    // This is for web server to start listening to port 3000
    app.listen(PORT, () => { 
      if (process.env.FORGE_CLIENT_ID == null || process.env.FORGE_CLIENT_SECRET == null) {
        console.log('*****************\nWARNING: Client ID & Client Secret not defined as environment variables.\n*****************');
      }
      console.log(`Server listening on port ${PORT}`);
    });

    В папке routes два файла.
    Файл indRouter.js
    var axiosRequest = require('./axiosRequest');
    var multer = require('multer');         // To handle file upload
    var upload = multer({ dest: 'tmp/' }); // Save file into local /tmp folder
    
    var Buffer = require('buffer').Buffer;
    String.prototype.toBase64 = function () {
        // Buffer is part of Node.js to enable interaction with octet streams in TCP streams, 
        // file system operations, and other contexts.
        return new Buffer(this).toString('base64');
    };
    
    module.exports = function(app) {
    	
    	app.get('/api/forge/oauth', function (req, res) {
    		axiosRequest.oauth(req, res);
    	});
    	
    	app.get('/api/forge/datamanagement/bucket/create', function (req, res) {
    		axiosRequest.bucketCreate(req, res);
    	});
    	
    	app.get('/api/forge/oauth/public', function (req, res) {
        // Limit public token to Viewer read only
        axiosRequest.publ(req, res);
    	});
    	
    	app.get('/api/forge/datamanagement/bucket/detail', function (req, res) {
    		axiosRequest.detail(req, res);
    	});
    	
    	app.post('/api/forge/datamanagement/bucket/upload', upload.single('fileToUpload'), function (req, res) {
    		axiosRequest.upload(req, res);
    	});
    	
    	app.get('/api/forge/modelderivative/:urn', function (req, res) {
    		axiosRequest.mod(req, res);
    	});
    	
    };

    Файл axiosRequest.js
    const Axios = require('axios');
    const querystring = require('querystring');
    const config = require('../config');
    
    // Prefix with your ID so the bucket key is unique across all buckets on all other accounts
    const bucketKey = config.credentials.client_id.toLowerCase() + '_my_first_full_viewer_bucket';
    const policyKey = 'transient'; // Expires in 24hr
    
    function oauth(req, res) {
    	Axios({
        method: 'POST',
        url: 'https://developer.api.autodesk.com/authentication/v1/authenticate',
        headers: {
          'content-type': 'application/x-www-form-urlencoded',
        },
        data: querystring.stringify({
          client_id: config.credentials.client_id,
          client_secret: config.credentials.client_secret,
          grant_type: 'client_credentials',
          scope: config.scopes.internal
        })
      })
    	.then(function (response) {
    		// Success
    		var access_token = response.data.access_token;
    		Axios.defaults.headers.common['Authorization'] = 'Bearer ' + access_token;
    		//console.log(response);
    		res.redirect('/api/forge/datamanagement/bucket/create');
    	})
    	.catch(function (error) {
    		// Failed
    		console.log(error);
    		res.send('Failed to authenticate');
    	});
    }
    
    function bucketCreate(req, res) {
    	Axios({
        method: 'POST',
        url: 'https://developer.api.autodesk.com/oss/v2/buckets',
        headers: {
          'content-type': 'application/json',
          //Authorization: 'Bearer ' + access_token
        },
        data: JSON.stringify({
          'bucketKey': bucketKey,
          'policyKey': policyKey
        })
      })
    	.then(function (response) {
    		// Success
    		//console.log(response);
    		res.redirect('/api/forge/datamanagement/bucket/detail');
    	})
    	.catch(function (error) {
    		if (error.response && error.response.status == 409) {
    				console.log('Bucket already exists, skip creation.');
    				res.redirect('/api/forge/datamanagement/bucket/detail');
    		}
    		// Failed
    		console.log(error);
    		res.send('Failed to create a new bucket');
    	});
    }
    
    function publ(req, res) {
    	Axios({
        method: 'POST',
        url: 'https://developer.api.autodesk.com/authentication/v1/authenticate',
        headers: {
          'content-type': 'application/x-www-form-urlencoded',
        },
        data: querystring.stringify({
    			client_id: config.credentials.client_id,
    			client_secret: config.credentials.client_secret,
    			grant_type: 'client_credentials',
    			scope: 'viewables:read'
        })
      })
    	.then(function (response) {
    		// Success
    		//console.log(response);
    		res.json({ access_token: response.data.access_token, expires_in: response.data.expires_in });
    	})
    	.catch(function (error) {
    		// Failed
    		console.log(error);
    		res.status(500).json(error);
    	});
    }
    
    function detail(req, res) {
    	Axios({
    		method: 'GET',
    		url: 'https://developer.api.autodesk.com/oss/v2/buckets/' + encodeURIComponent(bucketKey) + '/details',
    		//headers: {
    				//Authorization: 'Bearer ' + access_token
    		//}
      })
    	.then(function (response) {
    		// Success
    		console.log(response);
    		res.redirect('/upload.html');
    	})
    	.catch(function (error) {
    		// Failed
    		console.log(error);
    		res.send('Failed to verify the new bucket');
    	});
    }
    
    function upload(req, res) {
    	var fs = require('fs'); // Node.js File system for reading files
        fs.readFile(req.file.path, function (err, filecontent) {
    			Axios({
    				method: 'PUT',
    				url: 'https://developer.api.autodesk.com/oss/v2/buckets/' + encodeURIComponent(bucketKey) + '/objects/' + encodeURIComponent(req.file.originalname),
    				headers: {
    					//Authorization: 'Bearer ' + access_token,
    					'Content-Disposition': req.file.originalname,
    					'Content-Length': filecontent.length
    				},
    				data: filecontent
    			})
    			.then(function (response) {
    				// Success
    				console.log(response);
    				var urn = response.data.objectId.toBase64();
    				res.redirect('/api/forge/modelderivative/' + urn);
    			})
    			.catch(function (error) {
    				// Failed
    				console.log(error);
    				res.send('Failed to create a new object in the bucket');
    			});
        });
    }
    
    function mod(req, res) {
    	var urn = req.params.urn;
    	var format_type = 'svf';
    	var format_views = ['2d', '3d'];
    	Axios({
    		method: 'POST',
    		url: 'https://developer.api.autodesk.com/modelderivative/v2/designdata/job',
    		headers: {
    				'content-type': 'application/json',
    				//Authorization: 'Bearer ' + access_token
    		},
    		data: JSON.stringify({
    			'input': {
    				'urn': urn
    			},
    			'output': {
    				'formats': [
    					{
    						'type': format_type,
    						'views': format_views
    					}
    				]
    			}
    		})
    	})
    	.then(function (response) {
    		// Success
    		console.log(response);
    		res.redirect('/viewer.html?urn=' + urn);
    	})
    	.catch(function (error) {
    		// Failed
    		console.log(error);
    		res.send('Error at Model Derivative job.');
    	});
    }
    
    exports.oauth = oauth;
    exports.bucketCreate = bucketCreate;
    exports.publ = publ;
    exports.detail = detail;
    exports.upload = upload;
    exports.mod = mod;
  • Почему не удаётся авторизоваться?

    @Abcdefgk
    ТЫРЦ
    5c55c56fd99ba748684913.jpeg
    работает твоя машинка.
  • Как передать значение promise из одного файла в другую?

    @Abcdefgk
    Alisa94, Меня зобанели в этой помойке, давно. Я там не бываю.
  • Как передать значение promise из одного файла в другую?

    @Abcdefgk
    Alisa94, Ну и ладно. Я, кстате да, скобочки вызова функции забыл приписать. И что делает аргумент oauth в модуле тоже не понятно - тогда уж так, раз уж всем нравятся эти магические стрелочки
    module.exports = () => {...
    И куда ушёл полученный токен (зачем он был нужен?) я всё равно не понял.
    Да не важно.
  • Как передать значение promise из одного файла в другую?

    @Abcdefgk
    Alisa94, А что ты делаешь? Ничего же не понятно. Ну токен - дальше его куда? В server.js какая-то конструкция app.use с урлом - таких конструкций не бывает.
  • Как правильно использовать package-lock.json?

    @Abcdefgk
    MaxKorz, Да мы же как-то раньше жили без package-lock - и ничего, выжили. А какую чушь несёт npm я уж просто не помню - точно помню, что чушь. А как "работает инструмент"? - да так и работает: лезет, куда его не просят.
  • Как правильно использовать package-lock.json?

    @Abcdefgk
    А вот так правильно и использовать - удалять.
    Ну допустим. Есть очень хороший модуль (к примеру, nodemailer соглашается работать только с ним - и больше ни с кем), но npm его не устанавливает - просто несёт какую-то чушь и не устанавливает. Я устанавливаю его посредством yarn. Что после этого нужно сразу сделать? - Правильно, выкинуть package-lock.json, иначе, при любой следующей манипуляции с npm он этот установленный пакет выкинет. Ещё и отчитается об этом - "удалено 5 пакетов".
  • Как модифицировать пакет?

    @Abcdefgk
    Хе. При установке
    Downloading binary from https://github.com/zhangyuanwei/node-images/releases/download/v3.0.1/win32-ia32-57_binding.node
    Download complete

    А сам я попробовал (впервые в жызни) скомпилировать binding.node - не выходит каменный цветок. Что-то, вроде, начинает билдить - но ошибка, чего-то с node-gyp не так.
  • Как модифицировать пакет?

    @Abcdefgk
    Теоретически - правильно сделать так.
    1. Зайти в репозиторий модуля на Гитхабе и сделать с него форк - к себе на Гитхабе.
    2. Клонировать его себе (от себя) в компьютер, сделать изменения и закоммитить их обратно.
    3. Установить исправленный пакет обычным способом с адреса своего, исправленного репозитория - npm install https://github.com/...
  • Как организовать комнаты в socket.io?

    @Abcdefgk
    Роман, Хе. Ну да, "комната" - это пустая абстракция. Никаких комнат нет. Есть сокеты - каждый со своим id и его объектом, в который просто заносится его "приписное свидетельство" к абстрактным комнатам, нэймспейсам (если он к ним, вообще, приписан) и прочая бла-бла-бла.
  • Как организовать комнаты в socket.io?

    @Abcdefgk
    Роман, Если честно, то тут нет никакой "организации". Клиент делает сообщение со случайным именем комнаты, сервер делает join этого сокета к комнате (вписывает её имя в объект сокета), и если об этом никому не сообщать (не "приглашать"), то никто туда и не сможет попасть - просто потому, что никто этого имени не знает. Тут нет вопроса, а есть только банальная лень.
  • Как организовать комнаты в socket.io?

    @Abcdefgk
    Роман, Для молитв, нопремер. Для общения с богом.
  • Нужна ли сборка серверной части на node.js?

    @Abcdefgk
    "или на чём там сейчас нода работает" - сейчас на V8, и раньше на V8, и вообще - на V8.
    А у тебя есть другие варианты?