diff --git a/main.js b/main.js index d7ecb165..59661292 100644 --- a/main.js +++ b/main.js @@ -1,5 +1,6 @@ var app = require('app'); // Module to control application life. var BrowserWindow = require('browser-window'); // Module to create native browser window. + var ipc = require('ipc'); // Report crashes to our server. require('crash-reporter').start(); @@ -39,47 +40,48 @@ app.on('activate-with-no-open-windows', function() { } }); +// DB +var DB = { + init: function () { + var me = this; + var db = require('db_main'); + + // 前端发来消息 + // m = {token: token, method: 'insert, findOne', dbname: 'notes', params: {username: "life"}}; + ipc.on('db-exec', function(event, m) { + // me._token2Sender[m.token] = event.sender; + db.exec(m, function (ret) { + // console.log('main called ret:'); + // console.log(ret); + event.sender.send('db-exec-ret', ret); + }); + }); + + /** + * 前端发消息过来说可以初始化了 + * @param {} event + * @param {Object} params { + curUser: 是当前用户 + dbPath: string 是用户的dbPath + * } + */ + ipc.on('db-init', function (event, params) { + db.init(params.curUser, params.dbPath); + }); + } +}; + // This method will be called when Electron has done everything // initialization and ready for creating browser windows. app.on('ready', openIt); -function killPort(callback) { - var protocol = require('protocol'); - if (protocol.registerFileProtocol) { - callback(); - return; - } - var child_process = require('child_process'); - var port = '8912'; - if (process.platform.toLowerCase().indexOf('win') === 0) { - // & EXIT 表示只循环一次 - // Leanote会有两个pid绑定端口, 另一个和electron相关, kill掉也会把自己kill掉 - var sh1 = 'FOR /F "tokens=4 delims= " %P IN (\'netstat -a -n -o ^| findstr :' + port + '\') DO (TaskKill.exe /F /PID %P) & Exit'; - var sh2 = 'FOR /F "tokens=5 delims= " %P IN (\'netstat -a -n -o ^| findstr :' + port + '\') DO (TaskKill.exe /F /PID %P) & Exit'; - child_process.exec(sh1, function () { - child_process.exec(sh2, callback); - }); - } - else { - var sh = 'kill -9 $(lsof -i:' + port + ' -t)'; - child_process.exec(sh, callback); - } -} - function openIt() { - killPort(_openIt); -} + // 数据库 + DB.init(); -function _openIt() { - // console.log(arguments); - // app.getPath('appData'); - - // var Evt = require('evt'); - // var basePath = '/Users/life/Library/Application Support/Leanote'; // require('nw.gui').App.dataPath; - // Evt.setDataBasePath(basePath); - - // leanote protocol - // require('leanote_protocol'); + // 协议 + var leanoteProtocol = require('leanote_protocol'); + leanoteProtocol.init(); // Create the browser window. mainWindow = new BrowserWindow({ @@ -93,11 +95,6 @@ function _openIt() { // and load the index.html of the app. mainWindow.loadUrl('file://' + __dirname + '/note.html'); - // 不能放在这里, 刚开始有图片, 之后添加的图片不能显示 ?? - // // 启动服务器, 图片 - // var Server = require('server'); - // Server.start(); - // Emitted when the window is closed. mainWindow.on('closed', function() { // Dereference the window object, usually you would store windows @@ -106,7 +103,6 @@ function _openIt() { mainWindow = null; }); - var ipc = require('ipc'); mainWindow.on('focus', function() { // ipc.send('focusWindow'); mainProcess没有该方法 if(mainWindow && mainWindow.webContents) @@ -123,6 +119,7 @@ function _openIt() { e.preventDefault(); mainWindow.webContents.send('closeWindow'); }); + // 前端发来可以关闭了 ipc.on('quit-app', function(event, arg) { console.log('get quit-app request'); diff --git a/node_modules/api_main.js b/node_modules/api_main.js new file mode 100644 index 00000000..632be557 --- /dev/null +++ b/node_modules/api_main.js @@ -0,0 +1,91 @@ +var async = require('async'); +var Common = require('common'); +var needle = require('needle'); +var fs = require('fs'); +var Evt = require('evt_main'); + +function log(o) { + // console.log(o); +} + +// timeout 0无限等待, 60,000 1分钟 +needle.defaults({ + timeout: 60000 +}); + +// 远程数据服务 +var Api = { + // 检查错误 + checkError: function(error, resp) { + var me = this; + }, + + getUrl: function(url, param) { + var url = Evt.leanoteUrl + '/api/' + url; + var token = Evt.getToken(); + param = param || {}; + param.token = token; + if(param) { + var paramStr = ''; + for(var i in param) { + paramStr += i + '=' + param[i] + '&'; + } + } + if(url.indexOf('?') >= 0) { + url = url + '&' + paramStr; + } + url = url + '?' + paramStr; + return url; + }, + + getImage: function(fileId, callback) { + var me = this; + var url = me.getUrl('file/getImage', {fileId: fileId}); + needle.get(url, function(err, resp) { + me.checkError(err, resp); + if(err) { + return callback && callback(false); + } + // log(resp.body); + /* + { 'accept-ranges': 'bytes', + 'content-disposition': 'inline; filename="logo.png"', + 'content-length': '8583', + 'content-type': 'image/png', + date: 'Mon, 19 Jan 2015 15:01:47 GMT', + */ + // log(resp.headers); + if(err) { + callback(false); + } else { + var typeStr = resp.headers['content-type']; + var type = 'png'; + if(typeStr) { + var typeArr = typeStr.split('/'); + if(typeStr.length > 1) { + type = typeArr[1]; + } + } + + var filename = Common.uuid() + '.' + type; + var imagePath = User.getCurUserImagesPath(); + var imagePathAll = imagePath + '/' + filename; + log(imagePathAll); + fs.writeFile(imagePathAll, resp.body, function(err) { + if(err) { + log(err); + log('local save image failed 本地保存失败'); + callback(false); + } else { + callback(imagePathAll, filename); + } + }); + } + }); + }, +}; +module.exports = Api; + + + + diff --git a/node_modules/db.js b/node_modules/db.js index 79a0117b..1bcbdf3f 100644 --- a/node_modules/db.js +++ b/node_modules/db.js @@ -1,6 +1,7 @@ var Datastore = require('nedb'); var path = require('path'); var Evt = require('evt'); +var dbClient = require('db_client'); // 数据库初始化 // var dbPath = require('nw.gui').App.dataPath + '/nedb'; @@ -26,10 +27,17 @@ var db = { }, // 为特定用户初始化自己的表 - initDBForUser: function (userId) { + initDBForUser: function (userId, curUser) { var me = this; - var dbNames = ['notebooks', 'notes', 'tags', 'images', 'attachs', 'noteHistories']; + var dbNames = ['notebooks', 'notes', 'tags', /*'images',*/ 'attachs', 'noteHistories']; this.initIt(me, dbNames, userId); + + // init dbClient -> main db + var baseDBPath = dbPath; + if (userId) { + baseDBPath += '/' + userId; + } + dbClient.init(curUser, baseDBPath); }, // 过时 diff --git a/node_modules/db_client.js b/node_modules/db_client.js new file mode 100644 index 00000000..dea97d16 --- /dev/null +++ b/node_modules/db_client.js @@ -0,0 +1,37 @@ +/** + * db_main的db client, 调用db client即会调用后端的db_main + */ + +var DatastoreProxy = require('nedb_proxy'); +var path = require('path'); +var Evt = require('evt'); +var ipc = require('ipc'); + + +var dbPath = Evt.getBasePath() + '/nedb55'; +if(dbPath.length < 6) { + var dbPath = '/Users/life/Library/Application Support/Leanote' + '/nedb2'; +} + +// console.log(dbPath); +// g, 表全局环境 +var db = {}; +var dbNames = ['images']; // 现在只有images表在后台控制 +for(var i in dbNames) { + var name = dbNames[i]; + (function (name) { + db[name] = new DatastoreProxy(name); + })(name); +} + +// 在db.js的initForUser时调用 +// 初始化, 给后端发消息 +db.init = function (curUser, dbPath) { + ipc.send('db-init', { + curUser: curUser, + dbPath: dbPath + }); +}; + +module.exports = db; +console.log('db inited'); \ No newline at end of file diff --git a/node_modules/db_main.js b/node_modules/db_main.js new file mode 100644 index 00000000..0bdd35c0 --- /dev/null +++ b/node_modules/db_main.js @@ -0,0 +1,86 @@ +var Datastore = require('nedb'); +var path = require('path'); +var Evt = require('evt_main'); + +var db = {}; + +// dbPath是用户的dbPath +db.init = function (curUser, dbPath) { + var me = this; + var dbNames = [ + 'images', + /* + 'users', 'notebooks', 'notes', 'tags', 'attachs', 'noteHistories', 'g'*/ + ]; + for(var i in dbNames) { + var name = dbNames[i]; + var baseDBPath = dbPath; + + var dbFilepath = path.join(baseDBPath, name + '.db'); + (function (name) { + var autoload = true; + db[name] = new Datastore( + {filename: dbFilepath, autoload: autoload, onload: function () { + console.log(name + ' is loaded [main]'); + }}); + })(name); + } + + db._inited = true; + + // 保存起来 + Evt.init(curUser, dbPath); + + console.log('db inited [main]'); +}; + +/** + * 执行 + * @param {[type]} m [description] + * @param {Function} callback [description] + * @return {[type]} [description] + */ +db.exec = function(m, callback) { + var me = this; + // console.log('------------------------'); + console.log('main db called'); + // console.log(m); + + if (!this._inited) { + callback({token: m.token, err: new Error(), ret: false}); + return; + } + + if (m.method == 'find') { + var params = m.params; + var query = params.query; + var sorter = params.sorter; + if (sorter) { + db[m.dbname].find(query).sort(sorter).exec(function (err, ret) { + // 返回结果 + callback({token: m.token, err: err, ret: ret}); + }); + return; + } else { + db.params = query; + } + } + else if (m.method == 'update') { + var params = m.params; + // console.log('update------------------') + // console.log(params.options ? '' : '????????????????????????????'); + db[m.dbname].update(params.query, params.sets, params.options, function (err, ret) { + // 返回结果 + callback({token: m.token, err: err, ret: ret}); + }); + return; + } + + // insert + db[m.dbname][m.method](m.params, function (err, ret) { + // 返回结果 + callback({token: m.token, err: err, ret: ret}); + }); +}; + +module.exports = db; diff --git a/node_modules/evt.js b/node_modules/evt.js index b2831b04..32b2ebd6 100644 --- a/node_modules/evt.js +++ b/node_modules/evt.js @@ -11,8 +11,6 @@ if(!fs.existsSync(dataBasePath)) { */ // dataBasePath = ''; -var protocol = require('remote').require('protocol'); - var Evt = { defaultUrl: 'https://leanote.com', @@ -43,42 +41,28 @@ var Evt = { // https://github.com/atom/electron/commit/7d97bb6fe0a6feef886d927ea894bcb2f3521577 // 老版本没有这个问题 canUseProtocol: function () { + return true; // return false; - return protocol.registerFileProtocol; + // return protocol.registerFileProtocol; }, getImageLocalUrlPrefix: function () { - if (this.canUseProtocol()) { - return 'leanote://file/getImage'; - } - return this.localUrl + '/api/file/getImage'; + return 'leanote://file/getImage'; }, getAttachLocalUrlPrefix: function () { - if (this.canUseProtocol()) { - return 'leanote://file/getAttach'; - } - return this.localUrl + '/api/file/getAttach'; + return 'leanote://file/getAttach'; }, getAllAttachsLocalUrlPrefix: function () { - if (this.canUseProtocol()) { - return 'leanote://file/getAllAttachs'; - } - return this.localUrl + '/api/file/getAllAttachs'; + return 'leanote://file/getAllAttachs'; }, getImageLocalUrl: function(fileId) { - if (this.canUseProtocol()) { - return 'leanote://file/getImage?fileId=' + fileId; - } - return this.localUrl + '/api/file/getImage?fileId=' + fileId; + return 'leanote://file/getImage?fileId=' + fileId; }, getAttachLocalUrl: function(fileId) { - if (this.canUseProtocol()) { - return 'leanote://file/getAttach?fileId=' + fileId; - } - return this.localUrl + '/api/file/getAttach?fileId=' + fileId; + return 'leanote://file/getAttach?fileId=' + fileId; }, getAllAttachLocalUrl: function(noteId) { return this.localUrl + '/api/file/getAllAttachs?noteId=' + noteId; diff --git a/node_modules/evt_main.js b/node_modules/evt_main.js new file mode 100644 index 00000000..376805cc --- /dev/null +++ b/node_modules/evt_main.js @@ -0,0 +1,43 @@ +var fs = require('fs'); + +// main 进程环境 +/** +当前端登录后, db.init时, 调用db_client的init +*/ + +var Evt = { + defaultUrl: 'https://leanote.com', + leanoteUrl: 'https://leanote.com', + // leanoteUrl: 'http://localhost:9000', + + setHost: function(host) { + if(!host) { + this.leanoteUrl = this.defaultUrl; + } else { + this.leanoteUrl = host; + } + // leanote服务强制https + if (this.leanoteUrl === 'http://leanote.com') { + this.leanoteUrl = 'https://leanote.com'; + } + }, + + getHost: function() { + return this.leanoteUrl; + }, + + init: function (curUser, dbPath) { + this.curUser = curUser; + this.setHost(curUser.Host); + }, + + getCurUserId: function () { + return this.curUser.UserId; + }, + + getToken: function () { + return this.curUser.Token; + } +}; + +module.exports = Evt; diff --git a/node_modules/file.js b/node_modules/file.js index 3f5ac343..1d1974d3 100644 --- a/node_modules/file.js +++ b/node_modules/file.js @@ -1,4 +1,5 @@ var db = require('db'); +var dbClient = require('db_client'); var fs = require('fs'); var crypto = require('crypto'); var needle = require('needle'); @@ -6,7 +7,7 @@ var path = require('path'); var Evt = require('evt'); var User = require('user'); var Common = require('common'); -var Images = db.images; +var Images = dbClient.images; var Attachs = db.attachs; var Web = require('web'); @@ -392,8 +393,9 @@ var File = { if(isForce) { image.ServerFileId = fileId; } - db.images.insert(image, function(err, doc) { - log(err); + dbClient.images.insert(image, function(err, doc) { + console.log(err); + console.log(doc); if(err) { callback && callback(false); } else { @@ -407,7 +409,7 @@ var File = { addImageForce: function(fileId, path, callback) { var me = this; // 先删除之, 可能是本地有记录, 但是文件没了 - db.images.remove({FileId: fileId}, function() { + dbClient.images.remove({FileId: fileId}, function() { me._addImage(fileId, path, callback, true); }); }, @@ -417,8 +419,8 @@ var File = { // 因为图片的链接 有可能是本地添加的, 又有可能是远程的 // 如果是远程的, FileId == ServerFileId, 是一样的, 所以不要Or getImageLocalPath: function(fileId, callback) { - // db.images.findOne({$or: {FileId: fileId}, {ServerFileId: fileId}}, function(err, doc) { - db.images.findOne({FileId: fileId}, function(err, doc) { + // dbClient.images.findOne({$or: {FileId: fileId}, {ServerFileId: fileId}}, function(err, doc) { + dbClient.images.findOne({FileId: fileId}, function(err, doc) { if(!err && doc && doc.Path) { // FileLocalPath是相对于项目的路径 callback(true, doc.Path); } else { @@ -428,7 +430,7 @@ var File = { }, getImageInfo: function(fileId, callback) { - db.images.findOne({FileId: fileId}, function(err, doc) { + dbClient.images.findOne({FileId: fileId}, function(err, doc) { if(!err && doc && doc.Path) { callback(true, doc); } else { @@ -450,7 +452,7 @@ var File = { // 得到fileIds所有的images, 为了发送到服务器上 getAllImages: function(fileIds, callback) { var me = this; - db.images.find({$or:[{FileId: {$in: fileIds}}, {ServerFileId: {$in: fileIds}}]}, function(err, images) { + dbClient.images.find({$or:[{FileId: {$in: fileIds}}, {ServerFileId: {$in: fileIds}}]}, function(err, images) { if(err || !images) { return callback(false); } @@ -473,7 +475,7 @@ var File = { if(!file.FileId || !file.LocalFileId) { continue; } - db.images.update({FileId: file.LocalFileId}, {$set: {ServerFileId: file.FileId, IsDirty: false}}); + dbClient.images.update({FileId: file.LocalFileId}, {$set: {ServerFileId: file.FileId, IsDirty: false}}); } }, diff --git a/node_modules/file_main.js b/node_modules/file_main.js new file mode 100644 index 00000000..b8888113 --- /dev/null +++ b/node_modules/file_main.js @@ -0,0 +1,125 @@ +var fs = require('fs'); +var path = require('path'); +var db = require('db_main'); + +function log(o) { + console.trace(o); +} + +// 文件服务 main 进程调用 + +var File = { + // 从服务器上把文件download下来后 + // 这里的fileId是serverFileId, 本地的FileId也保存为该值 + addImageForce: function(fileId, path, callback) { + var me = this; + // 先删除之, 可能是本地有记录, 但是文件没了 + db.images.remove({FileId: fileId}, function() { + me._addImage(fileId, path, callback, true); + }); + }, + + // 获取图片本地路径 + // 通过FileId可ServerFileId来查找 + // 因为图片的链接 有可能是本地添加的, 又有可能是远程的 + // 如果是远程的, FileId == ServerFileId, 是一样的, 所以不要Or + getImageLocalPath: function(fileId, callback) { + // db.images.findOne({$or: {FileId: fileId}, {ServerFileId: fileId}}, function(err, doc) { + db.images.findOne({FileId: fileId}, function(err, doc) { + if(!err && doc && doc.Path) { // FileLocalPath是相对于项目的路径 + callback(true, doc.Path); + } else { + callback(false, false); + } + }); + }, + + getImageInfo: function(fileId, callback) { + db.images.findOne({FileId: fileId}, function(err, doc) { + if(!err && doc && doc.Path) { + callback(true, doc); + } else { + callback(false, false); + } + }); + }, + + // 笔记添加/修改后会有LocalFileId <=> FileId映射 + // 这个只对image有用 + updateImageForce: function(files) { + if(!files) { + // callback && callback(false); + return; + } + for(var i in files) { + var file = files[i]; + if(file.IsAttach) { + continue; + } + if(!file.FileId || !file.LocalFileId) { + continue; + } + db.images.update({FileId: file.LocalFileId}, + {$set: {ServerFileId: file.FileId, IsDirty: false}}); + } + }, + + // 处理用户图片 + getImage: function(fileId, callback) { + var me = this; + if(!fileId) { + return callback(false); + } + + var Api = require('api'); + + // 访问api, 得到图片 + function getImageFromApi() { + // console.log('fetch servers image ' + fileId); + Api.getImage(fileId, function(fileLocalPath, filename) { + if(fileLocalPath) { + // console.log('save image to local'); + // 保存到本地数据库中 + me.addImageForce(fileId, fileLocalPath, function(doc) { + if(doc) { + // console.log('save image to local success'); + } else { + // console.log('save image to local error'); + } + callback(fileLocalPath); + // return me.retImage(fileLocalPath, res); + }); + } else { + // 远程取不到图片, 是没有网络? 还是远程真的没有了 + // TODO + // console.log("cann't get server's image" + fileId); + // callback(false); + // return me.e404(res); + } + }); + } + // 先查看本地是否有该文件 + // has表示本地数据库有记录 + me.getImageLocalPath(fileId, function(has, fileLocalPath) { + // 本地有 + // console.log('re img') + // console.log(fileLocalPath); + // console.log(fs.exists(fileLocalPath)); + if(has && fileLocalPath) { + fs.exists(fileLocalPath, function(exists) { + if(exists) { + // console.log('本地存在'); + callback(fileLocalPath); + // me.retImage(fileLocalPath, res); + } else { + getImageFromApi(); + } + }); + } else { + getImageFromApi(); + } + }); + } +}; + +module.exports = File; diff --git a/node_modules/leanote_protocol.js b/node_modules/leanote_protocol.js index efe1e6a6..9fc125a6 100644 --- a/node_modules/leanote_protocol.js +++ b/node_modules/leanote_protocol.js @@ -1,109 +1,42 @@ -// 为了显示图片 -// leanote://api/file/getImage?fileId=xxx -// -// -// 没用!!! 因为protocal不支持异步 -// https://github.com/atom/electron/issues/410 - var protocol = require('protocol'); +var File = require('file_main'); -var Evt = require('evt'); -var Common = require('common'); -var File = require('file'); -var Api = require('api'); -var db = require('db'); - -var http = require('http'); -var url = require('url'); -var path = require('path'); -var fs = require('fs'); - -var Server = { - mime: { - "css": "text/css", - "gif": "image/gif", - "html": "text/html", - "ico": "image/x-icon", - "jpeg": "image/jpeg", - "jpg": "image/jpeg", - "js": "text/javascript", - "json": "application/json", - "pdf": "application/pdf", - "png": "image/png", - "svg": "image/svg+xml", - "swf": "application/x-shockwave-flash", - "tiff": "image/tiff", - "txt": "text/plain", - "wav": "audio/x-wav", - "wma": "audio/x-ms-wma", - "wmv": "video/x-ms-wmv", - "xml": "text/xml" +var leanoteProtocol = { + destroy: function (callback) { + protocol.unregisterProtocol('leanote', function () { + callback(); + }); }, - router: function(request) { - var me = this; - - var pathname = url.parse(request.url).pathname; - while(pathname[0] == '/') { - pathname = pathname.substr(1); - } - - if(pathname == 'api/file/getImage') { - return me.getImage(request, response); - } else { - response.end(); - return false; - } - }, - - e404: function(res) { - var me = this; - res.writeHead(404, { - 'Content-Type': 'text/plain' - }); - res.write("This request URL " + me._req.url + " was not found on this server."); - res.end(); - }, - - // 返回图片 - retImage: function(filePath, res) { - var me = this; - var ext = path.extname(filePath); - ext = ext ? ext.slice(1) : 'unknown'; - filePath = filePath + ''; - fs.readFile(filePath, "binary", function (err, file) { - if (err) { - res.writeHead(500, { - 'Content-Type': 'text/plain' - }); - res.end(); - } else { - var contentType = me.mime[ext] || "text/plain"; - res.writeHead(200, {'Content-Type': contentType}); - res.write(file, "binary"); - res.end(); - } - }); - }, - - getImage: function(req, res) { - var me = this; - // fileId - var fileId = url.parse(req.url, true).query['fileId']; - if(!fileId) { - return me.e404(res); - } - File.getImage(fileId, function(fileLocalPath) { - if(path) { - return me.retImage(fileLocalPath, res); - } else { - return me.e404(res); - } - }) + init: function () { + // 先注销, 为了防止刷新 + // this.destroy(funciton () { + protocol.registerFileProtocol('leanote', function(request, callback) { + // console.log(request.url); + var url = request.url; + var ret = /fileId=([a-zA-Z0-9]{24})/.exec(url); + if (ret && ret[1]) { + var fileId = ret[1]; + // console.log(fileId); + + File.getImage(ret[1], function(fileLocalPath) { + if(fileLocalPath) { + callback({path: fileLocalPath}); + } else { + callback(); + } + }); + + } + // var url = request.url.substr(7); + // callback({path: '/Users/life/Desktop/newicon/blog@2x.png'}); + }, function (error) { + if (error) { + console.error('Failed to register protocol') + console.error(error); + } + }); + // }); } -}; +} - -protocol.registerProtocol('leanote', function(request) { - var url = request.url.substr(7); - return new protocol.RequestFileJob(path.normalize(__dirname + '/' + url)); -}); \ No newline at end of file +module.exports = leanoteProtocol; diff --git a/node_modules/nedb_proxy.js b/node_modules/nedb_proxy.js new file mode 100644 index 00000000..f6ad518c --- /dev/null +++ b/node_modules/nedb_proxy.js @@ -0,0 +1,90 @@ +var ipc = require('ipc'); + +function Find(dbProxy, dbname, query) { + this.query = query; + this.dbProxy = dbProxy; + this.dbname = dbname; +} +Find.prototype.sort = function (sorter) { + this.sorter = sorter; + return this; +} + +Find.prototype.exec = function (callback) { + var params = { + query: this.query, + sorter: this.sorter + }; + this.dbProxy.send(params, callback, 'find'); +}; + +//========== + +function DBProxy(dbname) { + this.dbname = dbname; +}; + +var token = 1; +var token2Callback = {}; + +DBProxy.prototype.send = function(params, callback, method) { + token++; + var m = { + token: token, + method: method, + dbname: this.dbname, + params: params + } + token2Callback[token] = callback; + ipc.send('db-exec', m); +}; + +// NB.find({UserId: userId, $or: [{LocalIsDelete : { $exists : false }}, {LocalIsDelete: false}] }, function(err, notebooks) { +// Notes.find(query).sort({'UpdatedTime': -1}).exec(function(err, notes) { +DBProxy.prototype.find = function (params, callback) { + if (callback) { + this.send({query: params}, callback, 'find'); + } + else { + return new Find(this, this.dbname, params); + } +}; +DBProxy.prototype.findOne = function (params, callback) { + this.send(params, callback, 'findOne'); +}; +DBProxy.prototype.count = function (params, callback) { + this.send(params, callback, 'count'); +}; +DBProxy.prototype.insert = function (params, callback) { + this.send(params, callback, 'insert'); +}; +DBProxy.prototype.update = function (query, sets, options, callback) { + if (typeof options == 'function') { + callback = options; + options = {}; + } + if (!options) { + options = {}; + } + var params = { + query: query, + sets: sets, + options: options + }; + this.send(params, callback, 'update'); +}; +DBProxy.prototype.remove = function (params, callback) { + this.send(params, callback, 'remove'); +}; + +// m = {token: , err : , ret: } +ipc.on('db-exec-ret', function(m) { + var token = m.token; + var callback = token2Callback[token]; + // console.log('clent 接收到消息'); + // console.log(m); + // console.log('--------------'); + callback && callback(m.err, m.ret); +}); + +module.exports = DBProxy; \ No newline at end of file diff --git a/node_modules/note.js b/node_modules/note.js index e015b0ed..4b290c9c 100644 --- a/node_modules/note.js +++ b/node_modules/note.js @@ -7,7 +7,6 @@ var User = require('user'); var Notebook = require('notebook'); // var Tag = require('tag'); // var Api = require('api'); -var Server = require('server'); var Common = require('common'); var Web = require('web'); diff --git a/node_modules/server.js b/node_modules/server.js deleted file mode 100644 index ac106648..00000000 --- a/node_modules/server.js +++ /dev/null @@ -1,240 +0,0 @@ -var Evt = require('evt'); -var File = null; - -var http = require('http'); -var url = require('url'); -var path = require('path'); -var fs = require('fs'); -var Common = require('common'); - -var protocol = require('remote').require('protocol'); - -// http server, 处理笔记图片 -var Server = { - // port: 8008, - // localUrl: 'http://127.0.0.1:8008', - _started: false, - _req: null, - mime: { - "css": "text/css", - "gif": "image/gif", - "html": "text/html", - "ico": "image/x-icon", - "jpeg": "image/jpeg", - "jpg": "image/jpeg", - "js": "text/javascript", - "json": "application/json", - "pdf": "application/pdf", - "png": "image/png", - "svg": "image/svg+xml", - "swf": "application/x-shockwave-flash", - "tiff": "image/tiff", - "txt": "text/plain", - "wav": "audio/x-wav", - "wma": "audio/x-ms-wma", - "wmv": "video/x-ms-wmv", - "xml": "text/xml" - }, - server: null, - start: function() { - var me = this; - if(me._started) { - return; - } - - // 如果可以使用协议, 则使用 - if (Evt.canUseProtocol()) { - me.initProtocol(); - me._started = true; - return; - } - - // return; - var basePath = process.cwd(); - var server = http.createServer(function (request, response) { - var pathname = url.parse(request.url).pathname; - me._req = request; - if(!pathname) { - return me.e404(response); - } - while(pathname[0] == '/') { - pathname = pathname.substr(1); - } - if(pathname == 'api/file/getImage') { - return me.getImage(request, response); - } else { - response.end(); - return false; - } - - var realPath = basePath + pathname; - var ext = path.extname(realPath); - ext = ext ? ext.slice(1) : 'unknown'; - - fs.exists(realPath, function (exists) { - if (!exists) { - response.writeHead(404, { - 'Content-Type': 'text/plain' - }); - response.write("This request URL " + pathname + " was not found on this server."); - response.end(); - } else { - fs.readFile(realPath, "binary", function (err, file) { - if (err) { - response.writeHead(500, { - 'Content-Type': 'text/plain' - }); - - response.end(err); - } else { - var contentType = me.mime[ext] || "text/plain"; - response.writeHead(200, {'Content-Type': contentType}); - response.write(file, "binary"); - response.end(); - } - }); - } - }); - }); - - // kill 端口占用的pid - var child_process = require('child_process'); - function killPort(callback) { - if (Common.isWin()) { - // & EXIT 表示只循环一次 - // Leanote会有两个pid绑定端口, 另一个和electron相关, kill掉也会把自己kill掉 - var sh1 = 'FOR /F "tokens=4 delims= " %P IN (\'netstat -a -n -o ^| findstr :' + Evt.port + '\') DO (TaskKill.exe /F /PID %P) & Exit'; - var sh2 = 'FOR /F "tokens=5 delims= " %P IN (\'netstat -a -n -o ^| findstr :' + Evt.port + '\') DO (TaskKill.exe /F /PID %P) & Exit'; - child_process.exec(sh1, function () { - child_process.exec(sh2, callback); - }); - } - else { - var sh = 'kill -9 $(lsof -i:' + Evt.port + ' -t)'; - child_process.exec(sh, callback); - } - } - // killPort(function (error, stdout, stderr) { - // if (error !== null) { - // console.log('kill port error: ' + error); - // } - - server.listen(Evt.port); - console.log("Server runing at port: " + Evt.port + "."); - - me.localUrl = Evt.localUrl; - me._started = true; - - me.server = server; - // }); - }, - - // 关闭服务 - close: function(callback) { - this._started = false; - - // 注销prototol, 如果频繁刷新, 会报错, calling a released render - if (Evt.canUseProtocol()) { - protocol.unregisterProtocol('leanote', function (ok) { - console.log('unregisterProtocol: ' + ok) - callback && callback(); - }); - return; - } - this.server.close(function(err) { - }); - this._started = false; - callback && callback(); - }, - - e404: function(res) { - var me = this; - res.writeHead(404, { - 'Content-Type': 'text/plain' - }); - res.write("This request URL " + me._req.url + " was not found on this server."); - res.end(); - }, - - // 返回图片 - retImage: function(filePath, res) { - var me = this; - var ext = path.extname(filePath); - ext = ext ? ext.slice(1) : 'unknown'; - filePath = filePath + ''; - fs.readFile(filePath, "binary", function (err, file) { - if (err) { - res.writeHead(500, { - 'Content-Type': 'text/plain' - }); - res.end(); - } else { - var contentType = me.mime[ext] || "text/plain"; - res.writeHead(200, {'Content-Type': contentType}); - res.write(file, "binary"); - res.end(); - } - }); - }, - - getImage: function(req, res) { - var me = this; - // fileId - var fileId = url.parse(req.url, true).query['fileId']; - if(!fileId) { - return me.e404(res); - } - - if(!File) { - File = require('file'); - } - - File.getImage(fileId, function(fileLocalPath) { - if(path) { - return me.retImage(fileLocalPath, res); - } else { - return me.e404(res); - } - }) - }, - - //--------------------- - // 新server - // latest 0.31 series - //--------------------- - - initProtocol: function () { - // 先注销, 为了防止刷新 - // protocol.unregisterProtocol('leanote', function () { - - protocol.registerFileProtocol('leanote', function(request, callback) { - // console.log(request.url); - var url = request.url; - var ret = /fileId=([a-zA-Z0-9]{24})/.exec(url); - if (ret && ret[1]) { - // console.log(ret); - if(!File) { - File = require('file'); - } - File.getImage(ret[1], function(fileLocalPath) { - if(fileLocalPath) { - callback({path: fileLocalPath}); - } else { - callback(); - } - }) - var fileId = ret[1]; - } - // var url = request.url.substr(7); - // callback({path: '/Users/life/Desktop/newicon/blog@2x.png'}); - }, function (error) { - if (error) { - console.error('Failed to register protocol') - console.error(error); - } - }); - // }); - - } -}; -module.exports = Server; \ No newline at end of file diff --git a/node_modules/user.js b/node_modules/user.js index fa63c186..be229ca0 100644 --- a/node_modules/user.js +++ b/node_modules/user.js @@ -122,7 +122,7 @@ User = { // 设为当前user me.saveCurUser(doc, function () { // 为该用户初始化数据库 - db.initDBForUser(user.UserId); + db.initDBForUser(user.UserId, user); me.userId = user.UserId; var Notebook = require('notebook'); @@ -239,7 +239,7 @@ User = { me.hasDB = user.HasDB; // 是否有自己的DB // 为该用户初始化数据库 - db.initDBForUser(me.hasDB ? me.userId : ''); + db.initDBForUser(me.hasDB ? me.userId : '', user); Evt.setHost(me.host); diff --git a/public/js/app/native.js b/public/js/app/native.js index 7397e67d..35c6878d 100644 --- a/public/js/app/native.js +++ b/public/js/app/native.js @@ -22,11 +22,9 @@ $(function() { var isMacP = isMac(); $('.tool-close, .tool-close-blur').click(function() { - // mac下关闭才是隐藏 - onCloseNotStopServerForMac(function() { + onClose(function() { gui.win.hide(); }); - // gui.win.showInactive(); }); // 从login.html -> note.html过来就没有reopen事件了? diff --git a/public/js/app/service.js b/public/js/app/service.js index fda0073b..46c8a2f8 100644 --- a/public/js/app/service.js +++ b/public/js/app/service.js @@ -6,12 +6,6 @@ var basePath = app.getPath('appData') + '/leanote'; // /Users/life/Library/Appli Evt.setDataBasePath(basePath); var protocol = require('remote').require('protocol'); -if(!/login.html/.test(location.href)) { - // 启动服务器, 图片 - var Server = require('server'); - Server.start(); -} - // 数据库初始化 var db = require('db'); // db.init(); @@ -35,7 +29,6 @@ var NoteService = Service.noteService; var NotebookService = Service.notebookService; var TagService = Service.tagService; var WebService = require('web'); -var ServerService = require('server'); var FileService = require('file'); var EvtService = require('evt'); var CommonService = require('common'); diff --git a/public/js/common.js b/public/js/common.js index 368ff141..b320ebc8 100644 --- a/public/js/common.js +++ b/public/js/common.js @@ -1524,9 +1524,7 @@ function switchAccount() { // 当没有用户时, 切换之 function switchToLoginWhenNoUser() { - Server.close(function () { - toLogin(); - }); + toLogin(); } // 没有一处调用 @@ -1763,25 +1761,6 @@ var Notify = { var onClose = function(afterFunc) { console.log('on close'); try { - // 先把服务/协议关掉 - Server.close(function () { - SyncService.stop(); - // 先保存之前改变的 - Note.curChangedSaveIt(); - // 保存状态 - State.saveCurState(function() { - afterFunc && afterFunc(); - }); - }); - } catch(e) { - console.error(e); - afterFunc && afterFunc(); - } -} - -// 如果是mac, 当关闭窗口时不要stop server -var onCloseNotStopServerForMac = function(afterFunc) { - function o () { SyncService.stop(); // 先保存之前改变的 Note.curChangedSaveIt(); @@ -1789,17 +1768,6 @@ var onCloseNotStopServerForMac = function(afterFunc) { State.saveCurState(function() { afterFunc && afterFunc(); }); - } - try { - if (isMac()) { - o(); - } - else { - // 先把服务/协议关掉 - Server.close(function () { - o(); - }); - } } catch(e) { console.error(e); afterFunc && afterFunc(); diff --git a/public/plugins/export_html/plugin.js b/public/plugins/export_html/plugin.js index 6820fb92..d0fd4842 100644 --- a/public/plugins/export_html/plugin.js +++ b/public/plugins/export_html/plugin.js @@ -103,7 +103,7 @@ define(function() { var me = this; // http://127.0.0.1:8912/api/file/getImage?fileId=5581029f6289dc3301000000 // 找到图片 - var reg = new RegExp(Api.evtService.localUrl + '/api/file/getImage\\?fileId=([0-9a-zA-Z]{24})', 'g'); + var reg = new RegExp('leanote://file/getImage\\?fileId=([0-9a-zA-Z]{24})', 'g'); // console.log(Api.evtService.localUrl + '/api/file/getImage\\?fileId=([0-9a-zA-Z]{24})'); var matches = content.match(reg); // content = content.replace(reg, Evt.leanoteUrl + '/api/file/getImage'); diff --git a/tests/test.js b/tests/test.js index d482aa4e..fb843e12 100755 --- a/tests/test.js +++ b/tests/test.js @@ -4,7 +4,6 @@ var Notebook = require('notebook'); var Note = require('note'); var Api = require('api'); var User = require('user'); -var Server = require('server'); var Evt = require('evt'); var Common = require('common'); @@ -91,7 +90,6 @@ Note.getNoteByServerNoteId("54c6313799c37bdeec000008", function(ret){ // Api.auth('c@a.com', 'abc123'); // var content = ' ' + "\n" + ''; // var reg = new RegExp('