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. All rights reserved.
Redistribution and use in source and binary forms, with or without 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 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... // Guarantee that every event handler gets every event...
// //
// guaranteeEvents('event', emitter) // guaranteeEvents('event', emitter)
@ -12,45 +34,28 @@
// -> emitter // -> 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. // will clear the event queue for a specific event.
// //
// Clear event(s) queue(s)... // Clear event(s) queue(s)...
// emitter.clearGuarantedQueue('event') // emitter.clearGuaranteedQueue('event')
// emitter.clearGuarantedQueue('eventA eventB ...') // emitter.clearGuaranteedQueue('eventA eventB ...')
// emitter.clearGuarantedQueue(['eventA', 'eventB', ...]) // emitter.clearGuaranteedQueue(['eventA', 'eventB', ...])
// -> emitter // -> emitter
// //
// Clear all queues... // Clear all queues...
// emitter.clearGuarantedQueue('*') // emitter.clearGuaranteedQueue('*')
// -> emitter // -> emitter
// //
// //
// NOTE: the seen stack might get quite big, this is not recommended for // NOTE: the seen stack might get quite big, this is not recommended for
// long running emitters... // long running emitters...
// function guaranteeEvents(names, emitter){
var guaranteeEvents =
module.exports =
function(names, emitter){
names = typeof(names) == typeof('str') ? names.split(/\s+/g) : names names = typeof(names) == typeof('str') ? names.split(/\s+/g) : names
// add ability to clear the queue... // add ability to clear the queue...
if(emitter.clearGuarantedQueue == null){ if(emitter.clearGuaranteedQueue == null){
emitter.clearGuarantedQueue = function(names){ emitter.clearGuaranteedQueue = clearGuaranteedQueue
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
}
emitter._guaranteed_queue = {} 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 : */ * vim:set ts=4 sw=4 : */

View File

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