Skip to content
This repository was archived by the owner on May 6, 2025. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions .jshintrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
{
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Оч удобно в комитах добавлять текст fix #5 что автоматически закроет issue #5 при мердже в мастер

"indent": 4,
"boss": true,
"undef": true,
"curly": true,
"forin": true,
"unused": true,
"newcap": true,
"eqnull": true,
"jquery": true,
"browser": true,
"noempty": true,
"latedef": true,
"camelcase": true,
"quotmark": "single",
"scripturl": true,
"-W030": false,
"-W015": false,
"globals": {
"module": true,
"define": true,
"require": true,
"console": true,
"exports": true
}
}
52 changes: 30 additions & 22 deletions gulpfile.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@ var gulp = require('gulp'),
uglify = require('gulp-uglify'),
rjs = require('gulp-requirejs'),
rename = require('gulp-rename'),
merge = require('merge');
merge = require('merge'),
jshint = require('gulp-jshint');

var DEST = './out';

Expand All @@ -12,7 +13,8 @@ var buildOptions = {
paths: {
'conduitjs': './node_modules/postal/node_modules/conduitjs/lib/conduit',
'postal': './node_modules/postal/lib/postal',
'lodash': './node_modules/postal/node_modules/lodash/lodash'
'lodash': './node_modules/postal/node_modules/lodash/lodash',
'pledges': './node_modules/pledges/build/release.min',
},
include: ['index'],
almond: true,
Expand All @@ -26,38 +28,44 @@ var buildOptions = {
};

/**
* Сборка standalone-версии без каких-либо зависимостей:
* Сборка standalone-версии без каких-либо зависимостей:
* файл можно просто вставить на страницу как скрипт
*/
gulp.task('standalone', function() {
return rjs(buildOptions)
.pipe(gulp.dest(DEST))
.pipe(rename('event-bus.min.js'))
.pipe(uglify())
.pipe(gulp.dest(DEST));
.pipe(gulp.dest(DEST))
.pipe(rename('event-bus.min.js'))
.pipe(uglify())
.pipe(gulp.dest(DEST));
});

/**
* Сборка версии для Require.js: содержит только внутренние
* зависимости, а внешние (типа Conduit и Lo-Dash) в сборку
* не включаются. Также ссылки на эти внешние модули
* не включаются. Также ссылки на эти внешние модули
* переименовываются: к ним добавляется `packages/`
*/
gulp.task('requirejs', function() {
return rjs(merge.recursive(true, buildOptions, {
paths: {
'lodash': 'empty:'
},
wrap: {
startFile: './wrappers/requirejs/start.frag',
endFile: './wrappers/requirejs/end.frag'
},
out: 'event-bus-requirejs.js'
}))
.pipe(gulp.dest(DEST))
.pipe(rename('event-bus-requirejs.min.js'))
.pipe(uglify())
.pipe(gulp.dest(DEST));
paths: {
'lodash': 'empty:'
},
wrap: {
startFile: './wrappers/requirejs/start.frag',
endFile: './wrappers/requirejs/end.frag'
},
out: 'event-bus-requirejs.js'
}))
.pipe(gulp.dest(DEST))
.pipe(rename('event-bus-requirejs.min.js'))
.pipe(uglify())
.pipe(gulp.dest(DEST));
});

gulp.task('default', ['standalone', 'requirejs']);
gulp.task('lint', function(argument) {
return gulp.src('./lib/*.js')
.pipe(jshint())
.pipe(jshint.reporter('default'))
});

