Node.JS - рдЕрдиреНрдп HTTP рд╕реНрд░реЛрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рдгрд╛рдореА рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ

рдЕрдХреНрд╕рд░, Node.JS рдкрд░ рд╕рд░реНрд╡рд░ рдПрдЧреНрд░реАрдЧреЗрдЯрд░ рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдЬреЛ рдЕрдиреНрдп HTTP рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рдЧрддрд┐рд╢реАрд▓ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рдбреЗрдЯрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдПрдХрддреНрд░рд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдмрдирд╛рддреЗ рд╣реИрдВред



рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╛рд╣рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдЬреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдореВрд▓ рд╕реЗрдЯ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, ImageMagick рдпрд╛ ffmpeg рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ)ред



рдПрдХ nginx рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдмреИрдХрдПрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рд╡рд╛рд▓реЗ HTTP рд╕рд░реНрд╡рд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдФрд░ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП CSS рд╕реНрдкреНрд░рд╛рдЗрдЯреНрд╕ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред



рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкрдврд╝реЗрдВ / рд▓рд┐рдЦреЗрдВ



рдХреНрд▓рд╛рдЗрдВрдЯ рдХрдиреЗрдХреНрд╢рди рдкреВрд▓


Node.JS рдореЗрдВ HTTP рдХреНрд▓рд╛рдЗрдВрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдПрдХ рдЯреАрд╕реАрдкреА рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдмрджрд▓реЗ рдореЗрдВ рдЕрдиреБрд░реЛрдз рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдПрдХ рдХреНрд▓рд╛рдЗрдВрдЯ рдкреВрд▓ (рдкреНрд░рддреНрдпреЗрдХ рдЫреАрдВрдХ рдХреЗ рд▓рд┐рдП рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдиреЗ рдФрд░ рдПрдХ рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмреАрдЪ рдПрдХ рд╡реНрдпрд╛рдкрд╛рд░-рдмрдВрдж) рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ)ред



рд╣рдо рдЗрд╕ рдзрд╛рд░рдгрд╛ рд╕реЗ рд╕рдмрд╕реЗ рдЖрджрд┐рдо рдкреВрд▓ рдмрдирд╛рдПрдВрдЧреЗ рдХрд┐ рд╣рдо example.com рдкрд░ рд╕рднреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрддреЗ рд╣реИрдВ: 80ред



var ClientPool = function ()

{

this .poolSize = 0;

this .freeClients = [];

};



ClientPool.prototype.needClient = function ()

{

this .freeClients.push( this .newClient());

this .poolSize++;

};



ClientPool.prototype.newClient = function ()

{

return http.createClient(80, 'example.com' );

};



ClientPool.prototype.request = function (method, url, headers)

{

if ( this .freeClients.length == 0)

{

this .needClient();

}

var client = this .freeClients.pop();

var req = client.request(method, url, headers);

return req;

};



ClientPool.prototype.returnToPool = function (client)

{

this .freeClients.push(client);

};



var clientPool = new ClientPool();



* This source code was highlighted with Source Code Highlighter .








рдпрджрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╣реИ, рддреЛ рдЖрдк рдХрдИ рдореЗрдЬрдмрд╛рдиреЛрдВ рдХреЛ рдХрдиреЗрдХреНрд╢рди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдХрд░ рдкреВрд▓ рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рдКрдкрд░ рд╕реЗ рдкреВрд▓ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рд╕реАрдорд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдХрдо рд╕реЗ рдХрдо рд▓реЛрдб рдХрд┐рдП рдЧрдП рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдмрд┐рдЦреЗрд░рддреЗ рд╣реБрдП)ред рдореИрдВ рдЗрд╕реЗ рдЕрдкрдиреЗ рд╣реЛрдорд╡рд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЫреЛрдбрд╝ рджреВрдБрдЧрд╛ред



рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдФрд░ рд╕рд╣реЗрдЬрдирд╛


рд╣рдореЗрдВ HTTP рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдФрд░ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреА рдЦрд╝рд╛рд╕рд┐рдпрдд рдпрд╣ рд╣реИ рдХрд┐ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХреА рджреЛ рдзрд╛рд░рд╛рдУрдВ рдХреЛ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдореВрд▓ HTTP рд╕реНрдЯреНрд░реАрдо рдХреЛ рдкрдврд╝рдирд╛, рдФрд░ рдПрдХ рдлрд╛рдЗрд▓ рдкрд░ рд▓рд┐рдЦрдирд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдмрдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЗрд╡рд▓ рд╕рднреА рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред



рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ:



var getFile = function (url, path, callback)

