@jingbof/rets-client
Version:
RETS (Real Estate Transaction Standards) Client in Typescript
79 lines (64 loc) • 2.02 kB
text/typescript
import axios, { AxiosRequestConfig } from 'axios'
import axiosCookieJarSupport from 'axios-cookiejar-support'
import { Store, CookieJar } from 'tough-cookie'
import { promises as fs, createWriteStream } from 'fs'
import { createHash } from 'crypto'
// import { loginParser } from 'parsers'
import { PassThrough, Readable, Transform } from 'stream'
import { maxHeaderSize } from 'http'
import { deflateRaw } from 'zlib'
import {
IRetsResponse,
IRetsClientOptions,
IRetsRequestConfig,
RetsRequestMethod,
RetsKeys,
} from '../types'
axiosCookieJarSupport(axios)
const cookieJar = new CookieJar()
const generateHeaders = () => ({
'User-Agent': 'RETS NodeJS-Client/1.x',
'RETS-Version': 'RETS/1.7',
})
interface ExecuteCallType {
stream: Readable
headers: Record<string, string>
}
export const executeCall = async (
config: IRetsRequestConfig,
payload?: any,
headers?: any,
): Promise<any> => {
const { method, url, auth, debugResponseFilename } = config
const instance = axios.create()
const result = await instance({
jar: cookieJar,
method,
url,
headers: {
...generateHeaders(),
...headers,
},
auth,
withCredentials: true,
responseType: 'stream',
// transformResponse: (data, headers) => {
// },
...(method === RetsRequestMethod.Get ? { params: { ...payload } } : { data: { ...payload } }),
})
const { data, headers: responseHeaders } = result
const debugFilename =
typeof debugResponseFilename === 'function'
? debugResponseFilename(config)
: debugResponseFilename
const stream = new PassThrough()
const fileSave = new PassThrough()
if (debugFilename !== undefined) {
// console.log('write to', debugFilename)
// fileSave.on('data', (data) => console.log('data', data))
// fileSave.on('close', () => console.log('close', debugFilename))
fileSave.pipe(createWriteStream(debugFilename))
}
data.pipe(stream) // .pipe(fileSave)
return { stream, headers: responseHeaders }
}