|  | @@ -24,27 +24,55 @@
 | 
	
		
			
				|  |  |    };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    // Main function to embed the chatbot
 | 
	
		
			
				|  |  | -  function embedChatbot() {
 | 
	
		
			
				|  |  | +  async function embedChatbot() {
 | 
	
		
			
				|  |  |      if (!config || !config.token) {
 | 
	
		
			
				|  |  |        console.error(`${configKey} is empty or token is not provided`);
 | 
	
		
			
				|  |  |        return;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    async function compressAndEncodeBase64(input) {
 | 
	
		
			
				|  |  | +      const uint8Array = new TextEncoder().encode(input);
 | 
	
		
			
				|  |  | +      const compressedStream = new Response(
 | 
	
		
			
				|  |  | +          new Blob([uint8Array]).stream().pipeThrough(new CompressionStream('gzip'))
 | 
	
		
			
				|  |  | +      ).arrayBuffer();
 | 
	
		
			
				|  |  | +      const compressedUint8Array = new Uint8Array(await compressedStream);
 | 
	
		
			
				|  |  | +      return btoa(String.fromCharCode(...compressedUint8Array));
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    async function getCompressedInputsFromConfig() {
 | 
	
		
			
				|  |  | +      const inputs = config?.inputs || {};
 | 
	
		
			
				|  |  | +      const compressedInputs = {};
 | 
	
		
			
				|  |  | +      await Promise.all(
 | 
	
		
			
				|  |  | +        Object.entries(inputs).map(async ([key, value]) => {
 | 
	
		
			
				|  |  | +          compressedInputs[key] = await compressAndEncodeBase64(value);
 | 
	
		
			
				|  |  | +        })
 | 
	
		
			
				|  |  | +      );
 | 
	
		
			
				|  |  | +      return compressedInputs;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    const params = new URLSearchParams(await getCompressedInputsFromConfig());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      const baseUrl =
 | 
	
		
			
				|  |  |        config.baseUrl || `https://${config.isDev ? "dev." : ""}udify.app`;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    // pre-check the length of the URL
 | 
	
		
			
				|  |  | +    const iframeUrl = `${baseUrl}/chatbot/${config.token}?${params}`;
 | 
	
		
			
				|  |  | +    if(iframeUrl.length > 2048) {
 | 
	
		
			
				|  |  | +      console.error("The URL is too long, please reduce the number of inputs to prevent the bot from failing to load");
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      // Function to create the iframe for the chatbot
 | 
	
		
			
				|  |  |      function createIframe() {
 | 
	
		
			
				|  |  |        const iframe = document.createElement("iframe");
 | 
	
		
			
				|  |  |        iframe.allow = "fullscreen;microphone";
 | 
	
		
			
				|  |  |        iframe.title = "dify chatbot bubble window";
 | 
	
		
			
				|  |  |        iframe.id = iframeId;
 | 
	
		
			
				|  |  | -      iframe.src = `${baseUrl}/chatbot/${config.token}`;
 | 
	
		
			
				|  |  | +      iframe.src = iframeUrl;
 | 
	
		
			
				|  |  |        iframe.style.cssText = `
 | 
	
		
			
				|  |  | -        border: none; position: fixed; flex-direction: column; justify-content: space-between; 
 | 
	
		
			
				|  |  | -        box-shadow: rgba(150, 150, 150, 0.2) 0px 10px 30px 0px, rgba(150, 150, 150, 0.2) 0px 0px 0px 1px; 
 | 
	
		
			
				|  |  | -        bottom: 5rem; right: 1rem; width: 24rem; max-width: calc(100vw - 2rem); height: 40rem; 
 | 
	
		
			
				|  |  | -        max-height: calc(100vh - 6rem); border-radius: 0.75rem; display: flex; z-index: 2147483647; 
 | 
	
		
			
				|  |  | +        border: none; position: fixed; flex-direction: column; justify-content: space-between;
 | 
	
		
			
				|  |  | +        box-shadow: rgba(150, 150, 150, 0.2) 0px 10px 30px 0px, rgba(150, 150, 150, 0.2) 0px 0px 0px 1px;
 | 
	
		
			
				|  |  | +        bottom: 5rem; right: 1rem; width: 24rem; max-width: calc(100vw - 2rem); height: 40rem;
 | 
	
		
			
				|  |  | +        max-height: calc(100vh - 6rem); border-radius: 0.75rem; display: flex; z-index: 2147483647;
 | 
	
		
			
				|  |  |          overflow: hidden; left: unset; background-color: #F3F4F6;
 | 
	
		
			
				|  |  |        `;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -106,19 +134,19 @@
 | 
	
		
			
				|  |  |        document.head.appendChild(styleSheet);
 | 
	
		
			
				|  |  |        styleSheet.sheet.insertRule(`
 | 
	
		
			
				|  |  |          #${containerDiv.id} {
 | 
	
		
			
				|  |  | -          position: fixed; 
 | 
	
		
			
				|  |  | +          position: fixed;
 | 
	
		
			
				|  |  |            bottom: var(--${containerDiv.id}-bottom, 1rem);
 | 
	
		
			
				|  |  |            right: var(--${containerDiv.id}-right, 1rem);
 | 
	
		
			
				|  |  |            left: var(--${containerDiv.id}-left, unset);
 | 
	
		
			
				|  |  |            top: var(--${containerDiv.id}-top, unset);
 | 
	
		
			
				|  |  |            width: var(--${containerDiv.id}-width, 50px);
 | 
	
		
			
				|  |  |            height: var(--${containerDiv.id}-height, 50px);
 | 
	
		
			
				|  |  | -          border-radius: var(--${containerDiv.id}-border-radius, 25px); 
 | 
	
		
			
				|  |  | +          border-radius: var(--${containerDiv.id}-border-radius, 25px);
 | 
	
		
			
				|  |  |            background-color: var(--${containerDiv.id}-bg-color, #155EEF);
 | 
	
		
			
				|  |  |            box-shadow: var(--${containerDiv.id}-box-shadow, rgba(0, 0, 0, 0.2) 0px 4px 8px 0px);
 | 
	
		
			
				|  |  |            cursor: pointer;
 | 
	
		
			
				|  |  | -          z-index: 2147483647; 
 | 
	
		
			
				|  |  | -          transition: all 0.2s ease-in-out 0s; 
 | 
	
		
			
				|  |  | +          z-index: 2147483647;
 | 
	
		
			
				|  |  | +          transition: all 0.2s ease-in-out 0s;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |        `);
 | 
	
		
			
				|  |  |        styleSheet.sheet.insertRule(`
 | 
	
	
		
			
				|  | @@ -154,7 +182,8 @@
 | 
	
		
			
				|  |  |          } else {
 | 
	
		
			
				|  |  |            document.addEventListener('keydown', handleEscKey);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -        
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          resetIframePosition();
 | 
	
		
			
				|  |  |        });
 | 
	
		
			
				|  |  |  
 |