Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Replace request with fetch #528

Merged
merged 5 commits into from
Dec 14, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 13 additions & 25 deletions lib/adBlockRustUtils.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ const { uBlockResources } = require('adblock-rs')

const path = require('path')
const fs = require('fs').promises
const request = require('request')

const uBlockLocalRoot = 'submodules/uBlock'
const uBlockWebAccessibleResources = path.join(uBlockLocalRoot, 'src/web_accessible_resources')
Expand All @@ -29,19 +28,16 @@ const resourcesPubkey = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7Qk6xtml8Si
* @param url The URL to fetch from
* @return a promise that resolves with the content of the list or rejects with an error message.
*/
const requestJSON = (url) => new Promise((resolve, reject) => {
request.get(url, function (error, response, body) {
if (error) {
reject(new Error(`Request error: ${error}`))
return
const requestJSON = (url) => {
return fetch(url).then(response => {
if (response.status !== 200) {
throw new Error(`Error status ${response.status} ${response.statusText} returned for URL: ${url}`)
}
if (response.statusCode !== 200) {
reject(new Error(`Error status code ${response.statusCode} returned for URL: ${url}`))
return
}
resolve(JSON.parse(body))
return response.json()
}).catch(error => {
throw new Error(`Error when fetching ${url}: ${error.cause}`)
})
})
}

const getDefaultLists = requestJSON.bind(null, defaultListsUrl)
const getRegionalLists = requestJSON.bind(null, regionalListsUrl)
Expand All @@ -54,24 +50,16 @@ const lazyInit = (fn) => {
}
}

const generateResources = lazyInit(() => new Promise((resolve, reject) => {
const generateResources = lazyInit(async () => {
const resourceData = uBlockResources(
uBlockWebAccessibleResources,
uBlockRedirectEngine,
uBlockScriptlets
)
request.get(braveResourcesUrl, function (error, response, body) {
if (error) {
reject(new Error(`Request error: ${error}`))
}
if (response.statusCode !== 200) {
reject(new Error(`Error status code ${response.statusCode} returned for URL: ${braveResourcesUrl}`))
}
const braveResources = JSON.parse(body)
resourceData.push(...braveResources)
resolve(JSON.stringify(resourceData))
})
}))
const braveResources = await requestJSON(braveResourcesUrl)
resourceData.push(...braveResources)
return JSON.stringify(resourceData)
})

/**
* Returns a promise that generates a resources file from the uBlock Origin
Expand Down
34 changes: 16 additions & 18 deletions lib/ntpUtil.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ const childProcess = require('child_process')
const fs = require('fs')
const path = require('path')
const util = require('../lib/util')
const request = require('request')
const { Readable } = require('stream')
const { finished } = require('stream/promises')

const jsonSchemaVersion = 1

Expand Down Expand Up @@ -98,21 +99,17 @@ const prepareAssets = (jsonFileUrl, targetResourceDir, targetJsonFileName) => {

// Download and parse jsonFileUrl.
// If it doesn't exist, create with empty object.
request(jsonFileUrl, async function (error, response, body) {
if (error) {
console.error(`Error from ${jsonFileUrl}:`, error)
return reject(error)
}
if (response && response.statusCode === 200) {
jsonFileBody = body
fetch(jsonFileUrl, async function (response) {
if (response.status === 200) {
jsonFileBody = await response.text()
}
let photoData = {}
try {
console.log(`Start - json file ${jsonFileUrl} parsing`)
photoData = JSON.parse(jsonFileBody)
} catch (err) {
console.error(`Invalid json file ${jsonFileUrl}`)
return reject(error)
return reject(err)
}
console.log(`Done - json file ${jsonFileUrl} parsing`)
// Make sure the data has a schema version so that clients can opt to parse or not
Expand All @@ -124,26 +121,27 @@ const prepareAssets = (jsonFileUrl, targetResourceDir, targetJsonFileName) => {
// have a schema version.
incomingSchemaVersion = jsonSchemaVersion
} else if (!isValidSchemaVersion(incomingSchemaVersion)) {
console.error(`Error: Cannot parse JSON data at ${jsonFileUrl} since it has a schema version of ${incomingSchemaVersion} but we expected ${jsonSchemaVersion}! This region will not be updated.`)
const error = `Error: Cannot parse JSON data at ${jsonFileUrl} since it has a schema version of ${incomingSchemaVersion} but we expected ${jsonSchemaVersion}! This region will not be updated.`
console.error(error)
return reject(error)
}

createPhotoJsonFile(path.join(targetResourceDir, 'photo.json'), JSON.stringify(photoData))

// Download image files that specified in jsonFileUrl
const imageFileNameList = getImageFileNameListFrom(photoData)
const downloadOps = imageFileNameList.map((imageFileName) => new Promise(resolve => {
const downloadOps = imageFileNameList.map(async (imageFileName) => {
const targetImageFilePath = path.join(targetResourceDir, imageFileName)
const targetImageFileUrl = new URL(imageFileName, jsonFileUrl).href
request(targetImageFileUrl)
.pipe(fs.createWriteStream(targetImageFilePath))
.on('finish', () => {
console.log(targetImageFileUrl)
resolve()
})
}))
const response = await fetch(targetImageFileUrl)
const ws = fs.createWriteStream(targetImageFilePath)
return finished(Readable.fromWeb(response.body).pipe(ws))
.then(() => console.log(targetImageFileUrl))
})
await Promise.all(downloadOps)
resolve()
}).catch(error => {
throw new Error(`Error from ${jsonFileUrl}: ${error.cause}`)
})
})
}
Expand Down
18 changes: 6 additions & 12 deletions lib/util.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,26 +7,20 @@ const crypto = require('crypto')
const fs = require('fs')
const mkdirp = require('mkdirp')
const path = require('path')
const request = require('request')
const s3 = require('s3-client')
const unzip = require('unzip-crx-3')
const AWS = require('aws-sdk')
const { Readable } = require('stream')
const { finished } = require('stream/promises')

const DynamoDBTableName = 'Extensions'
const FirstVersion = '1.0.0'

const downloadExtensionFromCWS = (componentId, chromiumVersion, outputPath) => {
const downloadExtensionFromCWS = async (componentId, chromiumVersion, outputPath) => {
const url = `https://clients2.google.com/service/update2/crx?response=redirect&prodversion=${chromiumVersion}&acceptformat=crx3&x=id%3D${componentId}%26uc`
return new Promise((resolve, reject) => {
request(url)
.pipe(fs.createWriteStream(outputPath))
.on('finish', () => {
resolve()
})
.on('error', () => {
reject(new Error('Failed to make request to Chrome Web Store'))
})
})
const response = await fetch(url)
const ws = fs.createWriteStream(outputPath)
return finished(Readable.fromWeb(response.body).pipe(ws))
}

const generateCRXFile = (binary, crxFile, privateKeyFile, publisherProofKey,
Expand Down
1 change: 0 additions & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
"https-everywhere-builder": "github:brave/https-everywhere-builder",
"playlist-component": "github:brave/playlist-component",
"recursive-readdir-sync": "1.0.6",
"request": "2.88.2",
"s3-client": "4.4.2",
"unzip-crx-3": "0.2.0"
},
Expand Down
54 changes: 19 additions & 35 deletions scripts/generateAdBlockRustDataFiles.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ const { Engine, FilterFormat, FilterSet, RuleTypes } = require('adblock-rs')
const { generateResourcesFile, getDefaultLists, getRegionalLists, defaultPlaintextComponentId, resourcesComponentId, regionalCatalogComponentId } = require('../lib/adBlockRustUtils')
const path = require('path')
const fs = require('fs')
const request = require('request')

/**
* Returns a promise that which resolves with the list data
Expand All @@ -15,18 +14,13 @@ const request = require('request')
* @return a promise that resolves with the content of the list or rejects with an error message.
*/
const getListBufferFromURL = (listURL) => {
return new Promise((resolve, reject) => {
request.get(listURL, function (error, response, body) {
if (error) {
reject(new Error(`Request error for ${listURL}: ${error}`))
return
}
if (response.statusCode !== 200) {
reject(new Error(`Error status code ${response.statusCode} returned for URL: ${listURL}`))
return
}
resolve(body)
})
return fetch(listURL).then(response => {
if (response.status !== 200) {
throw new Error(`Error status ${response.status} ${response.statusText} returned for URL: ${listURL}`)
}
return response.text()
}).catch(error => {
throw new Error(`Error when fetching ${listURL}: ${error.cause}`)
})
}

Expand Down Expand Up @@ -95,8 +89,7 @@ const generatePlaintextListFromLists = (listBuffers, outSubdir) => {
}

/**
* Convenience function that uses getListBufferFromURL and generateDataFileFromLists
* to construct a DAT file from a URL.
* Convenience function that prepares adblock components for a particular regional list.
*
* @param listURL the URL of the list to fetch.
* @param the format of the filter list at the given URL.
Expand All @@ -111,24 +104,15 @@ const generateDataFileFromRegionalCatalogEntry = (entry) => {
const uuid = entry.uuid
const outputDATFilename = `rs-${entry.uuid}.dat`
const listTextComponent = entry.list_text_component
return new Promise((resolve, reject) => {
console.log(`${langs} ${listURL}...`)
request.get(listURL, function (error, response, body) {
if (error) {
reject(new Error(`Request error for ${listURL}: ${error}`))
return
}
if (response.statusCode !== 200) {
reject(new Error(`Error status code ${response.statusCode} returned for URL: ${listURL}`))
return
}
generateDataFileFromLists([{ title, format, data: body }], outputDATFilename, uuid)
if (listTextComponent !== undefined) {
const outPath = getOutPath('list.txt', listTextComponent.component_id)
fs.writeFileSync(outPath, enforceBraveDirectives(title, body))
}
resolve()
})
console.log(`${langs} ${listURL}...`)
return getListBufferFromURL(listURL).then(body => {
generateDataFileFromLists([{ title, format, data: body }], outputDATFilename, uuid)
if (listTextComponent !== undefined) {
const outPath = getOutPath('list.txt', listTextComponent.component_id)
fs.writeFileSync(outPath, enforceBraveDirectives(title, body))
}
}).catch(error => {
throw new Error(`Error when fetching ${listURL}: ${error.cause}`)
})
}

Expand All @@ -145,7 +129,7 @@ const generateDataFilesForAllRegions = () => {
fs.writeFileSync(getOutPath('regional_catalog.json', 'default'), catalogString)
fs.writeFileSync(getOutPath('regional_catalog.json', regionalCatalogComponentId), catalogString)
resolve()
}).then(Promise.all(regions.map(region =>
}).then(() => Promise.all(regions.map(region =>
generateDataFileFromRegionalCatalogEntry(region)
)))
})
Expand All @@ -171,7 +155,7 @@ const generateDefaultDataFiles = (lists) => {
return p
}

const generateDataFilesForResourcesComponent = async () => {
const generateDataFilesForResourcesComponent = () => {
return generateResourcesFile(getOutPath('resources.json', resourcesComponentId))
}

Expand Down
33 changes: 15 additions & 18 deletions scripts/generateBraveAdsResourcesComponentInputFiles.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@
const path = require('path')
const mkdirp = require('mkdirp')
const fs = require('fs-extra')
const request = require('request')
const commander = require('commander')
const { Readable } = require('stream')
const { finished } = require('stream/promises')

const getComponentList = () => {
return [
Expand Down Expand Up @@ -79,19 +80,15 @@ const getComponentList = () => {
function downloadComponentInputFiles (manifestFileName, manifestUrl, outDir) {
return new Promise(function (resolve, reject) {
let manifestBody = '{}'
request(manifestUrl, async function (error, response, body) {
if (error) {
console.error(`Error from ${manifestUrl}:`, error)
return reject(error)
}

if (response && response.statusCode === 200) {
manifestBody = body
fetch(manifestUrl, async function (response) {
if (response.status === 200) {
manifestBody = await response.text()
}

const manifestJson = JSON.parse(manifestBody)
if (!manifestJson.schemaVersion) {
console.error('Error: Missing schema version')
const error = 'Error: Missing schema version'
console.error(error)
return reject(error)
}

Expand All @@ -105,20 +102,20 @@ function downloadComponentInputFiles (manifestFileName, manifestUrl, outDir) {
})
}

const downloadOps = fileList.map((fileName) => new Promise(resolve => {
const downloadOps = fileList.map(async (fileName) => {
const resourceFileOutPath = path.join(outDir, fileName)
const resourceFileUrl = new URL(fileName, manifestUrl).href
request(resourceFileUrl)
.pipe(fs.createWriteStream(resourceFileOutPath))
.on('finish', () => {
console.log(resourceFileUrl)
resolve()
})
}))
const response = await fetch(resourceFileUrl)
const ws = fs.createWriteStream(resourceFileOutPath)
return finished(Readable.fromWeb(response.body).pipe(ws))
.then(() => console.log(resourceFileUrl))
})

await Promise.all(downloadOps)

resolve()
}).catch(error => {
throw new Error(`Error from ${manifestUrl}: ${error.cause}`)
})
})
}
Expand Down
Loading