{

fs.open(path, 'w' , 0600, function (err, fd)

{

if (err)

{

callback(err);

return ;

}

var request = clientPool.request( 'GET' , url, { 'Host' : 'example.com' });

request.on( 'response' , function (sourceResponse)

{

var statusCode = parseInt(sourceResponse.statusCode);

if (statusCode < 200 || statusCode > 299)

{

sourceResponse.on( 'end' , function ()

{

clientPool.returnToPool(sourceResponse.client);

});

callback( 'Bad status code' );

return ;

}



var writeErr = null ;

var writesPending = 0;

var sourceEnded = false ;



var checkPendingCallback = function ()

{

if (!sourceEnded || writesPending > 0)

{

return ;

}

fs.close(fd, function (err)

{

err = err ? err : writeErr;

if (err)

{

removeFile(path);

callback(err);

return ;

}

// No errors and all written

callback( null );

});

};



var position = 0;

sourceResponse.on( 'data' , function (chunk)

{

writesPending++;

fs.write(fd, chunk, 0, chunk.length, position, function (err, written)

{

writesPending--;

if (err)

{

writeErr = err;

}

checkPendingCallback();

});

position += chunk.length;

});



sourceResponse.on( 'end' , function ()

{

sourceEnded = true ;

checkPendingCallback();

clientPool.returnToPool(sourceResponse.client);

});

});

request.end();

});

};




* This source code was highlighted with Source Code Highlighter .








рдирдВрдЧреЗрдХреНрд╕ рдФрд░ рд╣рдорд╛рд░реЗ рд╕рд░реНрд╡рд░ рдХреЗ рдмреАрдЪ рдмрд╛рддрдЪреАрдд рдХрд╛ рддрдВрддреНрд░





рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рд╕реНрдкреНрд░рд╛рдЗрдЯ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдкреНрд░рд╛рдЗрдЯреНрд╕ рдХреЛ рдмрдЪрд╛рдПрдВрдЧреЗ, рдЙрдирдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рдкреБрд░рд╛рдиреЗ рдХреЛ рд╣рдЯрд╛рдХрд░, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддрд╛рдЬ рджреНрд╡рд╛рд░рд╛ред рдпрджрд┐ рдлрд╝рд╛рдЗрд▓ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ, рддреЛ nginx try_files рдирд┐рдпрдо рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЙрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧрд╛ред рдЕрдиреНрдпрдерд╛, рдЕрдиреБрд░реЛрдз рдХреЛ рд╣рдорд╛рд░реЗ рдмреИрдХрдПрдВрдб рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рд╡рд╛рдВрдЫрд┐рдд рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдЧрд╛, рдФрд░ рдПрдХреНрд╕-рдПрдХреНрд╕реЗрд▓-рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдиреЗрдЧреНрдиреЗрдХреНрд╕ рдХреЛ рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд╛рди рд╕реЗ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реЗрдЧрд╛, рдЬреЛ рдЙрд╕реА рднреМрддрд┐рдХ рд╕реНрдерд╛рди рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред



рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, nginx рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:

     рдЕрдкрд╕реНрдЯреНрд░реАрдо рд╕реНрдкреНрд░рд╛рдЗрдЯ_рдЬреЗрди {
         рд╕рд░реНрд╡рд░ 127.0.0.1:14239;
     }

     рд╕реНрдерд╛рди / out_folder / {
         рдЙрдкрдирд╛рдо / var / sprite-gen / out_folder /;
         рдЖрдВрддрд░рд┐рдХ;
     }

     рд╕реНрдерд╛рди / {
         рдЙрдкрдирд╛рдо / var / sprite-gen / out_folder /;
         try_files $ uri @transcoder;
     }

     рд╕реНрдерд╛рди @transcoder {
         рдкреНрд░реЙрдХреНрд╕реА_рдкрд╛рд╕ http: // sprite_gen;
     }




рдпрд╣ рдЙрджрд╛рд╣рд░рдг рд╕рд╣реА рд╣реЛрдиреЗ рдХрд╛ рджрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХреА рдорджрдж рд╕реЗ рдмрдбрд╝реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ, рдХреИрд╢рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рджреЗрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИред



рдпрджрд┐ рдлрд╛рдЗрд▓реЗрдВ рдЫреЛрдЯреА рд╣реИрдВ, рдФрд░ рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИ рдХрд┐ рд╣рдо рд▓рд╛рдкрддрд╛ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрдкреНрд░рд╛рдЗрдЯреНрд╕ рдХреЗ рдЙрддреНрдерд╛рди рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░реЗрдВ, рддреЛ рдпрд╣ nginx рддрд░рдл рдХреИрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝реЙрд░реНрдо рдкреНрд░реЙрдХреНрд╕реА_рдиреЛ_рдХреЗрдЪ $ http_pragma рдХреЗ рдПрдХ рдирд┐рдпрдо рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рд╕рд╣реА рд╣реИред



