Hi,
You don't really need to do the conference itself on the SIP.js client. You have Asterisk server with conference capabilities that will do it for you. Personally I'm using FreeSWITCH, but you can do the following method on Asterisk, too.
Let's say you have an active call, using an Invitation / Inviter object.
What I did in my deployment, is to use an additional Inviter object for "dummy" calls. So I'm sending an additional INVITE with a request URI of "add_participant" as a dialed number and some custom SIP headers like "X-Participant-Number" where I put the number of the participant I want to add to the conference and you can also send the Call ID of the active call or the UUID of the leg of the active call with the caller (not my case, but you'll find a way to do it on Asterisk), and using this information you can build some logic in your dialplan where it'll originate a new call towards the number that is in the "X-Participant-Number" and when it'll be answered, make that both legs will be bridged into a newly created conference.
In my deployment, all calls are being conferenced from the beginning (even if it's only 2 participants) that way it's easier for me to just add more participants into an existing conference that I already know it's details.
But do not do it on SIP.js, and I don't even think you can use SIP.js as a conference bridge - not 100% sure. Plus, you'll loose control from the call control side over those calls, and you'll want to be able to control everything using the Asterisk.
Hope it make sense :)