gulp.task('default', ['lint', 'standalone', 'requirejs']);
20 changes: 14 additions & 6 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
if (typeof module === 'object' && typeof define !== 'function') {
var define = function (factory) {
var define = function(factory) {
module.exports = factory(require, exports, module);
};
}

define(function(require, exports, module) {
var postal = require('postal');
var facade = require('./lib/backbone-facade');
var backboneFacade = require('./lib/backbone-facade');
var preserve = require('./lib/preserve');
var requestResponse = require('./lib/request-response');

function extend(obj) {
for (var i = 1, il = arguments.length, src; i < il; i++) {
Expand All @@ -16,14 +17,21 @@ define(function(require, exports, module) {
continue;
}

for (var p in src) if (src.hasOwnProperty(p)) {
obj[p] = src[p];
for (var p in src) {
if (src.hasOwnProperty(p)) {
obj[p] = src[p];
}
}
}

return obj;
}

extend(postal.ChannelDefinition.prototype, facade);
return extend(preserve(postal), facade);
extend(postal.ChannelDefinition.prototype, backboneFacade);

extend(preserve(postal), backboneFacade);

requestResponse(postal);

return postal;
});
13 changes: 8 additions & 5 deletions lib/backbone-facade.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
if (typeof module === 'object' && typeof define !== 'function') {
var define = function (factory) {
var define = function(factory) {
module.exports = factory(require, exports, module);
};
}

/*jshint unused:false*/
define(function(require, exports, module) {
var postal = require('postal');

Expand All @@ -20,7 +21,7 @@ define(function(require, exports, module) {
* Если не указан (передали 2 аргумента), подписываемся на глобальное событие
* @param {String} event Название события, на которе подписываемся
* @param {Function} callback Обработчик события
* @param {Object} context Контекст выполнения обработчика событий
* @param {Object} context Контекст выполнения обработчика событий
*/
on: function(channel, events, callback, context) {
var event,
Expand Down Expand Up @@ -109,12 +110,14 @@ define(function(require, exports, module) {
events = Object.keys(topics);
}

var subsFilter = function(s) {
return (callback != null ? s.callback.target().__original === callback : true) && (context != null ? s.callback.context() === context : true);
};

while (event = events.shift()) {
subs = topics[event] || [];

subs = subs.filter(function(s) {
return (callback != null ? s.callback.target().__original === callback : true) && (context != null ? s.callback.context() === context : true);
});
subs = subs.filter(subsFilter);

postal.unsubscribe.apply(postal, subs);
}
Expand Down
7 changes: 4 additions & 3 deletions lib/preserve.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,18 @@
* последнего вызова события.
*
* Используется следующая конвенция: если событие вызывается
* с префиксом `!`, то данные этого события сохраняются
* и передаются всем последующим подписчикам. Следующий вызов
* с префиксом `!`, то данные этого события сохраняются
* и передаются всем последующим подписчикам. Следующий вызов
* этого же события без префикса `!` сбрасывает это состояние,
* то есть все последующие подписчики его не получат
*/
if (typeof module === 'object' && typeof define !== 'function') {
var define = function (factory) {
var define = function(factory) {
module.exports = factory(require, exports, module);
};
}

/*jshint unused:false*/
define(function(require, exports, module) {
return function(postal) {
var storage = {};
Expand Down
116 changes: 116 additions & 0 deletions lib/request-response.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
/**
* Механизим, добавляющий механизм request-response сообщений.
*
* Используется следующая конвенция: если событие вызывается
* с префиксом `/`, то тип событие - команда и ожидается ответ
*/
if (typeof module === 'object' && typeof define !== 'function') {
var define = function(factory) {
module.exports = factory(require, exports, module);
};
}

/*jshint unused:false*/
define(function(require, exports, module) {
var channelTest = /^@/,
commandTest = /^\//,
deferred = require('pledges').deferred;

return function(postal) {

function request(channel, command) {
var
defer = deferred(),
promise = defer,
data = {
__args: null
};

if (typeof channel !== 'string') {
return promise;
}

if (channelTest.test(channel)) {
channel = channel.substr(1);
data.__args = Array.prototype.slice.call(arguments, 2);
} else {
data.__args = Array.prototype.slice.call(arguments, 1);
command = channel;
channel = null;
}

if (!channel && this instanceof postal.ChannelDefinition) {
channel = this.channel;
}

function resolve(data) {
defer.resolve(data);
}

function reject(reason) {
defer.reject(reason);
}

function reply(err, data) {
if (err) {
reject(err);
} else {
resolve(data);
}
}

reply.resolve = resolve;
reply.reject = reject;

postal.publish({
channel: channel,
topic: command,
data: data,
reply: reply,
headers: {
replyable: true
}
});

return promise;
}

postal.request = request;

postal.ChannelDefinition.prototype.request = request;

var SubscriptionDefinitionProto = postal.SubscriptionDefinition.prototype,
originSubscribe = SubscriptionDefinitionProto.subscribe;

SubscriptionDefinitionProto.subscribe = function(originCallback) {

function callbackProxy(data, envelope) {
if (envelope.headers && envelope.headers.replyable) {
try {
// если метод вызван через метод ON фасада backbode
if (originCallback.__original && data.__args) {
data.__args.unshift(envelope.reply);
}

return originCallback.call(this, data, envelope);
} catch (ex) {
//console.log(ex);
envelope.reply(ex);
}
}
return originCallback.apply(this, arguments);

}

//в случае если подписались через метод ON
// сохраняем __original для отписки
if (originCallback.__original) {
callbackProxy.__original = originCallback.__original;
}

return originSubscribe.call(this, callbackProxy);
};

return postal;
};
});
4 changes: 3 additions & 1 deletion lib/utils.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
var ArrayProto = Array.prototype,
ObjProto = Object.prototype,
/*jshint -W079 */
hasOwnProperty = ObjProto.hasOwnProperty,
nativeForEach = ArrayProto.forEach,
slice = ArrayProto.slice;
slice = ArrayProto.slice,
breaker = false;

module.exports = {
has: function(obj, key) {
Expand Down
6 changes: 5 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,19 @@
"author": "Sergey Chikuyonok <sergey.chikuyonok@inn.ru>",
"license": "MIT",
"dependencies": {
"pledges": "^3.0.0",
"postal": "^0.10.3"
},
"devDependencies": {
"almond": "~0.2.9",
"gulp": "^3.8.7",
"gulp-jshint": "^1.9.0",
"gulp-rename": "^1.2.0",
"gulp-requirejs": "^0.1.3",
"gulp-uglify": "^0.3.1",
"merge": "^1.2.0",
"mocha": "^1.21.4"
"mocha": "^1.21.4",
"mockery": "^1.4.0",
"q": "^1.0.1"
}
}
Loading