рд╣рдореЗрдВ рдХреБрдЫ рдлрд╛рдЗрд▓реЗрдВ рдорд┐рд▓рддреА рд╣реИрдВ





рдпрд╣рд╛рдБ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ, рд╕реНрдкреНрд░рд╛рдЗрдЯ рдмрдирд╛рдиреЗ рдФрд░ рдирдЧреНрдиреЗрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ HTTP рд╕рд░реНрд╡рд░ рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рд╣реИред



var outPath = '' ; //

var imageUrls = []; // .

var images = []; // .



var waitCounter = images.length;

var needCache = true ; // , ,

var handlePart = function (url, pth)

{

getFile(url, pth, function (err)

{

waitCounter--;

if (err)

{

removeFile(pth);

var pth = placeholder_path;

needCache = false ;

}

if (waitCounter == 0)

{

makeSprite(images, outPath, function (err)

{

if (err)

{

response.writeHead(500, {

'Content-Type' : 'text/plain' ,

});

response.end( 'Trouble' );

return ;

}

var headers = {

'Content-Type' : 'image/png' ,

'X-Accel-Redirect' : outUrl

};

if (needCache)

{

headers[ 'Cache-Control' ] = 'max-age:315360000, public' ;

headers[ 'Expires' ] = 'Thu, 31 Dec 2037 23:55:55 GMT' ;

}

else

{

headers[ 'Cache-Control' ] = 'no-cache, no-store' ;

headers[ 'Pragma' ] = 'no-cache' ;

}

response.writeHead(200, headers);

response.end();

});

}

});

};



for ( var i = 0; i < imageUrls.length)

{

handlePart(imageUrls[i], images[i]);

}



* This source code was highlighted with Source Code Highlighter .








рд╣рдо рдПрдХ рдмрд╛рд╣рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдлрд╝рд╛рдЗрд▓ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ



Node.JS рдХреЗ рд╕рд╛рде рдмрд╛рд╣рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдмрд╛рд╣рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рд╣рдорд╛рд░реЗ рдХрдВрд╕реЛрд▓ рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВрдЧреЗред рд╕реНрдкреНрд░рд╛рдЗрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо GraphicsMagick рдкреИрдХреЗрдЬ (ImageMagick рдХрд╛рдВрдЯрд╛ рдХреЛ рд╕реНрдерд┐рд░ рдПрдкреАрдЖрдИ рдФрд░ рдЕрдЪреНрдЫреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рд╛рде) рдЪреБрдиреЗрдВрдЧреЗред



var spriteScript = '/usr/bin/gm' ;

var placeholder = path.join(__dirname, 'placeholder.jpg' );



var getParams = function (count)

{

return ( 'montage +frame +shadow +label -background #000000 -tile ' + count + 'x1 -geometry +0+0' ).split( ' ' );

};



var removeFile = function (path)

{

fs.unlink(path, function (err)

{

if (err)

{

console.log( 'Cannot remove ' + path);

}

});

};



var cleanup = function (inPaths, placeholder)

{

for ( var i = 0; i < inPaths.length; i++)

{

if (inPaths[i] == placeholder)

{

continue ;

}

removeFile(inPaths[i]);

}

};



var makeSprite = function (inPaths, outPath, placeholder, callback)

{

var para = getParams(inPaths.length).concat(inPaths, outPath);

console.log([ 'run' , spriteScript, para.join( ' ' )].join( ' ' ));

var spriter = child_process.spawn(spriteScript, para);



spriter.stderr.addListener( 'data' , function (data)

{

console.log(data);

});

spriter.stdout.addListener( 'data' , function (data)

{

console.log(data);

});

spriter.addListener( 'exit' , function (code, signal)

{

if (signal != null )

{

callback( 'Internal Server Error - Interrupted by signal' + signal.toString());

return ;

}

if (code != 0)

{

callback( 'Internal Server Error - Code is ' + code.toString());

return ;

}

cleanup(inPaths, placeholder);

callback( null );

});

};



* This source code was highlighted with Source Code Highlighter .








рдЫреЛрдЯреА рдмрд╛рд░реАрдХрд┐рдпрд╛рдБ



рд╣рдо рдЕрд╕реНрдерд╛рдпреА рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд╛рдо рдмрдирд╛рддреЗ рд╣реИрдВ


