Name

global.ChannelAjax

Description

AJAX code for watching a channel

Script

var ChannelAjax = Class.create();

ChannelAjax.prototype = Object.extendsObject(AbstractAjaxProcessor, {

process: function() {
    this.cm = GlideChannelManager.get();
    this.channel = null;
    this.channelName = this.getName();

    if (!this.getChannel(this.channelName)) {
        root.setAttribute("error", this.channelName + ": invalid channel");
        return;
    }
    
    if (this.getType() == "read") {
        var clientLastSeq = this.getValue();
        if (!clientLastSeq)
            clientLastSeq = 0;

        this._setThreadAttribute();
        this.grabChannelMessages(clientLastSeq);
    } else if (this.getType() == "write") {
        this.channel.msg(session.getUserName() + ": " + this.getChars());
    }
},

grabChannelMessages: function(clientLastSeq) {
    var messages;

    try {
        messages = this.getWaitForNewMessages(clientLastSeq);
    } catch(e) {
        root.setAttribute("interrupted", "true");
        return;
    }

    if (!messages || messages.length < 1) {
        root.setAttribute("error", this.channelName + ": no messages in channel");
        return;
    }

    var channelLastSeq = messages[messages.length - 1].seq;
    root.setAttribute("client_last_sequence", clientLastSeq);
    root.setAttribute("channel_last_sequence", channelLastSeq);

    for(var i = 0; i < messages.length; i++) {
         var message = messages[i];

         var item = this.newItem();
         item.setAttribute("sequence", message.seq);
         item.setAttribute("date", message.date);
         item.setAttribute("message", message.msg);
    }
},

getWaitForNewMessages: function(clientLastSeq) {
    var messages = [];

    var channelLastSeq = this.channel.getLastSequence();
    if (!channelLastSeq)
        return messages;

    // lets wait until we have a message
    while (clientLastSeq == channelLastSeq) {
        Packages.java.lang.Thread.sleep(250);
        channelLastSeq = this.channel.getLastSequence();
    }

    var channelMessages = this.channel.getMessages();
    var mListIterator = channelMessages.listIterator(channelMessages.size());
    while (mListIterator.hasPrevious()) {
        var cmsg = mListIterator.previous();
        if (cmsg.getSequence() > clientLastSeq)
            messages.push({ seq: cmsg.getSequence(), msg: cmsg.getMessage(), date: cmsg.getDate() });
    }

    messages.sort(this._sortMessageArray);
    return messages;
},

getChannel: function(name) {
    if (this.getParameter("sysparm_auto_create") == "true")
        this.channel = this.cm.createChannel(name);

    if (!this.cm.exists(name))
        return false;

    this.channel = this.cm.getChannel(name);
    return true;
},

_sortMessageArray: function(a, b) {
    return a.seq - b.seq;
},

_setThreadAttribute: function() {
    GlideThreadAttributes.createThreadAttribute("streaming_channel", this.channelName);
},

type: "ChannelAjax"
});

Sys ID

b20d49460a0a0b4b003b54d9eddc6da7

Offical Documentation

Official Docs: