403Webshell
Server IP : 80.87.202.40  /  Your IP : 216.73.216.169
Web Server : Apache
System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64
User : bitrix ( 600)
PHP Version : 8.2.27
Disable Function : NONE
MySQL : OFF |  cURL : ON |  WGET : ON |  Perl : ON |  Python : OFF |  Sudo : ON |  Pkexec : ON
Directory :  /home/bitrix/ext_www/rospirotorg.ru/bitrix/js/pull/queuemanager/src/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/js/pull/queuemanager/src/queuemanager.js
import { Event, Loc, Text, Type } from 'main.core';
import { BaseEvent, EventEmitter } from 'main.core.events';
import { UI } from 'ui.notification';
import Queue from './queue';
import { Options, PullData } from './queuemanagertype';

export default class QueueManager
{
	#options: Options;
	#queue: Queue;
	#notifier: BX.UI.Notification.Balloon;
	#openedSlidersCount: Number;

	static eventIds: Set<string> = new Set();

	static registerRandomEventId(prefix: string = null): string
	{
		let eventId = Text.getRandom(12);
		if (Type.isStringFilled(prefix))
		{
			eventId = `${prefix}-${eventId}`;
		}

		this.registerEventId(eventId);

		return eventId;
	}

	static registerEventId(eventId: string): void
	{
		this.eventIds.add(eventId);
	}

	constructor(options: Options)
	{
		this.#options = options;

		const { config, callbacks } = options;

		this.#queue = new Queue({
			loadItemsDelay: config?.loadItemsDelay,
			maxPendingItems: config?.maxPendingItems,
			callbacks: {
				onBeforeExecute: callbacks.onBeforeQueueExecute,
				onExecute: callbacks.onQueueExecute,
			},
		});
		this.#openedSlidersCount = 0;

		this.initEventEmitter();

		const { moduleId, userId } = options;
		if (Type.isStringFilled(moduleId) && userId > 0)
		{
			Event.ready(() => this.init());
		}
	}

	initEventEmitter(): void
	{
		this.eventEmitter = new EventEmitter();
		this.eventEmitter.setEventNamespace('BX.Pull.QueueManager');
	}

	init(): void
	{
		if (!BX.PULL)
		{
			console.error('BX.PULL is not initialized');

			return;
		}

		this.subscribe();
		this.bindEvents();
	}

	subscribe(): void
	{
		const { moduleId, pullTag } = this.#options;

		BX.PULL.subscribe({
			moduleId,
			callback: (data) => this.onPullSubscribeCallback(data),
		});

		if (Type.isStringFilled(pullTag))
		{
			BX.PULL.extendWatch(pullTag);
		}
	}

	bindEvents(): void
	{
		if (Type.isPlainObject(this.#options.events))
		{
			for (const [eventName, callback] of Object.entries(this.#options.events))
			{
				if (Type.isFunction(callback))
				{
					this.eventEmitter.subscribe(eventName, (event) => callback(event));
				}
			}
		}

		Event.bind(document, 'visibilitychange', () => this.onDocumentVisibilityChange());

		EventEmitter.subscribe('SidePanel.Slider:onOpen', () => {
			this.#openedSlidersCount++;
			this.#queue.freeze();
		});

		EventEmitter.subscribe('SidePanel.Slider:onClose', () => {
			this.#openedSlidersCount--;
			if (this.#openedSlidersCount <= 0)
			{
				this.#openedSlidersCount = 0;
				this.#queue.unfreeze();
				this.onTabActivated();
			}
		});
	}

	onDocumentVisibilityChange(): void
	{
		if (!document.hidden)
		{
			this.onTabActivated();
		}
	}

	onPullSubscribeCallback(pullData: PullData): void
	{
		const { pullTag } = this.#options;
		let { additionalPullTags } = this.#options;

		if (!Type.isArray(additionalPullTags))
		{
			additionalPullTags = [];
		}

		if (
			Type.isStringFilled(pullTag)
			&& pullData.command !== pullTag
			&& !additionalPullTags.includes(pullTag)
		)
		{
			return;
		}

		const event = new BaseEvent({
			data: {
				pullData,
				queueItems: this.#queue.getAllAsArray(),
				options: this.#options,
				promises: [],
			},
		});
		this.eventEmitter.emit('onBeforePull', event);
		if (event.isDefaultPrevented())
		{
			return;
		}

		const { params } = pullData;

		if (!Type.isStringFilled(params.eventName))
		{
			return;
		}

		if (QueueManager.eventIds.has(params.eventId))
		{
			return;
		}

		if (this.#queue.isOverflow())
		{
			return;
		}

		this.eventEmitter.emit('onPull', event);
		if (event.isDefaultPrevented())
		{
			return;
		}

		void Promise
			.all(event.data.promises)
			.then((values) => {
				if (!Type.isArrayFilled(values))
				{
					return;
				}

				values.forEach((item) => {
					const { data } = item;
					this.#queue.push(`${data.id}_${params.eventName}`, data);
				});

				this.#queue.loadItem(false, params.ignoreDelay || false);
			})
		;
	}

	showOutdatedDataDialog(): void
	{
		if (this.#hasManyOpenSliders())
		{
			return;
		}

		const sliderInstance = this.#getSliderInstance();
		if (sliderInstance)
		{
			EventEmitter.subscribe(
				sliderInstance,
				'SidePanel.Slider:onClose',
				this.#createAndShowNotify.bind(this),
			);
		}
		else
		{
			this.#createAndShowNotify();
		}
	}

	#hasManyOpenSliders(): boolean
	{
		return (top.BX && top.BX.SidePanel && top.BX.SidePanel.Instance.getOpenSlidersCount() > 1);
	}

	#getSliderInstance(): BX.SidePanel.Slider | null
	{
		if (top.BX && top.BX.SidePanel)
		{
			const slider = top.BX.SidePanel.Instance.getTopSlider();
			if (slider && slider.isOpen())
			{
				return slider;
			}
		}

		return null;
	}

	#createAndShowNotify(): void
	{
		const showOutdatedDataDialog = this.#options.config?.showOutdatedDataDialog;
		const { onReload } = this.#options.callbacks;
		if (
			(Type.isBoolean(showOutdatedDataDialog) && showOutdatedDataDialog === false)
			|| !Type.isFunction(onReload)
		)
		{
			return;
		}

		if (this.#notifier)
		{
			if (
				this.#notifier.getState() === BX.UI.Notification.State.OPENING
				|| this.#notifier.getState() === BX.UI.Notification.State.OPEN
			)
			{
				return;
			}

			this.#notifier.show();

			return;
		}

		this.#notifier = UI.Notification.Center.notify({
			content: Loc.getMessage('PULL_QUEUEMANAGER_NOTIFY_OUTDATED_DATA'),
			closeButton: false,
			autoHide: false,
			actions: [{
				title: Loc.getMessage('PULL_QUEUEMANAGER_RELOAD'),
				events: {
					click: (event, balloon) => {
						balloon.close();
						onReload();
						this.#queue.clear();
					},
				},
			}],
		});
	}

	onTabActivated(): void
	{
		if (this.#queue.isOverflow())
		{
			this.showOutdatedDataDialog();

			return;
		}

		if (!this.#queue.isEmpty())
		{
			this.#queue.loadItem();
		}
	}

	hasInQueue(id: number): boolean
	{
		return this.#queue.has(id);
	}

	deleteFromQueue(id: number): void
	{
		this.#queue.delete(id);
	}

	getLoadItemsDelay(): number
	{
		return this.#queue.getLoadItemsDelay();
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit