|
@@ -22,9 +22,10 @@ export let legado_http_entry_point = ''
|
|
|
export let legado_webSocket_entry_point = ''
|
|
export let legado_webSocket_entry_point = ''
|
|
|
|
|
|
|
|
let wsOnError: typeof WebSocket.prototype.onerror = () => {}
|
|
let wsOnError: typeof WebSocket.prototype.onerror = () => {}
|
|
|
-export const setWebsocketOnError = (
|
|
|
|
|
- callback: typeof WebSocket.prototype.onerror,
|
|
|
|
|
-) => {
|
|
|
|
|
|
|
+let wsOnMessage: typeof WebSocket.prototype.onmessage = () => {}
|
|
|
|
|
+export const setWebsocketOnMessage = (callback: typeof wsOnMessage) =>
|
|
|
|
|
+ (wsOnMessage = callback)
|
|
|
|
|
+export const setWebsocketOnError = (callback: typeof wsOnError) => {
|
|
|
//WebSocket.prototype.onerror = callback
|
|
//WebSocket.prototype.onerror = callback
|
|
|
wsOnError = callback
|
|
wsOnError = callback
|
|
|
}
|
|
}
|
|
@@ -33,15 +34,15 @@ export const setApiEntryPoint = (
|
|
|
http_entry_point: string,
|
|
http_entry_point: string,
|
|
|
webSocket_entry_point: string,
|
|
webSocket_entry_point: string,
|
|
|
) => {
|
|
) => {
|
|
|
- legado_http_entry_point = http_entry_point
|
|
|
|
|
- legado_webSocket_entry_point = webSocket_entry_point
|
|
|
|
|
- ajax.defaults.baseURL = http_entry_point.toString()
|
|
|
|
|
|
|
+ legado_http_entry_point = new URL(http_entry_point).toString()
|
|
|
|
|
+ legado_webSocket_entry_point = new URL(webSocket_entry_point).toString()
|
|
|
|
|
+ ajax.defaults.baseURL = legado_http_entry_point
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 书架API
|
|
// 书架API
|
|
|
// Http
|
|
// Http
|
|
|
const getReadConfig = async (http_url = legado_http_entry_point) => {
|
|
const getReadConfig = async (http_url = legado_http_entry_point) => {
|
|
|
- const { data } = await ajax.get<LeagdoApiResponse<string>>('/getReadConfig', {
|
|
|
|
|
|
|
+ const { data } = await ajax.get<LeagdoApiResponse<string>>('getReadConfig', {
|
|
|
baseURL: http_url.toString(),
|
|
baseURL: http_url.toString(),
|
|
|
timeout: 3000,
|
|
timeout: 3000,
|
|
|
})
|
|
})
|
|
@@ -52,27 +53,27 @@ const getReadConfig = async (http_url = legado_http_entry_point) => {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
const saveReadConfig = (config: webReadConfig) =>
|
|
const saveReadConfig = (config: webReadConfig) =>
|
|
|
- ajax.post<LeagdoApiResponse<string>>('/saveReadConfig', config)
|
|
|
|
|
|
|
+ ajax.post<LeagdoApiResponse<string>>('saveReadConfig', config)
|
|
|
|
|
|
|
|
/** @deprecated: 使用`API.saveBookProgressWithBeacon`以确保在页面或者直接关闭的情况下保存进度 */
|
|
/** @deprecated: 使用`API.saveBookProgressWithBeacon`以确保在页面或者直接关闭的情况下保存进度 */
|
|
|
const saveBookProgress = (bookProgress: BookProgress) =>
|
|
const saveBookProgress = (bookProgress: BookProgress) =>
|
|
|
- ajax.post('/saveBookProgress', bookProgress)
|
|
|
|
|
|
|
+ ajax.post('saveBookProgress', bookProgress)
|
|
|
|
|
|
|
|
/**主要在直接关闭浏览器情况下可靠发送书籍进度 */
|
|
/**主要在直接关闭浏览器情况下可靠发送书籍进度 */
|
|
|
const saveBookProgressWithBeacon = (bookProgress: BookProgress) => {
|
|
const saveBookProgressWithBeacon = (bookProgress: BookProgress) => {
|
|
|
if (!bookProgress) return
|
|
if (!bookProgress) return
|
|
|
// 常规请求可能会被取消 使用Fetch keep-alive 或者 navigator.sendBeacon
|
|
// 常规请求可能会被取消 使用Fetch keep-alive 或者 navigator.sendBeacon
|
|
|
navigator.sendBeacon(
|
|
navigator.sendBeacon(
|
|
|
- new URL('/saveBookProgress', legado_http_entry_point),
|
|
|
|
|
|
|
+ new URL('saveBookProgress', legado_http_entry_point),
|
|
|
JSON.stringify(bookProgress),
|
|
JSON.stringify(bookProgress),
|
|
|
)
|
|
)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-const getBookShelf = () => ajax.get<LeagdoApiResponse<Book[]>>('/getBookshelf')
|
|
|
|
|
|
|
+const getBookShelf = () => ajax.get<LeagdoApiResponse<Book[]>>('getBookshelf')
|
|
|
|
|
|
|
|
const getChapterList = (/** @type {string} */ bookUrl: string) =>
|
|
const getChapterList = (/** @type {string} */ bookUrl: string) =>
|
|
|
ajax.get<LeagdoApiResponse<BookChapter[]>>(
|
|
ajax.get<LeagdoApiResponse<BookChapter[]>>(
|
|
|
- '/getChapterList?url=' + encodeURIComponent(bookUrl),
|
|
|
|
|
|
|
+ 'getChapterList?url=' + encodeURIComponent(bookUrl),
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
const getBookContent = (
|
|
const getBookContent = (
|
|
@@ -80,7 +81,7 @@ const getBookContent = (
|
|
|
/** @type {number} */ chapterIndex: number,
|
|
/** @type {number} */ chapterIndex: number,
|
|
|
) =>
|
|
) =>
|
|
|
ajax.get<LeagdoApiResponse<string>>(
|
|
ajax.get<LeagdoApiResponse<string>>(
|
|
|
- '/getBookContent?url=' +
|
|
|
|
|
|
|
+ 'getBookContent?url=' +
|
|
|
encodeURIComponent(bookUrl) +
|
|
encodeURIComponent(bookUrl) +
|
|
|
'&index=' +
|
|
'&index=' +
|
|
|
chapterIndex,
|
|
chapterIndex,
|
|
@@ -93,16 +94,17 @@ const search = (
|
|
|
onFinish: () => void,
|
|
onFinish: () => void,
|
|
|
) => {
|
|
) => {
|
|
|
const socket = new WebSocket(
|
|
const socket = new WebSocket(
|
|
|
- new URL('/searchBook', legado_webSocket_entry_point),
|
|
|
|
|
|
|
+ new URL('searchBook', legado_webSocket_entry_point),
|
|
|
)
|
|
)
|
|
|
socket.onerror = wsOnError
|
|
socket.onerror = wsOnError
|
|
|
|
|
|
|
|
socket.onopen = () => {
|
|
socket.onopen = () => {
|
|
|
socket.send(`{"key":"${searchKey}"}`)
|
|
socket.send(`{"key":"${searchKey}"}`)
|
|
|
}
|
|
}
|
|
|
- socket.onmessage = ({ data }) => {
|
|
|
|
|
|
|
+ socket.onmessage = event => {
|
|
|
try {
|
|
try {
|
|
|
- onReceive(JSON.parse(data))
|
|
|
|
|
|
|
+ onReceive(JSON.parse(event.data))
|
|
|
|
|
+ wsOnMessage?.call(socket, event)
|
|
|
} catch {
|
|
} catch {
|
|
|
onFinish()
|
|
onFinish()
|
|
|
}
|
|
}
|
|
@@ -114,31 +116,31 @@ const search = (
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
const saveBook = (book: BaseBook) =>
|
|
const saveBook = (book: BaseBook) =>
|
|
|
- ajax.post<LeagdoApiResponse<string>>('/saveBook', book)
|
|
|
|
|
|
|
+ ajax.post<LeagdoApiResponse<string>>('saveBook', book)
|
|
|
const deleteBook = (book: BaseBook) =>
|
|
const deleteBook = (book: BaseBook) =>
|
|
|
- ajax.post<LeagdoApiResponse<string>>('/deleteBook', book)
|
|
|
|
|
|
|
+ ajax.post<LeagdoApiResponse<string>>('deleteBook', book)
|
|
|
|
|
|
|
|
const isBookSource = /bookSource/i.test(location.href)
|
|
const isBookSource = /bookSource/i.test(location.href)
|
|
|
|
|
|
|
|
// 源编辑API
|
|
// 源编辑API
|
|
|
// Http
|
|
// Http
|
|
|
const getSources = () =>
|
|
const getSources = () =>
|
|
|
- isBookSource ? ajax.get('/getBookSources') : ajax.get('/getRssSources')
|
|
|
|
|
|
|
+ isBookSource ? ajax.get('getBookSources') : ajax.get('getRssSources')
|
|
|
|
|
|
|
|
const saveSource = (data: Source) =>
|
|
const saveSource = (data: Source) =>
|
|
|
isBookSource
|
|
isBookSource
|
|
|
- ? ajax.post<LeagdoApiResponse<string>>('/saveBookSource', data)
|
|
|
|
|
- : ajax.post<LeagdoApiResponse<string>>('/saveRssSource', data)
|
|
|
|
|
|
|
+ ? ajax.post<LeagdoApiResponse<string>>('saveBookSource', data)
|
|
|
|
|
+ : ajax.post<LeagdoApiResponse<string>>('saveRssSource', data)
|
|
|
|
|
|
|
|
const saveSources = (data: Source[]) =>
|
|
const saveSources = (data: Source[]) =>
|
|
|
isBookSource
|
|
isBookSource
|
|
|
- ? ajax.post<LeagdoApiResponse<Source[]>>('/saveBookSources', data)
|
|
|
|
|
- : ajax.post<LeagdoApiResponse<Source[]>>('/saveRssSources', data)
|
|
|
|
|
|
|
+ ? ajax.post<LeagdoApiResponse<Source[]>>('saveBookSources', data)
|
|
|
|
|
+ : ajax.post<LeagdoApiResponse<Source[]>>('saveRssSources', data)
|
|
|
|
|
|
|
|
const deleteSource = (data: Source[]) =>
|
|
const deleteSource = (data: Source[]) =>
|
|
|
isBookSource
|
|
isBookSource
|
|
|
- ? ajax.post<LeagdoApiResponse<string>>('/deleteBookSources', data)
|
|
|
|
|
- : ajax.post<LeagdoApiResponse<string>>('/deleteRssSources', data)
|
|
|
|
|
|
|
+ ? ajax.post<LeagdoApiResponse<string>>('deleteBookSources', data)
|
|
|
|
|
+ : ajax.post<LeagdoApiResponse<string>>('deleteRssSources', data)
|
|
|
|
|
|
|
|
// webSocket
|
|
// webSocket
|
|
|
const debug = (
|
|
const debug = (
|
|
@@ -148,7 +150,7 @@ const debug = (
|
|
|
/** @type {() => void} */ onFinish: () => void,
|
|
/** @type {() => void} */ onFinish: () => void,
|
|
|
) => {
|
|
) => {
|
|
|
const url = new URL(
|
|
const url = new URL(
|
|
|
- `/${isBookSource ? 'bookSource' : 'rssSource'}Debug`,
|
|
|
|
|
|
|
+ `${isBookSource ? 'bookSource' : 'rssSource'}Debug`,
|
|
|
legado_webSocket_entry_point,
|
|
legado_webSocket_entry_point,
|
|
|
)
|
|
)
|
|
|
|
|
|
|
@@ -157,7 +159,10 @@ const debug = (
|
|
|
socket.onopen = () => {
|
|
socket.onopen = () => {
|
|
|
socket.send(JSON.stringify({ tag: sourceUrl, key: searchKey }))
|
|
socket.send(JSON.stringify({ tag: sourceUrl, key: searchKey }))
|
|
|
}
|
|
}
|
|
|
- socket.onmessage = ({ data }) => onReceive(data)
|
|
|
|
|
|
|
+ socket.onmessage = event => {
|
|
|
|
|
+ onReceive(event.data)
|
|
|
|
|
+ wsOnMessage?.call(socket, event)
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
socket.onclose = () => {
|
|
socket.onclose = () => {
|
|
|
onFinish()
|
|
onFinish()
|
|
@@ -171,7 +176,7 @@ const debug = (
|
|
|
const getProxyCoverUrl = (coverUrl: string) => {
|
|
const getProxyCoverUrl = (coverUrl: string) => {
|
|
|
if (coverUrl.startsWith(legado_http_entry_point)) return coverUrl
|
|
if (coverUrl.startsWith(legado_http_entry_point)) return coverUrl
|
|
|
return new URL(
|
|
return new URL(
|
|
|
- '/cover?path=' + encodeURIComponent(coverUrl),
|
|
|
|
|
|
|
+ 'cover?path=' + encodeURIComponent(coverUrl),
|
|
|
legado_http_entry_point,
|
|
legado_http_entry_point,
|
|
|
).toString()
|
|
).toString()
|
|
|
}
|
|
}
|
|
@@ -188,7 +193,7 @@ const getProxyImageUrl = (
|
|
|
) => {
|
|
) => {
|
|
|
if (src.startsWith(legado_http_entry_point)) return src
|
|
if (src.startsWith(legado_http_entry_point)) return src
|
|
|
return new URL(
|
|
return new URL(
|
|
|
- '/image?path=' +
|
|
|
|
|
|
|
+ 'image?path=' +
|
|
|
encodeURIComponent(src) +
|
|
encodeURIComponent(src) +
|
|
|
'&url=' +
|
|
'&url=' +
|
|
|
encodeURIComponent(bookUrl) +
|
|
encodeURIComponent(bookUrl) +
|