Home Reference Source

src/data/datasources/SharePoint/SPSoapAdapter/Worker/Manager.js

/**
 * Created by tom on 28/08/15.
 */
import '../../../../../utils/hotfixes/polyfills/FunctionName.js';
import '../../../../../utils/hotfixes/polyfills/ObjectKeys.js';
import '../../../../../utils/hotfixes/polyfills/StartsWith.js';
import {SharePointClient}               from './SharePointClient.js';

let clients = {};

let onmessage = async function (messageEvent) {
    let message = messageEvent.data;
    let {subscriberID, operation} = message;
    let client = clients[subscriberID];
    let clientExisted = !!client;

    /* If the requested client doesn't exist yet, create a new instance. */
    if (!clientExisted) {
        /* This automatically subscribes to changes, so for a set/remove operation that
         * isn't interested in listening to changes we'll need to unsubscribe again after the operation. */
        client = clients[subscriberID] = new SharePointClient(message);
        client.referenceCount = 0;
    }

    switch (operation) {
        case 'init':
            if (!client.initialised) {
                client.init();
                client.initialised = true;
                client.on('message', (message) => {
                    message.subscriberID = subscriberID;
                    postMessage(message);
                });
            }
            break;
        case 'subscribe':
            client.subscribeToChanges();
            client.referenceCount++;
            break;
        case 'dispose':
            client.referenceCount--;
            if (client.referenceCount <= 0) {
                client.dispose();
            }
            break;
        case 'set':
            client.set(message.model);
            /* If the client was created for this set operation,
             * cancel all subscriptions that were automatically created on instantiation. */
            if (!clientExisted) {
                client.dispose();
            }
            break;
        case 'remove':
            client.remove(message.model);
            /* If the client was created for this remove operation,
             * cancel all subscriptions that were automatically created on instantiation. */
            if (!clientExisted) {
                client.dispose();
            }
            break;
        case 'get_cache':
            let cacheData = client.cache;
            postMessage({
                subscriberID: subscriberID,
                event: 'cache_data',
                cache: cacheData
            });
            break;
        case 'get_auth':
            try {
                let authData = await client.getAuth();
                postMessage({
                    subscriberID: subscriberID,
                    event: 'auth_result',
                    auth: authData
                });
            } catch (error) {
                console.log('Error whilst fetching user auth data: ', error);
            }
            break;
    }
};