Compare commits

..

18 Commits

Author SHA1 Message Date
ae560cd00a updated year
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
2023-09-09 16:39:03 +03:00
541f4bfe82 added .editorconfig
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
2023-06-12 12:47:28 +03:00
9be9caefc9 updated license...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
2019-11-03 19:28:07 +03:00
3572df122e 1.0.6 2014-12-31 19:23:50 +03:00
bf9674d063 added a link to the used in an example glob utility...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
2014-12-31 19:23:36 +03:00
7b16dc493f minor licence update in package.json...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
2014-12-30 00:07:22 +03:00
32a8826587 1.0.5 2014-12-29 22:59:39 +03:00
01ca45aec3 minor doc rewrite...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
2014-12-29 22:59:27 +03:00
b068e0b49a fixed a typo...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
2014-12-29 22:55:02 +03:00
367f85371f 1.0.4 2014-12-29 22:50:04 +03:00
f1373a167b some refactoring...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
2014-12-29 22:47:05 +03:00
c764dcf6ad 1.0.3 2014-12-29 22:24:15 +03:00
93a5d86492 minor documentation changes...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
2014-12-29 22:24:08 +03:00
e68fa30335 1.0.2 2014-12-29 22:20:43 +03:00
e02f6f3742 documented the .clearGuaranteedQueue(..) method...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
2014-12-29 22:19:49 +03:00
af131afe2f 1.0.1 2014-12-29 22:09:41 +03:00
d16ded7452 fixed a small typo and added some basic docs...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
2014-12-29 22:08:47 +03:00
e133df7701 renamed package to comply with npm rules...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
2014-12-29 20:07:43 +03:00
5 changed files with 145 additions and 29 deletions

7
.editorconfig Executable file
View File

@ -0,0 +1,7 @@
root = true
[**]
indent_style = tab
tab_width = 4
charset = utf-8
end_of_line = lf

2
LICENSE Normal file → Executable file
View File

@ -1,4 +1,4 @@
Copyright (c) 2014, Alex A. Naanou
Copyright (c) 2014-2023, Alex A. Naanou
All rights reserved.
Redistribution and use in source and binary forms, with or without

100
README.md Normal file → Executable file
View File

