{
  "version": 3,
  "sources": ["../../../src/providers/http-polling/utils.ts"],
  "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport apiFetch from '@wordpress/api-fetch';\n\n/**\n * Internal dependencies\n */\nimport {\n\ttype SyncPayload,\n\ttype SyncResponse,\n\ttype SyncUpdate,\n\tSyncUpdateType,\n\ttype UpdateQueue,\n} from './types';\n\nconst SYNC_API_PATH = '/wp-sync/v1/updates';\n\nexport function uint8ArrayToBase64( data: Uint8Array ): string {\n\tlet binary = '';\n\tconst len = data.byteLength;\n\tfor ( let i = 0; i < len; i++ ) {\n\t\tbinary += String.fromCharCode( data[ i ] );\n\t}\n\treturn globalThis.btoa( binary );\n}\n\nexport function base64ToUint8Array( base64: string ): Uint8Array {\n\tconst binaryString = globalThis.atob( base64 );\n\tconst len = binaryString.length;\n\tconst bytes = new Uint8Array( len );\n\tfor ( let i = 0; i < len; i++ ) {\n\t\tbytes[ i ] = binaryString.charCodeAt( i );\n\t}\n\treturn bytes;\n}\n\nexport function createSyncUpdate(\n\tdata: Uint8Array,\n\ttype: SyncUpdateType\n): SyncUpdate {\n\treturn {\n\t\tdata: uint8ArrayToBase64( data ),\n\t\ttype,\n\t};\n}\n\nexport function createUpdateQueue(\n\tinitial: SyncUpdate[] = [],\n\tpaused = true\n): UpdateQueue {\n\tlet isPaused = paused;\n\tconst updates: SyncUpdate[] = [ ...initial ];\n\n\treturn {\n\t\tadd( update: SyncUpdate ): void {\n\t\t\tupdates.push( update );\n\t\t},\n\t\taddBulk( bulkUpdates: SyncUpdate[] ): void {\n\t\t\tif ( 0 === bulkUpdates.length ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tupdates.push( ...bulkUpdates );\n\t\t},\n\t\tclear(): void {\n\t\t\tupdates.splice( 0, updates.length );\n\t\t},\n\t\tget(): SyncUpdate[] {\n\t\t\tif ( isPaused ) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\t// Return and clear the queue (take operation).\n\t\t\t// Use restore() to put updates back on failure.\n\t\t\treturn updates.splice( 0, updates.length );\n\t\t},\n\t\tpause(): void {\n\t\t\tisPaused = true;\n\t\t},\n\t\trestore( restoredUpdates: SyncUpdate[] ): void {\n\t\t\t// Restore to front of the queue on failure. Remove compaction updates.\n\t\t\tconst filtered = restoredUpdates.filter(\n\t\t\t\t( u ) => u.type !== SyncUpdateType.COMPACTION\n\t\t\t);\n\n\t\t\tif ( 0 === filtered.length ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tupdates.unshift( ...filtered );\n\t\t},\n\t\tresume(): void {\n\t\t\tisPaused = false;\n\t\t},\n\t\tsize(): number {\n\t\t\treturn updates.length;\n\t\t},\n\t};\n}\n\n/**\n * Post a sync update and receive updates the client is missing.\n *\n * @param payload The sync payload including data and after cursor\n * @return The sync server response\n */\nexport function postSyncUpdate(\n\tpayload: SyncPayload\n): Promise< SyncResponse > {\n\treturn apiFetch( {\n\t\tmethod: 'POST',\n\t\tpath: SYNC_API_PATH,\n\t\tdata: payload,\n\t} );\n}\n\n/**\n * Fire-and-forget variant of postSyncUpdate. Uses `keepalive` so the\n * request survives page unload, and errors are silently ignored.\n *\n * @param payload The sync payload to send.\n */\nexport function postSyncUpdateNonBlocking( payload: SyncPayload ): void {\n\tif ( payload.rooms.length === 0 ) {\n\t\treturn;\n\t}\n\n\tapiFetch( {\n\t\tmethod: 'POST',\n\t\tpath: SYNC_API_PATH,\n\t\tdata: payload,\n\t\tkeepalive: true,\n\t} ).catch( () => {} );\n}\n\n/**\n * Parse an integer from an unknown value, returning a default if parsing fails.\n *\n * @param value        The value to parse as an integer.\n * @param defaultValue The default value to return if parsing fails.\n * @return The parsed integer or the default value.\n */\nexport function intValueOrDefault(\n\tvalue: unknown,\n\tdefaultValue: number\n): number {\n\tconst intValue = parseInt( String( value ), 10 );\n\n\treturn isNaN( intValue ) ? defaultValue : intValue;\n}\n"],
  "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,uBAAqB;AAKrB,mBAMO;AAEP,IAAM,gBAAgB;AAEf,SAAS,mBAAoB,MAA2B;AAC9D,MAAI,SAAS;AACb,QAAM,MAAM,KAAK;AACjB,WAAU,IAAI,GAAG,IAAI,KAAK,KAAM;AAC/B,cAAU,OAAO,aAAc,KAAM,CAAE,CAAE;AAAA,EAC1C;AACA,SAAO,WAAW,KAAM,MAAO;AAChC;AAEO,SAAS,mBAAoB,QAA6B;AAChE,QAAM,eAAe,WAAW,KAAM,MAAO;AAC7C,QAAM,MAAM,aAAa;AACzB,QAAM,QAAQ,IAAI,WAAY,GAAI;AAClC,WAAU,IAAI,GAAG,IAAI,KAAK,KAAM;AAC/B,UAAO,CAAE,IAAI,aAAa,WAAY,CAAE;AAAA,EACzC;AACA,SAAO;AACR;AAEO,SAAS,iBACf,MACA,MACa;AACb,SAAO;AAAA,IACN,MAAM,mBAAoB,IAAK;AAAA,IAC/B;AAAA,EACD;AACD;AAEO,SAAS,kBACf,UAAwB,CAAC,GACzB,SAAS,MACK;AACd,MAAI,WAAW;AACf,QAAM,UAAwB,CAAE,GAAG,OAAQ;AAE3C,SAAO;AAAA,IACN,IAAK,QAA2B;AAC/B,cAAQ,KAAM,MAAO;AAAA,IACtB;AAAA,IACA,QAAS,aAAkC;AAC1C,UAAK,MAAM,YAAY,QAAS;AAC/B;AAAA,MACD;AAEA,cAAQ,KAAM,GAAG,WAAY;AAAA,IAC9B;AAAA,IACA,QAAc;AACb,cAAQ,OAAQ,GAAG,QAAQ,MAAO;AAAA,IACnC;AAAA,IACA,MAAoB;AACnB,UAAK,UAAW;AACf,eAAO,CAAC;AAAA,MACT;AAIA,aAAO,QAAQ,OAAQ,GAAG,QAAQ,MAAO;AAAA,IAC1C;AAAA,IACA,QAAc;AACb,iBAAW;AAAA,IACZ;AAAA,IACA,QAAS,iBAAsC;AAE9C,YAAM,WAAW,gBAAgB;AAAA,QAChC,CAAE,MAAO,EAAE,SAAS,4BAAe;AAAA,MACpC;AAEA,UAAK,MAAM,SAAS,QAAS;AAC5B;AAAA,MACD;AAEA,cAAQ,QAAS,GAAG,QAAS;AAAA,IAC9B;AAAA,IACA,SAAe;AACd,iBAAW;AAAA,IACZ;AAAA,IACA,OAAe;AACd,aAAO,QAAQ;AAAA,IAChB;AAAA,EACD;AACD;AAQO,SAAS,eACf,SAC0B;AAC1B,aAAO,iBAAAA,SAAU;AAAA,IAChB,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,EACP,CAAE;AACH;AAQO,SAAS,0BAA2B,SAA6B;AACvE,MAAK,QAAQ,MAAM,WAAW,GAAI;AACjC;AAAA,EACD;AAEA,uBAAAA,SAAU;AAAA,IACT,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAW;AAAA,EACZ,CAAE,EAAE,MAAO,MAAM;AAAA,EAAC,CAAE;AACrB;AASO,SAAS,kBACf,OACA,cACS;AACT,QAAM,WAAW,SAAU,OAAQ,KAAM,GAAG,EAAG;AAE/C,SAAO,MAAO,QAAS,IAAI,eAAe;AAC3C;",
  "names": ["apiFetch"]
}
