Skip to content

Commit 3a1915a

Browse files
xingfujiang72161674
andauthored
feat: 增加在线签名功能 (#51)
Co-authored-by: 72161674 <[email protected]>
1 parent 790efe1 commit 3a1915a

File tree

6 files changed

+123
-3
lines changed

6 files changed

+123
-3
lines changed
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import http from 'http'
2+
import fs from 'fs'
3+
import path from 'path'
4+
import { URL } from 'url'
5+
import { colorconsole } from '@hap-toolkit/shared-utils'
6+
7+
function SignOnlinePlugin(options) {
8+
this.options = options
9+
}
10+
11+
SignOnlinePlugin.prototype.apply = function (compiler) {
12+
const options = this.options
13+
14+
compiler.hooks.done.tapAsync('SignOnlinePlugin', function (stats, cb) {
15+
const requestPath = options.request
16+
if (!requestPath || typeof requestPath !== 'string') {
17+
colorconsole.error(`### App Server ### 请求线上接口无效,请检查`)
18+
cb()
19+
return
20+
}
21+
const ext = options.signOnlineRpks ? 'rpks' : 'rpk'
22+
const pkgName = options.name
23+
const versionName = options.versionName
24+
const noSignFile = `${pkgName}.nosign.${versionName}.${ext}`
25+
26+
const noSignFilePath = path.join(options.output, noSignFile)
27+
28+
const distFileName = `${pkgName}.${options.sign}.${versionName}.${ext}`
29+
const distFilePath = path.join(options.output, distFileName)
30+
const distFileStream = fs.createWriteStream(distFilePath)
31+
32+
let form = null
33+
34+
const file = fs.createReadStream(noSignFilePath)
35+
36+
if (options.formData && options.formData(file)) {
37+
form = options.formData(file)
38+
}
39+
40+
form && Object.assign(options.headers(), form.getHeaders())
41+
42+
const url = new URL(requestPath)
43+
const param = {
44+
host: url.hostname,
45+
port: url.port,
46+
path: url.pathname,
47+
method: 'POST',
48+
timeout: 10000,
49+
headers: options.headers
50+
}
51+
const req = http
52+
.request(param, (res) => {
53+
colorconsole.log(`### App Loader ### 请求接口的状态码:${res.statusCode}`)
54+
res.pipe(distFileStream, { end: false })
55+
res.on('end', (data) => {
56+
if (res.statusCode === 200) {
57+
distFileStream.end()
58+
colorconsole.log(
59+
`### App Loader ### 请求线上签名成功,dist目录生成文件:${distFileName}`
60+
)
61+
cb()
62+
}
63+
})
64+
})
65+
.on('error', (err) => {
66+
colorconsole.error(`### App Server ### 请求线上签名错误,错误信息: ${err.message} $`)
67+
cb(err)
68+
})
69+
.on('timeout', function () {
70+
colorconsole.warn(
71+
`### App Server ### 请求线上签名网络超时,请检查网络与接口地址 ${
72+
form
73+
? ''
74+
: '缺少FormData对象,请在配置文件quickapp.config.js里面定义的params函数返回FormData对象'
75+
}`
76+
)
77+
req.abort()
78+
})
79+
form && form.pipe(req)
80+
})
81+
}
82+
83+
export default SignOnlinePlugin

packages/hap-packager/src/subpackages/service.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ function allocateResourceToPackages(files, base, fullPackage, subPackages, build
7777

7878
files.forEach((fileBuildPath) => {
7979
const fileAbsPath = path.join(base, fileBuildPath)
80-
const fileContentBuffer = fs.readFileSync(fileAbsPath.replace(/\\/g, '/'))
80+
const fileContentBuffer = fs.readFileSync(fileAbsPath)
8181
const fileContentDigest = calcDataDigest(fileContentBuffer)
8282
// 资源基本信息
8383
const resourceInfo = [fileBuildPath, fileContentBuffer, fileContentDigest]

packages/hap-packager/src/webpack.post.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import {
1919
} from './plugins'
2020
import { genPriorities, getBabelConfigJsPath } from './common/utils'
2121
import { getSkeletonConfig } from './common/info'
22+
import SignOnlinePlugin from './plugins/sign-online-plugin'
2223

2324
/**
2425
* 配置关联
@@ -166,6 +167,22 @@ function postHook(webpackConf, defaultsOptions, quickappConfig = {}) {
166167
})
167168
)
168169

170+
if (compileOptionsObject['signOnline']) {
171+
// 发送接口进行线上签名
172+
webpackConf.plugins.push(
173+
new SignOnlinePlugin({
174+
signOnlineRpks: compileOptionsObject.signOnlineRpks,
175+
sign: webpackConf.mode === 'development' ? 'debug' : 'release',
176+
name: appPackageName,
177+
versionName,
178+
output: pathDist,
179+
request: globalConfig.signOnLineConfig.signOnLine,
180+
headers: globalConfig.signOnLineConfig.headers,
181+
formData: globalConfig.signOnLineConfig.params
182+
})
183+
)
184+
}
185+
169186
// 解决错误信息定位问题
170187
if (compileOptionsObject.matchSourcemap) {
171188
webpackConf.plugins.push(new SourcemapFixPlugin())

packages/hap-shared-utils/src/compilation-config.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ const compileOptionsObject = {
104104
*/
105105
function mergeCompileOptionsObject(argopts) {
106106
// TODO release memeory, use optimize-prop only
107+
compileOptionsObject.devtool = argopts.devtool ? argopts.devtool : false
107108
Object.assign(compileOptionsObject, argopts)
108109
}
109110

packages/hap-shared-utils/src/config.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,8 @@ export default {
2222
// 代码风格规则
2323
isSmartMode: false,
2424
// 记录 watch 模式下哪些 .ux 文件对应的 .js 文件改变了
25-
changedJS: {}
25+
changedJS: {},
26+
signOnLineConfig: {
27+
signOnLine: ''
28+
}
2629
}

packages/hap-toolkit/src/commands/compile.js

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,12 @@
55

66
import webpack from 'webpack'
77
import adbCommander from 'adb-commander'
8-
import { setCustomConfig, colorconsole } from '@hap-toolkit/shared-utils'
8+
import {
9+
setCustomConfig,
10+
colorconsole,
11+
globalConfig,
12+
compileOptionsMeta
13+
} from '@hap-toolkit/shared-utils'
914
import genWebpackConf from '../gen-webpack-conf'
1015
import { summaryErrors, summaryWarnings } from './utils'
1116

@@ -70,6 +75,17 @@ export function compile(platform, mode, watch, options = {}) {
7075

7176
const webpackMode = mode === 'prod' ? 'production' : 'development'
7277

78+
if (options.disableSignOnline) {
79+
options['signOnline'] = false
80+
} else if (
81+
globalConfig.signOnLineConfig.signOnLine.match(
82+
/^(?:([A-Za-z]+):)?(\/{0,3})([0-9.\-A-Za-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/
83+
)
84+
) {
85+
options['signOnline'] = true
86+
options['signMode'] = compileOptionsMeta.signModeEnum.NULL
87+
}
88+
7389
try {
7490
const webpackConfig = await genWebpackConf(options, webpackMode)
7591

0 commit comments

Comments
 (0)