Process.pid рдФрд░ рдЕрдиреБрд░реЛрдз рдХрд╛рдЙрдВрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, path.join ('/ tmp', ['source-file', Process.pid, requestCounter) .join ('-')) рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдлрд╝рдВрдХреНрд╢рдиред рдЕрдиреБрд░реЛрдз рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрд░реЛрдз рдХрд╛рдЙрдВрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рд╡рд░реНрддрдорд╛рди рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рднреА рдЪрд░рдг рдкреВрд░реНрдг рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЕрдЧрд▓реЗ рдЕрдиреБрд░реЛрдз рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рд╣реЛ рд╕рдХрддреА рд╣реИред



рд╣рдо рдкрд┐рдЫрд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рд╕реЗ рдЕрд╕реНрдерд╛рдпреА рдбреЗрдЯрд╛ рдХреЛ рд╕рд╛рдл рдХрд░рддреЗ рд╣реИрдВ


рд╣рдорд╛рд░реЗ рд╕рднреА рдЕрд╕реНрдерд╛рдпреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕реНрд░реЛрдд-рдкреАрдЖрдИрдбреА тАЛтАЛрдирд╛рдо рджрд┐рдпрд╛ рдЬрд╛рдП ... рдпрд╛ рд╕реНрдкреНрд░рд╛рдЗрдЯ-рдкреАрдЖрдИрдбреА- ...:



var fileExpr = /^(?:source|sprite)\-(\d+)\b/;

var storagePath = '/tmp/' ;



var cleanupOldFiles = function ()

{

fs.readdir(storagePath, function (err, files)

{

if (err)

{

console.log( 'Cannot read ' + storagePath + ' directory.' ;

return ;

}

for ( var i = 0; i < files.length; i++)

{

var fn = files[i];

m = fileExpr.exec(fn);

if (!m)

{

continue ;

}

var pid = parseInt(m[1]);

if (pid == process.pid)

{

continue ;

}

removeFile(path.join(storagePath, fn));

}

});

};



* This source code was highlighted with Source Code Highlighter .








рдХрдВрдХрд╛рд▓ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ




рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдХреБрдЫ рд╕рдордп (рдЯрд╛рдЗрдордкреЗрдХ) рд╕реЗ рдПрдХ рдлреЛрдЯреЛ рдПрд▓реНрдмрдо рд╕реНрдкреНрд░рд╛рдЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред



#!/usr/bin/env node



var child_process = require( 'child_process' );

var http = require( 'http' );

var path = require( 'path' );

var fs = require( 'fs' );



var routeExpr = /^\/?(\w)\/([^\/]+)\/(\d+)\/(\d+)x(\d+)\.png$/;

var fileCounter = 0;



http.createServer( function (request, response)

{

if (request.method != 'GET' )

{

response.writeHead(405, { 'Content-Type' : 'text/plain' });

response.end( 'Method Not Allowed' );

return ;

}

var m = routeExpr.exec(request.url);

if (!m)

{

response.writeHead(400, { 'Content-Type' : 'text/plain' });

response.end( 'Bad Request' );

return ;

}



var mode = m[1];

var chapter = m[2];

var timespec = parseInt(m[3]);

var width = parseInt(m[4]);

var height = parseInt(m[5]);



fileCounter++;

var moments = [timespec];

addWantedMoments(moments, mode)



var runner = function (moments, fileCounter, width, height)

{

var waitCounter = moments.length;

var outPath = path.join(storagePath, [ 'sprite' , process.pid, fileCounter].join( '-' ) + '.png' );

var needCache = true ;



for ( var i = 0; i < moments.length; i++)

{

handlePart(i, placeholder);

}

};

request.connection.setTimeout(0);

runner([].concat(moments), fileCounter, width, height);



}).listen(8080, '127.0.0.1' );



console.log( 'Server running at 127.0.0.1:8080' );



cleanupOldFiles();



* This source code was highlighted with Source Code Highlighter .








рджрд░рдЕрд╕рд▓, рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд░реЗрдбреАрдореЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИ рдЬреЛ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЕрдиреНрдп рд╕рд╛рдЗрдЯреЛрдВ рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдПрдХ рд╕рдореБрдЪрд┐рдд рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред



рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ (рд╕реНрд░реЛрдд рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рджрдо, рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдмрдирд╛рдиреЗ, рдпрджрд┐ рдЖрдХрд╛рд░ рд▓рдЧрд╛рддрд╛рд░ рдмрджрд▓ рд░рд╣реЗ рд╣реИрдВ), рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред



рджрд░рдЕрд╕рд▓, рдореЗрд░рд╛ рдПрдХ рдЧреИрдЬреЗрдЯ рдбрд╛рдпрдирд╛рдорд┐рдХ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдЬрдирд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред






All Articles