Utils.Promise = global.Promise || require('promiscuous');

package.json has a couple of changes that limit this dependency's impact:

1.  promiscuous is listed in "optionalDependencies", which allows `npm install`
    to succeed even if promiscuous is unavailable. Note that in this case,
    `require('sip.js')` will fail in Node environments that don't provide
    global.Promise, so Node users should ensure that it is available.

2.  The "browser" field is used to specify that browserify should use a browser
    build of promiscuous, which is now tracked in the ./src/polyfills
    directory. This ensures that the SIP.js browser build does not depend on
    the promiscuous module being installed, and helps keep the minified build
    small (adding only 1185 bytes). For details on the "browser" field, see:

    https://github.com/substack/browserify-handbook/blob/12f07d9767192d3f26510fbf2d79f3cdf13e18b6

See also:

  https://github.com/onsip/SIP.js/issues/94#issuecomment-55414940