1
0
mirror of https://github.com/sasjs/adapter.git synced 2026-06-08 18:20:20 +00:00

fix(debug): add viya debug log parser - parse JSON from inline blob with webout

This commit is contained in:
mulahasanovic
2026-05-13 14:26:12 +02:00
parent 4cae9b5472
commit 8f726c0ac9
2 changed files with 25 additions and 2 deletions
+11 -2
View File
@@ -1,18 +1,27 @@
import { getValidJson } from './getValidJson' import { getValidJson } from './getValidJson'
import { parseWeboutResponse } from './parseWeboutResponse'
/** /**
* When querying a Viya job using the Web approach with _DEBUG=log (used when * When querying a Viya job using the Web approach with _DEBUG=log (used when
* runAsTask is true), the webout JSON is inlined into the response via: * runAsTask is true), the webout JSON is inlined into the response via:
* var blob = new Blob([`{...}`], {type: 'application/json'}); * var blob = new Blob([`{...}`], {type: 'application/json'});
* On abort/error paths the same shape is used but with text/plain and
* weboutBEGIN/END markers around the JSON:
* var blob = new Blob([`>>weboutBEGIN<<\n{...}\n>>weboutEND<<\n`], {type: 'text/plain'});
* No follow-up request is needed — extract and parse the JSON directly. * No follow-up request is needed — extract and parse the JSON directly.
*/ */
export const parseSasViyaLogDebugResponse = async (response: string) => { export const parseSasViyaLogDebugResponse = async (response: string) => {
const blobMatch = response.match( const blobMatch = response.match(
/new Blob\(\[`([\s\S]*?)`\],\s*\{type:\s*'application\/json'\}\)/ /new Blob\(\[`([\s\S]*?)`\],\s*\{type:\s*'(?:application\/json|text\/plain)'\}\)/
) )
if (!blobMatch) { if (!blobMatch) {
throw new Error('Unable to find webout blob in debug log response.') throw new Error('Unable to find webout blob in debug log response.')
} }
return getValidJson(blobMatch[1]) const blobContent = blobMatch[1]
const stripped = blobContent.includes('>>weboutBEGIN<<')
? parseWeboutResponse(blobContent)
: blobContent
return getValidJson(stripped)
} }
@@ -31,6 +31,20 @@ var blob = new Blob([\`{"SYSDATE" : "13MAY26"
expect(result).toEqual(resultData) expect(result).toEqual(resultData)
}) })
it('should extract and parse JSON wrapped in weboutBEGIN/END (text/plain blob)', async () => {
const resultData = { SYSCC: '1012', SYSERRORTEXT: 'File missing.' }
const response = `<script>
var blob = new Blob([\`>>weboutBEGIN<<
${JSON.stringify(resultData)}
>>weboutEND<<
\`], {type: 'text/plain'});
</script>`
const result = await parseSasViyaLogDebugResponse(response)
expect(result).toEqual(resultData)
})
it('should throw an error if blob is not found', async () => { it('should throw an error if blob is not found', async () => {
const response = `<html><body>No blob here</body></html>` const response = `<html><body>No blob here</body></html>`