Ανταλλαγή μηνυμάτων με το Total Messaging Service
Το TMS (Total Messaging Service) είναι ένας μικρός δίαυλος μηνυμάτων πάνω από ένα WebSocket. Το ενεργοποιείτε στο αρχείο config με $tms : true· το endpoint είναι /$tms/ και το secret_tms είναι το token που πρέπει να στέλνει κάθε πελάτης στην κεφαλίδα x-token (ένα λάθος token κλείνει τη σύνδεση με κωδικό 4001 και μια διεύθυνση που αποτυγχάνει περισσότερες από 5 φορές μπλοκάρεται για λίγο). Όταν ένας πελάτης συνδεθεί, λαμβάνει ένα μήνυμα meta που απαριθμεί τι δημοσιεύει η εφαρμογή, τι δέχεται και τι μπορεί να κάνει.
Τρία πράγματα μπορούν να εκτεθούν, καθένα περιγραμμένο από ένα schema στην ίδια μορφή name:Type με το input ενός action:
- το
NEWPUBLISH(name, schema)δηλώνει ένα μήνυμα που η εφαρμογή στέλνει· τοPUBLISH(name, value)το στέλνει σε κάθε πελάτη που το ζήτησε στέλνοντας{ type: 'subscribers', subscribers: [name] }. - το
NEWSUBSCRIBE(name, schema, callback)δηλώνει ένα μήνυμα που η εφαρμογή λαμβάνει: ένας πελάτης στέλνει{ type: 'subscribe', id: name, data: {...} }και τοcallback(message, client)εκτελείται μόνο όταν τα δεδομένα είναι έγκυρα. Τα επικυρωμένα δεδομένα βρίσκονται στοmessage.response(τοmessage.errorείναι εκεί πάνταnull) και τοclientείναι ο αποστολέας. - το
NEWCALL(name, schema, callback)δηλώνει μια συνάρτηση που ο πελάτης καλεί: ο πελάτης στέλνει{ type: 'call', id: name, data: {...}, callbackid: '1' }και η εφαρμογή απαντά με το ίδιο μήνυμα μεsuccess: trueκαι το αποτέλεσμα στοdata, ή μεerror: trueόταν τα δεδομένα είναι άκυρα. Τοcallback(data, done, client)παράγει το αποτέλεσμα με τοdone(null, result).
Η μετάδοση null ως schema στα NEWPUBLISH ή NEWSUBSCRIBE αφαιρεί τη δήλωση. Ο επίσημος πελάτης του Total.js (TMSCLIENT) μιλά αυτό το πρωτόκολλο για εσάς από μια άλλη εφαρμογή Total.js· κάθε πελάτης WebSocket είναι κατάλληλος.
Το UNSUBSCRIBE(name, [callback]) αφαιρεί τους ακροατές ενός μηνύματος που λαμβάνει η εφαρμογή: μόνο το callback όταν το περνάτε, αλλιώς όλους. Επιστρέφει true όταν αφαίρεσε κάτι και false όταν δεν υπήρχε τίποτα προς αφαίρεση.
$tms : true
secret_tms : my-tms-tokenNEWPUBLISH('news', 'title:String');
NEWSUBSCRIBE('orders', 'id:String, qty:Number', function(message, client) {
MAIN.orders.push(message.response);
});
NEWCALL('sum', 'a:Number, b:Number', function(data, done) {
done(null, { total: data.a + data.b });
});
MAIN.orders = [];exports.install = function() {
ROUTE('POST /news/ @json', news);
ROUTE('GET /orders/', orders);
ROUTE('GET /unsubscribe/', unsubscribe);
};
function news($) {
PUBLISH('news', { title: $.body.title });
$.success();
}
function orders($) {
$.json(MAIN.orders);
}
function unsubscribe($) {
const first = UNSUBSCRIBE('orders');
const second = UNSUBSCRIBE('orders');
$.json({ first: first, second: second });
}