Skip to content

Commit 6467acc

Browse files
committed
Separation of OAuth from connection
1 parent 1278a37 commit 6467acc

File tree

7 files changed

+185
-115
lines changed

7 files changed

+185
-115
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,3 +106,4 @@ dist
106106

107107
bin/
108108
package-lock.json
109+
token.txt

app.js

Lines changed: 15 additions & 113 deletions
Original file line numberDiff line numberDiff line change
@@ -1,114 +1,16 @@
1-
2-
const { Client } = require('node-osc')
3-
const WebSocket = require('ws')
4-
const readline = require('readline')
5-
const { stdin: input, stdout: output } = require('node:process')
6-
const open = require('open')
7-
const rl = readline.createInterface({ input, output })
8-
const { WS } = require('./method')
9-
const { pulsoidApi } = require('./pulsoidApi')
10-
const pulsoidAuthPage = () => {
11-
return `${pulsoidApi.baseUrl}?client_id=${pulsoidApi.client_id}&redirect_uri=${pulsoidApi.redirect_uri}&response_type=${pulsoidApi.response_type}&scope=${pulsoidApi.scope}&state=${pulsoidApi.state}&response_mode=${pulsoidApi.response_mode}`
1+
const { ReadFile, stringIsnullOrEmpty } = require('./method')
2+
const { StartAuth } = require('./auth')
3+
const { RunPulsoid } = require('./main')
4+
const token = ReadFile('token.txt')
5+
if (stringIsnullOrEmpty(token)) {
6+
StartAuth().then(_token => {
7+
if (stringIsnullOrEmpty(_token)){
8+
console.log('no Enter.')
9+
process.exit(1)
10+
}
11+
RunPulsoid(token)
12+
})
13+
}
14+
else {
15+
RunPulsoid(token)
1216
}
13-
console.log('Open Pulsoid Auth Page...')
14-
open(pulsoidAuthPage())
15-
/**
16-
* @type {string}
17-
*/
18-
rl.question('Enter Pulsoid Auth Token: ', (token) => {
19-
if (token == '') {
20-
console.log('no Enter.')
21-
return
22-
}
23-
let Start = () => {
24-
const wspath = `/api/v1/data/real_time?access_token=${token}`
25-
const ws = new WS("dev.pulsoid.net", "", wspath, true)
26-
let hbToggle = false
27-
ws.message(ev => {
28-
/**
29-
* @type {{
30-
* data: {
31-
* heartRate: number
32-
* }
33-
* }}
34-
*/
35-
const data = JSON.parse(ev)
36-
const heartRate = data?.data?.heartRate
37-
if (!heartRate) return console.log('Got heart rate: 0 bpm, skipping parameter update...')
38-
console.log('Got heart rate: %s bpm', heartRate)
39-
const client = new Client('localhost', 9000)
40-
// 参考自该代码:
41-
// https://github.com/vard88508/vrc-osc-miband-hrm/blob/f60c3422c36921d317168ed38b1362528e8364e9/app.js#L24-L50
42-
const Heartrates = [
43-
{
44-
address: '/avatar/parameters/Heartrate',
45-
args:
46-
{
47-
type: 'f',
48-
value: data.data.heartRate / 127 - 1
49-
}
50-
},
51-
{
52-
address: "/avatar/parameters/HeartRateFloat",
53-
args:
54-
{
55-
type: "f",
56-
value: data.data.heartRate / 127 - 1
57-
}
58-
},
59-
{
60-
address: "/avatar/parameters/Heartrate2",
61-
args:
62-
{
63-
type: "f",
64-
value: data.data.heartRate / 255
65-
}
66-
},
67-
{
68-
address: "/avatar/parameters/HeartRateFloat01",
69-
args:
70-
{
71-
type: "f",
72-
value: data.data.heartRate / 255
73-
}
74-
},
75-
{
76-
address: "/avatar/parameters/Heartrate3",
77-
args:
78-
{
79-
type: "i",
80-
value: data.data.heartRate
81-
}
82-
},
83-
{
84-
address: "/avatar/parameters/HeartRateInt",
85-
args:
86-
{
87-
type: "i",
88-
value: data.data.heartRate
89-
}
90-
},
91-
{
92-
address: "/avatar/parameters/HeartBeatToggle",
93-
args:
94-
{
95-
type: "b",
96-
value: hbToggle
97-
}
98-
}
99-
]
100-
Heartrates.forEach(element => {
101-
client.send(element)
102-
if (element.address === "/avatar/parameters/HeartBeatToggle") {
103-
hbToggle = !hbToggle
104-
}
105-
});
106-
})
107-
ws.realclose = false
108-
ws.connect().then(() => {
109-
console.log('Connected to Pulsoid.')
110-
})
111-
}
112-
Start()
113-
})
114-

auth.js

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
const readline = require('readline')
2+
const { stdin: input, stdout: output } = require('node:process')
3+
const open = require('open')
4+
const rl = readline.createInterface({ input, output })
5+
const { pulsoidApi } = require('./pulsoidApi')
6+
const fs = require('fs')
7+
const pulsoidAuthPage = () => {
8+
return `${pulsoidApi.baseUrl}?client_id=${pulsoidApi.client_id}&redirect_uri=${pulsoidApi.redirect_uri}&response_type=${pulsoidApi.response_type}&scope=${pulsoidApi.scope}&state=${pulsoidApi.state}&response_mode=${pulsoidApi.response_mode}`
9+
}
10+
/**
11+
*
12+
* @param {*} callback
13+
* @returns {Promise<string>}
14+
*/
15+
const StartAuth = async (callback) => {
16+
return new Promise((resolve, reject) => {
17+
console.log('Open Pulsoid Auth Page...')
18+
open(pulsoidAuthPage())
19+
/**
20+
* @type {string}
21+
*/
22+
rl.question('Enter Pulsoid Auth Token: ', (token) => {
23+
if (token == '') {
24+
console.log('no Enter.')
25+
return reject()
26+
}
27+
// 写入到 token.txt
28+
fs.writeFile('token.txt', token, (err) => {
29+
if (err) {
30+
console.log(err)
31+
return reject()
32+
}
33+
console.log('token.txt saved.')
34+
callback && callback(token)
35+
return resolve(token)
36+
})
37+
})
38+
})
39+
}
40+
exports.StartAuth = StartAuth

main.js

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
2+
const { WS } = require('./method')
3+
const { Client } = require('node-osc')
4+
/**
5+
*
6+
* @param {string} token
7+
*/
8+
const RunPulsoid = (token) => {
9+
const wspath = `/api/v1/data/real_time?access_token=${token}`
10+
const ws = new WS("dev.pulsoid.net", "", wspath, true)
11+
let hbToggle = false
12+
ws.message(ev => {
13+
/**
14+
* @type {{
15+
* data: {
16+
* heartRate: number
17+
* }
18+
* }}
19+
*/
20+
const data = JSON.parse(ev)
21+
const heartRate = data?.data?.heartRate
22+
if (!heartRate) return console.log('Got heart rate: 0 bpm, skipping parameter update...')
23+
console.log('Got heart rate: %s bpm', heartRate)
24+
const client = new Client('localhost', 9000)
25+
// 参考自该代码:
26+
// https://github.com/vard88508/vrc-osc-miband-hrm/blob/f60c3422c36921d317168ed38b1362528e8364e9/app.js#L24-L50
27+
const Heartrates = [
28+
{
29+
address: '/avatar/parameters/Heartrate',
30+
args:
31+
{
32+
type: 'f',
33+
value: data.data.heartRate / 127 - 1
34+
}
35+
},
36+
{
37+
address: "/avatar/parameters/HeartRateFloat",
38+
args:
39+
{
40+
type: "f",
41+
value: data.data.heartRate / 127 - 1
42+
}
43+
},
44+
{
45+
address: "/avatar/parameters/Heartrate2",
46+
args:
47+
{
48+
type: "f",
49+
value: data.data.heartRate / 255
50+
}
51+
},
52+
{
53+
address: "/avatar/parameters/HeartRateFloat01",
54+
args:
55+
{
56+
type: "f",
57+
value: data.data.heartRate / 255
58+
}
59+
},
60+
{
61+
address: "/avatar/parameters/Heartrate3",
62+
args:
63+
{
64+
type: "i",
65+
value: data.data.heartRate
66+
}
67+
},
68+
{
69+
address: "/avatar/parameters/HeartRateInt",
70+
args:
71+
{
72+
type: "i",
73+
value: data.data.heartRate
74+
}
75+
},
76+
{
77+
address: "/avatar/parameters/HeartBeatToggle",
78+
args:
79+
{
80+
type: "b",
81+
value: hbToggle
82+
}
83+
}
84+
]
85+
Heartrates.forEach(element => {
86+
client.send(element)
87+
if (element.address === "/avatar/parameters/HeartBeatToggle") {
88+
hbToggle = !hbToggle
89+
}
90+
});
91+
})
92+
ws.realclose = false
93+
ws.connect().then(() => {
94+
console.log('Connected to Pulsoid.')
95+
})
96+
}
97+
exports.RunPulsoid = RunPulsoid

method.js

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
const WebSocket = require('ws')
2+
const fs = require('fs')
23
class WS {
34
ip = ""
45
port = ""
@@ -187,5 +188,21 @@ const stringIsnullOrEmpty = (str) => {
187188
if (str == null || str == undefined || str == "") return true
188189
return false
189190
}
191+
/**
192+
*
193+
* @param {string} path
194+
* @returns {string}
195+
*/
196+
const ReadFile = (path) => {
197+
// 判断文件是否存在
198+
if (!fs.existsSync(path)) {
199+
return ""
200+
}
201+
// 读取文件
202+
const main = fs.readFileSync(path, "utf-8")
203+
return main
204+
}
190205
exports.getUuid = getUuid
191-
exports.WS = WS
206+
exports.WS = WS
207+
exports.stringIsnullOrEmpty = stringIsnullOrEmpty
208+
exports.ReadFile = ReadFile

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
"description": "",
55
"main": "app.js",
66
"scripts": {
7-
"run": "node --inspect app.js"
7+
"run": "node --inspect app.js",
8+
"authAndRun": "node --inspect startAuth.js"
89
},
910
"author": "Sonic853",
1011
"license": "MIT",

startAuth.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
const { stringIsnullOrEmpty } = require('./method')
2+
const { StartAuth } = require('./auth')
3+
const { RunPulsoid } = require('./main')
4+
5+
StartAuth().then(token => {
6+
if (stringIsnullOrEmpty(token)) {
7+
// 当用户按下回车键时,process.exit()
8+
console.log('no Enter.')
9+
process.exit(1)
10+
}
11+
RunPulsoid(token)
12+
})

0 commit comments

Comments
 (0)