"use strict";

(function() {
	
	class OfflineClient
	{
		constructor()
		{
			// Create a BroadcastChannel, if supported.
			this._broadcastChannel = (typeof BroadcastChannel === "undefined" ? null : new BroadcastChannel("offline"));
			
			// Queue of messages received before a message callback is set.
			this._queuedMessages = [];
			
			// The message callback.
			this._onMessageCallback = null;
			
			// If BroadcastChannel is supported, listen for messages.
			if (this._broadcastChannel)
				this._broadcastChannel.onmessage = (e => this._OnBroadcastChannelMessage(e));
		}
		
		_OnBroadcastChannelMessage(e)
		{
			// Have a message callback set: just forward the call.
			if (this._onMessageCallback)
			{
				this._onMessageCallback(e);
				return;
			}
			
			// Otherwise the app hasn't loaded far enough to set a message callback.
			// Buffer the incoming messages to replay when the app sets a callback.
			this._queuedMessages.push(e);
		}
		
		SetMessageCallback(f)
		{
			this._onMessageCallback = f;
			
			// Replay any queued messages through the handler, then clear the queue.
			for (let e of this._queuedMessages)
				this._onMessageCallback(e);
			
			this._queuedMessages.length = 0;
		}
	};
	
	// Create the offline client ASAP so we receive and start queueing any messages the SW broadcasts.
	window.OfflineClientInfo = new OfflineClient();
	
}());