рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╛рд╣рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдЬреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдореВрд▓ рд╕реЗрдЯ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 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 .
рджрд░рдЕрд╕рд▓, рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд░реЗрдбреАрдореЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИ рдЬреЛ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЕрдиреНрдп рд╕рд╛рдЗрдЯреЛрдВ рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдПрдХ рд╕рдореБрдЪрд┐рдд рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред
рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ (рд╕реНрд░реЛрдд рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рджрдо, рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдмрдирд╛рдиреЗ, рдпрджрд┐ рдЖрдХрд╛рд░ рд▓рдЧрд╛рддрд╛рд░ рдмрджрд▓ рд░рд╣реЗ рд╣реИрдВ), рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рджрд░рдЕрд╕рд▓, рдореЗрд░рд╛ рдПрдХ рдЧреИрдЬреЗрдЯ рдбрд╛рдпрдирд╛рдорд┐рдХ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдЬрдирд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
- Node.JS - рдЕрдиреНрдп HTTP рд╕реНрд░реЛрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рдгрд╛рдореА рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ
- рдиреЛрдб.рдЬреЗрдПрд╕ - рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдореВрд▓ рднрд╛рдЧ 1