LINUX.ORG.RU

Прочитать с диска файл, рас(паковать/шифровать), закинуть в DOM

 , ,


0

1

Хочу немного прикрыть быдлокод своего node-webkit (нода в одном флаконе с хромиумом) приложения, ресурсы которого — один большой html-файл.

Пока хожу вокруг да около с такими вопросами:
1. как (чем) скрыть (испоганить) ресурсы от просмотра в браузере и текстовом редакторе?
Base64 подошла бы, но с наскоку не вышло, что-то там с кодировками. Может XOR? Или какой-то примитивный компрессор на JS, лёгкий декомпрессор которого можно было бы вставить в страницу отображающую процесс загрузки основного ресурсного файла.

2. как яваскриптом прочитать файл получая какой-то статус прогресса его загрузки?
Примитивное решение навскидку - сплит файла ресурсов на, скажем, 5 файлов одинакового размера. И их поэтапная загрузка - 20% 40% 60% и т.д.

Тег node.js — лишний, она не используется, но может быть она как раз и пригодится для решения поставленных задач?


Тег javascript лишний - язык не чииает файлы, кури апи своей среды

Kalashnikov ★★★
()

Вроде нода и читает файл чанками, тупо смотри размер файла, смотри размер чанка, записывай, на сколько байт у тебя кусков набралось, на основе этого и вычисляй прогресс загрузки.

drakmail ★★★★
()

дело в том что когда браузер открывает страницу он восстанавливает структуру твоих ресурсов, как бы испоганены они ни были, в отладчике можно посмотреть код (pretty print флаг)

trashymichael ★★★
()

в ноде у тебя все асинхронное. создаешь прогресс-бар, вызываешь фунцию чтения со своим колбеком, получая чанки подвигаешь из колбека ползунок

trashymichael ★★★
()
Ответ на: комментарий от trashymichael

дело в том что когда браузер открывает страницу он восстанавливает структуру твоих ресурсов, как бы испоганены они ни были, в отладчике можно посмотреть код (pretty print флаг)

Пофиг. Во первых devtools будут отключкены. Во вторых проверка на выполнение в среде node-webkit. В третьих - особо скрывать мне нечего, просто хочу, в первую очередь, обезопасится от открытия .html-файла на прямую и получения черти-чего.

в ноде у тебя все асинхронное. создаешь прогресс-бар, вызываешь фунцию чтения со своим колбеком, получая чанки подвигаешь из колбека ползунок

Спасибо! Правильное направление задал. В ноде и zlib, которым ресурсы пожму.

Слушай, а коллбэк выполняется точно по завершениии... по возврату из.. кхм, родительской функции? Я вот 100 раз вызываю fs.read() с каллбэком обновляющим прогрессбар, так прогресс пролетает мгновенно! Такое впечаптление, что fs.read() мнгновенно возвращается, выполняя коллбэк, но актуальное чтение файла откладывается.

Этот асинхронизм сводит меня с ума!

varchar
() автор топика
Ответ на: комментарий от varchar

скорее всего там буферизация, но если файл маленький то и считывается он за одну порцию

trashymichael ★★★
()
Ответ на: комментарий от varchar

уточни в документации, там могут быть разные колбеки, мне сейчас не до этого, но вообще по опыту скажу что вотнкуть прогресс иногда просто некуда, может сделай вейтер и все?

trashymichael ★★★
()
Ответ на: комментарий от trashymichael

может сделай вейтер и все?

А не подскажешь, что за вейтер и куда б его воткнуть. Таки нужны задержки, мелкий файл читается мгновенно. На больших файлах (сотни мегабайт) в первый раз или после сброса кеша, вроде адекватно.

Да, говнокод и коллбэк хелл...

function loadRes () {
	var fs = require( "fs" );
	var f = "body-panel.res";

	fs.open( f, "r", function( err, fd ) {
		progressBar.show();
		if( err ) throw err;
		fs.fstat( fd, function( err, stats ) {
			var bufferSize = stats.size;
			console.log( "bufferSize: " + bufferSize );
			var chunkSize = Math.ceil( bufferSize / 100 );
			console.log( "chunkSize: " + chunkSize );
			var buffer = new Buffer( bufferSize );
			var percentRead = 0;
			var bytesRead = 0;

			while ( bytesRead < bufferSize ) {
				if (( bytesRead + chunkSize ) > bufferSize ) {
					chunkSize = ( bufferSize - bytesRead );
				};
				
				fs.read( fd, buffer, bytesRead, chunkSize, bytesRead, function( err, byt, buf ) {
						percentRead++;
						progressBar.update( percentRead );
						console.log( percentRead );
						if ( percentRead == 100 ) {
							fs.close( fd );
							console.log( bytesRead + " bytesRead" );
							//fs.writeFile('buffer.dump', buffer);
							var zlib = require( "zlib" );
							zlib.inflateRaw( buffer, function( err, buffer ) {
								$( buffer.toString( "utf-8" ) ).appendTo( "#body-panel" );
							});
							setTimeout( function() { progressBar.stop(); }, 1000 );
					};
				});
				bytesRead += chunkSize;
			};
		});
	});
};

varchar
() автор топика
Ответ на: комментарий от varchar

просто крутилку «загрузка» а не полосу прогресса, ты хочешь реализации слишком низкоуровневой задачи на слишком высоком уровне, ты можешь делать прогресс по ресурсам если их много, поштучно, но не по каждому байту каждого файла: буферизация

trashymichael ★★★
()
Последнее исправление: trashymichael (всего исправлений: 1)
Ответ на: комментарий от trashymichael

просто крутилку «загрузка» а не полосу прогресса

А, это. Уверен, что прогресс больше нравится больштнству пользователей. Придаёт программе солидности. В отличии от вэйтера не вызывает, без оснований, таких мыслей как — «Действительно ли сейчас что-то грузится? Или зависло/оборвалось? Гляну-ка на индикатор ЖД/сети».

В остальном всё просто, - а почему бы и нет? Осталось добавить задержки и всё будет клёво, красиво и максимально правдоподобно.

В конце проблема и её решение приведшее меня в восторг. После замены:

$( buffer.toString( "utf-8" ) ).appendTo( "#body-panel" );
на:
document.getElementById( "body-panel" ).innerHTML = buffer.toString( "utf-8" );
чтобы jQuery вместе с прочими ресурсами запаковать. Наткнулся на запрет на выполнение скриптов добавленных посредством .innerHTML. Решение-обход через картинку :) со stackoverflow - сделало день.

Вот версия допиленная мной для оживления всех скриптов заключённых в блоки с классом «script»:

<img style="display: none;" src="#" onerror='var e = document.getElementsByClassName( "script" ); for( var i = 0; i < e.length; i++ ) { var s = e[i].getElementsByTagName( "script" ); for( var j = 0; j < s.length; j++ ) { eval( s[j].text ); }; }; this.parentNode.removeChild( this );'/>

varchar
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.