Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/chjj/node-pingback
pingbacks for node.js
https://github.com/chjj/node-pingback
Last synced: 16 days ago
JSON representation
pingbacks for node.js
- Host: GitHub
- URL: https://github.com/chjj/node-pingback
- Owner: chjj
- License: mit
- Created: 2011-06-02T16:58:55.000Z (over 13 years ago)
- Default Branch: master
- Last Pushed: 2014-02-02T04:10:14.000Z (almost 11 years ago)
- Last Synced: 2024-10-20T01:14:52.287Z (24 days ago)
- Language: JavaScript
- Homepage:
- Size: 121 KB
- Stars: 15
- Watchers: 4
- Forks: 3
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# node-pingback
Pingbacks have come to node.js. If you're writing a blog, you may be interested
in this. It conforms to the
[pingback specification](http://www.hixie.ch/specs/pingback/pingback), as well
as the [XML-RPC spec](http://www.xmlrpc.com/spec), however, it may need more
testing.It protects against spam, has no dependencies, and can be used right out of
the box. Connect/Express middleware is included.## Usage
### Receiving Pingbacks (contrived example for clarity)
``` js
app.use('/pingback', Pingback.middleware(function(source, target, next) {
var self = this;
Posts.get(target.pathname, function(err, post) {
if (err) {
return next(Pingback.TARGET_DOES_NOT_EXIST);
}
if (post.pingbacks[source.href]) {
return next(Pingback.ALREADY_REGISTERED);
}
if (post.pingbacksDisabled) {
return next(Pingback.TARGET_CANNOT_BE_USED);
}
// or pass zero above for a generic error
post.pingbacks.push({
from: source.href, // e.g. "http://domain.tld/hey_check_out_this_guys_post"
title: self.title, // e.g. "Joe's blog"
text: self.excerpt // e.g. "hey, check this out: ..."
});
post.save();
next(); // send a success response
});
}));
```What you see above is merely the abstracted interface of the bundled middleware.
See example.js/test.js for more in-depth and lower-level examples.### Sending Pingbacks
``` js
// ping a target - err will be a fault code if present
Pingback.send('[target]', '[source]', function(err, pingback) {
if (!err) console.log('Pinged ' + pingback.href + ' successfully.');
});// scan an html string for links to ping
var text = 'a link here: a post';
Pingback.scan(text, '[source]', function(err, pingback) {
// optional callback - will get called for every pingback sent
if (!err) console.log('Pinged ' + pingback.href + ' successfully.');
});
```Again, see example.js/test.js for more examples and explanation.
## Reference
### Fault Code Constants
``` js
Pingback.METHOD_NOT_FOUND = -32601;
Pingback.GENERAL_ERROR = 0;
Pingback.SOURCE_DOES_NOT_EXIST = 16;
Pingback.NO_LINK_TO_TARGET = 17;
Pingback.TARGET_DOES_NOT_EXIST = 32;
Pingback.TARGET_CANNOT_BE_USED = 33;
Pingback.ALREADY_REGISTERED = 48;
Pingback.ACCESS_DENIED = 49;
```### Pingback properties
- `source`: a parsed url object of the source
- `target`: a parsed url object of the target
- `excerpt`: an excerpt from the source's page
- `title`: the title of the source page### Events for receiving pingbacks
- `ping`: An optional event to validate and handle errors/faults. If bound,
this will be triggered as the first event and passed a `next`
callback, which can be passed a fault code to trigger a fault
response, otherwise it will continue handling the pingback.
Arguments: `source`, `target`, `next`.
- `fault`: Emitted when a fault occurs. Passed the fault code and string.
Arguments: `code`, `msg`.
- `error`: Emitted for non-fault related errors. Calls the next middleware layer
in the bundled connect/express middleware function. Arguments: `err`.
- `end`: Emitted if no `ping` listeners have been bound, and after a pingback
has been received and verified. Arguments: `source`, `target`, `next`.
`next` has the same effect as the callback passed for `ping`.
- `success`: Emitted if a `ping` listener was bound, and after the pingback has
been received and handled. Arguments: `source`, `target`.## License
(c) Copyright 2011, Christopher Jeffrey (MIT License).
See LICENSE for more info.