@ -1,2 +1,102 @@
guaranteeEvents
===============
This module exports a single function that when passed an event(s) and an
[EventEmitter](http://nodejs.org/api/events.html#events_class_events_eventemitter)
compatible object will register a couple of handlers that
will provide the following functionality:
* Cache event data for each event of the given type that gets emitted.
* Call new handlers of the specified event with each of the prior event
data sets in order of event occurrence.
* Add a `.clearGuaranteedQueue(<event>)` method to the emitter to facilitate
event cache cleaning.
This is useful for modules like [glob](https://github.com/isaacs/node-glob)
that use the [EventEmitter](http://nodejs.org/api/events.html#events_class_events_eventemitter)
model to pass data to the user (see examples below).
This is similar to how state change handlers work in
[jQuery.Deferred](http://api.jquery.com/category/deferred-object/) or in
[Promise](https://promisesaplus.com/) objects.
Install
-------
```
$ npm install guarantee-events
```
Basic Examples
-------------
A synthetic example illustrating the basic functionality:
```javascript
var emitter = new (require('events').EventEmitter)
var guaranteeEvents = require('guarantee-events')
guaranteeEvents('event', emitter)
// emit some events...
emitter.emit('event', 'some data')
emitter.emit('event', 'some', 'more', 'data')
// Here the handler will be called for each event it missed...
emitter.on('event', function(){ console.log([].slice.apply(argumnts).join(' ')) })
emitter.emit('event', 'some data')
```
A real-life use-case using the excellent [glob](https://github.com/isaacs/node-glob)
utility:
```javascript
var glob = require('glob')
var guaranteeEvents = require('guarantee-events')
// build a glob object with cached 'match' and 'end' events...
var results = guaranteeEvents('match end', glob('**/*js'))
// Do stuff for some time...
// This will not miss a single result, regardless of how long it
// took to do stuff...
results.on('match', function(path){ console.log('found: '+path) })
```
Cache cleaning and use for long running emitters
------------------------------------------------
One of the dangers in using this in long running event emitters is _cache
buildup_ -- the data for each event emitted will get stored and this
might get quite large, this, if not managed, is a potential memory leak.
To deal with this issue a `.clearGuaranteedQueue(<event>)` method is
added to the emitter, this will clear the cache for a specific event.
This and has a shorthand form `.clearGuaranteedQueue('*')` that will
clear the cache for all wrapped events.
So for the above example:
```javascript
// This this will drop all the prior match data, so newly registred handlers
// will not see them...
// NOTE: this will not affect the underlaying glob object in any way.
results.clearGuaranteedQueue('match')
```

59
index.js Normal file → Executable file
View File

@ -4,6 +4,28 @@
*
**********************************************************************/
// Clear event cache...
//
// This is added as a method to the emitter passed to guaranteeEvents(..)...
//
// NOTE: his has the same event names semantics as guaranteeEvents(..)
// NOTE: for more info see docs for guaranteeEvents(..)
function clearGuaranteedQueue(names){
names = names == '*' ? Object.keys(this._guaranteed_queue)
: typeof(names) == typeof('str') ? names.split(/\s+/g)
: names
var that = this
names.forEach(function(name){
if(name in that._guaranteed_queue){
that._guaranteed_queue[name] = []
}
})
return this
}
// Guarantee that every event handler gets every event...
//
// guaranteeEvents('event', emitter)
@ -12,45 +34,28 @@
// -> emitter
//
//
// This will add a .clearGuarantedQueue(..) method to the emitter that
// This will add a .clearGuaranteedQueue(..) method to the emitter that
// will clear the event queue for a specific event.
//
// Clear event(s) queue(s)...
// emitter.clearGuarantedQueue('event')
// emitter.clearGuarantedQueue('eventA eventB ...')
// emitter.clearGuarantedQueue(['eventA', 'eventB', ...])
// emitter.clearGuaranteedQueue('event')
// emitter.clearGuaranteedQueue('eventA eventB ...')
// emitter.clearGuaranteedQueue(['eventA', 'eventB', ...])
// -> emitter
//
// Clear all queues...
// emitter.clearGuarantedQueue('*')
// emitter.clearGuaranteedQueue('*')
// -> emitter
//
//
// NOTE: the seen stack might get quite big, this is not recommended for
// long running emitters...
//
var guaranteeEvents =
module.exports =
function(names, emitter){
function guaranteeEvents(names, emitter){
names = typeof(names) == typeof('str') ? names.split(/\s+/g) : names
// add ability to clear the queue...
if(emitter.clearGuarantedQueue == null){
emitter.clearGuarantedQueue = function(names){
names = names == '*' ? Object.keys(this._guaranteed_queue)
: typeof(names) == typeof('str') ? names.split(/\s+/g)
: names
var that = this
names.forEach(function(name){
if(name in that._guaranteed_queue){
that._guaranteed_queue[name] = []
}
})
return this
}
if(emitter.clearGuaranteedQueue == null){
emitter.clearGuaranteedQueue = clearGuaranteedQueue
emitter._guaranteed_queue = {}
}
@ -81,6 +86,10 @@ function(names, emitter){
}
// this is the only thing we are exporting...
module.exports = guaranteeEvents
/**********************************************************************
* vim:set ts=4 sw=4 : */

View File

@ -1,6 +1,6 @@
{
"name": "guaranteeEvents",
"version": "1.0.0",
"name": "guarantee-events",
"version": "1.0.6",
"description": "Guarantee that every event handler gets every event...",
"main": "index.js",
"scripts": {
@ -18,7 +18,7 @@
"event"
],
"author": "Alex A. Naanou <alex.nanou@gmail.com> (https://github.com/flynx)",
"license": "New BSD",
"license": "BSD-3-Clause",
"bugs": {
"url": "https://github.com/flynx/guaranteeEvents/issues"
},