2012-05-27 15 views
5

Si tiene un nodo ejecutándose y tengo un nodo en ejecución, tiene Alguien ha visto una solución que nos permitirá mantener un conjunto de archivos sincronizados.Sincronización de archivos con node.js: unision == tcp == nodo ----- [http] ----- nodo == tcp == unison

La sincronización es complicado, así que pensé que podría dejarse a una herramienta como unison (que es como rsync) y entonces todo nodo tendría que hacer es conectar una tubería TCP entre los usuarios autenticados.

filesystem1---unision==tcp==node.js------[http]----node.js==tcp====unison---filesystem2 

es probablemente alrededor de 12 líneas de JavaScript, pero al este punto que está más allá de mí, o cualquiera de los ejemplos que pude encontrar, hasta ahora.

He mirado un montón de otras opciones de sincronización de archivos (como Git, veracidad, fósiles, incluyendo una semana de tratar de instalar un servidor Simias iFolder en Linux, fallará ~ lo que parecía prometedor porque incluía una cliente de búsqueda de archivos para cada SO principal) pero ahora estoy pensando que algo mucho, mucho más simple probablemente sea el camino.

Si alguien ha visto un proyecto Node.js que hace tal, o se encuentra en un nivel en el que la conexión de dos tubos de TCP es no demasiado duro, a continuación, le agradecería saber de usted

+0

Es posible que desee echar un vistazo a las Node.js biblioteca neta. Contiene funciones que le permiten crear conexiones de socket TCP personalizadas. Avíseme si necesita más detalles. http://nodejs.org/api/net.html#net_class_net_socket –

+0

En términos de su diagrama, ¿ha pensado en usar una conexión de socket TCP simple entre las dos instancias de node.js? Por ejemplo, unision == tcp == node.js ------ [TCP Socket] ---- node.js == tcp ==== unison. Algo me dice que puede ser más fácil, ya que los sockets TCP son bidireccionales y http no. –

Respuesta

0

El enfoque básico Me tomar a este problema es usar stream2.
Mi enfoque básico sería algo como esto.

obtener datos de primera tcp

var gulp = require('gulp') 
, thr = require('through2') 
; 


gulp.watch('rootDirectory/**/*', function(evt) { 


    if ('deleted' === evt.type) { 
    // do stuff if file is deleted 
    return 
    } 

    // file got changed, moved or added. 
    gulp.src(evt.path).pipe(thr(chunk, enc, next){ 
    // chunk is a vinyl filesytem object, 
    // so better fix chunk before sending to tcp server 
    next(null, fixedChunk) 

    }).pipe(toYourTcpServer) 

}) 

continuación, en el nodo de

var net = require('net') 
, http = require('http') 
; 

var clientTcp = net.connect({port: 'toYourTcpServerPort'}) 

var server = http.createServer(function(req, res){ 
    clientTcp.pipe(res) 
}).listen('somePort') 

luego en el otro extremo, que hacen lo contrario
en el nodo

var clientTcp2 = net.connect({port: 'toYourTcpServerPort2'}) 

var server2 = http.createServer(function(req, res){ 
    // fix response or something else. 
    req.pipe(clientTcp2) 
}).listen('somePort') 

procedentes de el segundo tcp

gutil = require('gulp-util') 


clientTcp2.pipe(thr(function(chunk, enc, next){ 
    // You must create a vinyl filesystem before 
    // sending down stream. Use new gutil.File() 
    next(null, fixedChunk) 

})).pipe(gulp.dest('finalDirectoy')) 

through2 crea flujos de transformaciones y gulp lo ayudan a crear tareas con transmisión. Los archivos de vinilo son solo una abstracción utilizada por Gulp.

espero que te da una idea de cómo utilizar las corrientes de resolver su problema buena suerte

+0

línea de fondo, no usaría unción en absoluto. –

+0

Pero esto enviaría todo el archivo actualizado no solo la parte modificada a la derecha (como lo haría rsync of unison)? – swennemen

Cuestiones relacionadas