Sign Up for Free

RunKit +

Try any Node.js package right in your browser

This is a playground to test code. It runs a full Node.js environment and already has all of npm’s 400,000 packages pre-installed, including key-sequence with all npm packages installed. Try it out:

var keySequence = require("key-sequence")

This service is provided by RunKit and is not affiliated with npm, Inc or the package authors.

key-sequence v1.6.1

Detect a sequence of keys being pressed.

key-sequence

Coverage Status

NPM

A featherweight utility to detect a sequence of key presses or a stream, and call the supplied callback. Fast!

Usage

var keySequence = require('key-sequence'); // CommonJS
<script src="key-sequence.min.js"></script> // Browser

// Regex '+'/'*' (denotes repeatable characters)
// The below matches 'omg<enter>'/'omgggg<enter>'/'o   mggggggg<enter>'
var onKey = keySequence(['o', '\s*', 'm', 'g+', '\n'], (evt) => {
    // Do what needs to be done when the key sequence is detected.
    console('OMG it works!', evt);
});

// Konami code
var onKey = keySequence([38, 38, 40, 40, 37, 39, 37, 39, 'b', 'a'], () => {
    console.log('Achievement unlocked!!');
});

// Use with Observables
sourceKeyStream.subscribe(
  k => onKey(k));

// Can pass keycode using e.which using jQuery or events.
$(document).keypress(function(e) {
    onKey(e.which, e /* optional */);
});

// or pass the character itself.
onKey('x');


/* Some more supported keysequences: */
[17, 'c'] //The classic <ctrl> and 'c'
['I', '.*', 'U'] // I <anything in between> U

Features

  • Supports + and * as wildcards to denote repeating characters.
  • Support for keyCodes, so you can use metakeys like <ctrl>, <alt> in the sequence.
  • Support for meta characters like \s, . etc.

Wait, but why ? I'd rather use a regex.

Using a regex is slow and cannot get less elegant, its O(n) in the size of your total input, on every single keystroke.

key-sequence generates a DFA and maintains the state. O(1) every single keystroke. Can think of it as a regex which accepts streaming input.

TODO

  • Support for more Regex metacharacters like | etc.

Theory

Image

This is the DFA for the above example. key-sequence maintains the present state according to the key input. Once the end state(4 in this case) is reached the supplied done callback is called.

If, at any point the input does not match a transition, we go back to the starting state (0).

RunKit is a free, in-browser JavaScript dev environment for prototyping Node.js code, with every npm package installed. Sign up to share your code.
Sign Up for Free