Coder Social home page Coder Social logo

Promise support? about rascal HOT 21 CLOSED

onebeyond avatar onebeyond commented on July 16, 2024
Promise support?

from rascal.

Comments (21)

cressie176 avatar cressie176 commented on July 16, 2024 3

Release as 4.0.0

from rascal.

cressie176 avatar cressie176 commented on July 16, 2024 2

Currently available on the promise-support branch. I'll publish once I've done some more testing and had it reviewed.

from rascal.

cressie176 avatar cressie176 commented on July 16, 2024 1

Good spot. It's a weakness in the rascal API that you can't safely go async between calling subscribe and registering the on message handler.

Couple of things I might be able to do...

  1. Accept an optional event handler as part of the subscribe function.
  2. Not start consuming messages until an on message event listener was added using the newListener event

from rascal.

cressie176 avatar cressie176 commented on July 16, 2024 1

I think the API will be better if the user can subscribe to events before starting to consume messages from rabbit, so I'm still giving it some thought. I have a lot of other stuff on at the moment though so it won't be soon though.

from rascal.

cressie176 avatar cressie176 commented on July 16, 2024 1

@BorePlusPlus just came up with a nice idea. Instead of consuming messages immediately, if rascal could wait for an on('message') handler to be registered. Will investigate

from rascal.

cressie176 avatar cressie176 commented on July 16, 2024 1

Thanks for the nudge @mixecan. I'll bump it up my list.

from rascal.

cressie176 avatar cressie176 commented on July 16, 2024

No. It would increase the complexity of the code base and testing overhead.

from rascal.

breezewish avatar breezewish commented on July 16, 2024

Could you expose classes via module.exports (for example, Broker) so that I can use bluebird.promisifyAll to provide a promise-style API?

from rascal.

cressie176 avatar cressie176 commented on July 16, 2024

I'll create a branch and do it there. You happy to test / feedback?

from rascal.

breezewish avatar breezewish commented on July 16, 2024

Thanks! It won't be better!
I will use it in our experimental environment :P

from rascal.

cressie176 avatar cressie176 commented on July 16, 2024

Try

{
  "dependencies": {
    "rascal": "git://github.com/guidesmiths/rascal.git#promises"
  }
}
Promise.promisifyAll(require('rascal').classes)

from rascal.

breezewish avatar breezewish commented on July 16, 2024

Thanks for your effort. However it doesn't fully work at least for broker (I haven't tried other classes yet) because:

  1. Broker does not expose its base class https://github.com/guidesmiths/rascal/blob/promises/lib/amqp/Broker.js#L17
    In this way, broker instance methods such as broker.publish won't be promisified.

  2. Broker does not use prototype to define its methods thus bluebird.promisifyAll(Object.getPrototypeOf(someBrokerInstance)); will not work either.

promisify(someBrokerInstance) works but it is not ideal because it is not a one-time setup.

I would try to make some changes and will send you PRs whose implementations are friendly to promisify.

from rascal.

cressie176 avatar cressie176 commented on July 16, 2024

Thanks. I'm happy to accept a PR.

from rascal.

breezewish avatar breezewish commented on July 16, 2024

I made first attempt to make Broker promisify friendly:

breezewish@c62c4a4?w=1

Simple example rewritten in Promise way and ES 2017:

import bluebird from 'bluebird'
import Rascal from 'rascal'

bluebird.promisifyAll(Rascal.Broker)
bluebird.promisifyAll(Rascal.Broker.prototype)

(async () => {

  const broker = await Rascal.Broker.createAsync(Rascal.withDefaultConfig(config))
  broker.on('error', console.error)

  const subscription = await broker.subscribeAsync('demo_sub')
  subscription
    .on('message', function(message, content, ackOrNack) {
      console.log(content)
      ackOrNack()
    })
    .on('error', console.error)

  setInterval(async () => {
    await publication = broker.publishAsync('demo_pub', new Date().toISOString() + ': hello world')
    publication.on('error', console.error)
  }, 1000)

}())

from rascal.

breezewish avatar breezewish commented on July 16, 2024

I am going to test the new broker these days to see if there are any problems :P I will make PR later

from rascal.

cressie176 avatar cressie176 commented on July 16, 2024

Looks good to me. Thanks. After submitting the PR how do you feel about maintaining a 'rascal-as-promised' module?

from rascal.

breezewish avatar breezewish commented on July 16, 2024

Thanks, I might not be a good person to maintain that since most of the time I am not working with something related to AMQP :P I prefer to making rascal friendly to promisify tools so that users who want to use a promise style API can easily achieve that while rascal needn't care much about the promise API.

from rascal.

breezewish avatar breezewish commented on July 16, 2024

Ok seems that the promise way may lose message..caused by await broker.subscribeAsync('demo_sub')..

from rascal.

cressie176 avatar cressie176 commented on July 16, 2024

Not as easy as I'd hoped.

  1. Would need to take multiple event handlers ('message', 'invalid_message', 'error', 'redeliveries_exceeded')
  2. Breaks the subscrition.cancel behaviour.

from rascal.

breezewish avatar breezewish commented on July 16, 2024

Agree with you. BTW Promise is at least a microtask so that changing API is unavoidable to support Promise. This functionality is more difficult than I thought :P

from rascal.

mixecan avatar mixecan commented on July 16, 2024

@BorePlusPlus just came up with a nice idea. Instead of consuming messages immediately, if rascal could wait for an on('message') handler to be registered. Will investigate

Any change we can see this on the master branch?

from rascal.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.