leanote protocol移到main进程, 所有图片的操作通过db_client进行操作

This commit is contained in:
life
2015-12-18 13:10:40 +08:00
parent 31b1eba870
commit 13873a64c0
19 changed files with 580 additions and 468 deletions

79
main.js
View File

@@ -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>} event
* @param {Object} params {
curUser: <User> 是当前用户
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');

91
node_modules/api_main.js generated vendored Normal file
View File

@@ -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;

12
node_modules/db.js generated vendored
View File

@@ -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);
},
// 过时

37
node_modules/db_client.js generated vendored Normal file
View File

@@ -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');

86
node_modules/db_main.js generated vendored Normal file
View File

@@ -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;

30
node_modules/evt.js generated vendored
View File

@@ -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;

43
node_modules/evt_main.js generated vendored Normal file
View File

@@ -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;

20
node_modules/file.js generated vendored
View File

@@ -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}});
}
},

125
node_modules/file_main.js generated vendored Normal file
View File

@@ -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;

141
node_modules/leanote_protocol.js generated vendored
View File

@@ -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));
});
module.exports = leanoteProtocol;

90
node_modules/nedb_proxy.js generated vendored Normal file
View File

@@ -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;

1
node_modules/note.js generated vendored
View File

@@ -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');

240
node_modules/server.js generated vendored
View File

@@ -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;

4
node_modules/user.js generated vendored
View File

@@ -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);

View File

@@ -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事件了?

View File

@@ -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');

View File

@@ -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();

View File

@@ -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');

View File

@@ -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 = '<img src="http://localhost:9000/api/file/getImage?fileId=54c2083f99c37bea5f000001"> <img src="http://localhost:9000/api/file/getImage?fileId=54c2083f99c37bea5f000001">' + "\n" + '<img src="http://localhost:9000/api/file/getImage?fileId=54c2083f99c37bea5f000001">';
// var reg = new RegExp('<img *src="' + Api.leanoteUrl + '/api/file/getImage', 'g');
// content = content.replace(reg, '<img src="' + Server.localUrl + '/api/file/getImage');
// console.log(content);
/*