@kaspernj/api-maker 1.0.346 → 1.0.347
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/api.mjs +5 -9
- package/src/session-status-updater.mjs +61 -20
package/package.json
CHANGED
package/src/api.mjs
CHANGED
|
@@ -2,6 +2,7 @@ import config from "./config.mjs"
|
|
|
2
2
|
import CustomError from "./custom-error.mjs"
|
|
3
3
|
import FormDataObjectizer from "form-data-objectizer"
|
|
4
4
|
import qs from "qs"
|
|
5
|
+
import SessionStatusUpdater from "./session-status-updater.mjs"
|
|
5
6
|
|
|
6
7
|
export default class Api {
|
|
7
8
|
static get(path, pathParams = null) {
|
|
@@ -62,12 +63,12 @@ export default class Api {
|
|
|
62
63
|
})
|
|
63
64
|
}
|
|
64
65
|
|
|
65
|
-
static requestLocal(args) {
|
|
66
|
+
static async requestLocal(args) {
|
|
66
67
|
if (!args.headers) {
|
|
67
68
|
args.headers = {}
|
|
68
69
|
}
|
|
69
70
|
|
|
70
|
-
const token = this._token()
|
|
71
|
+
const token = await this._token()
|
|
71
72
|
|
|
72
73
|
if (token) {
|
|
73
74
|
args.headers["X-CSRF-Token"] = token
|
|
@@ -82,19 +83,14 @@ export default class Api {
|
|
|
82
83
|
args.data = args.rawData
|
|
83
84
|
}
|
|
84
85
|
|
|
85
|
-
return this.request(args)
|
|
86
|
+
return await this.request(args)
|
|
86
87
|
}
|
|
87
88
|
|
|
88
89
|
static put(path, data = {}) {
|
|
89
90
|
return this.requestLocal({path, data, method: "PUT"})
|
|
90
91
|
}
|
|
91
92
|
|
|
92
|
-
static _token()
|
|
93
|
-
const tokenElement = document.querySelector("meta[name='csrf-token']")
|
|
94
|
-
|
|
95
|
-
if (tokenElement)
|
|
96
|
-
return tokenElement.getAttribute("content")
|
|
97
|
-
}
|
|
93
|
+
static _token = async () => await SessionStatusUpdater.current().getCsrfToken()
|
|
98
94
|
|
|
99
95
|
static _parseResponse(xhr) {
|
|
100
96
|
const responseType = xhr.getResponseHeader("content-type")
|
|
@@ -5,32 +5,68 @@ import Logger from "./logger.mjs"
|
|
|
5
5
|
import wakeEvent from "wake-event"
|
|
6
6
|
|
|
7
7
|
const logger = new Logger({name: "ApiMaker / SessionStatusUpdater"})
|
|
8
|
+
const shared = {}
|
|
9
|
+
|
|
10
|
+
// logger.setDebug(true)
|
|
8
11
|
|
|
9
12
|
export default class ApiMakerSessionStatusUpdater {
|
|
10
|
-
static current
|
|
11
|
-
if (!
|
|
12
|
-
|
|
13
|
+
static current(args) {
|
|
14
|
+
if (!shared.apiMakerSessionStatusUpdater) {
|
|
15
|
+
shared.apiMakerSessionStatusUpdater = new ApiMakerSessionStatusUpdater(args)
|
|
16
|
+
}
|
|
13
17
|
|
|
14
|
-
return
|
|
18
|
+
return shared.apiMakerSessionStatusUpdater
|
|
15
19
|
}
|
|
16
20
|
|
|
17
|
-
constructor
|
|
21
|
+
constructor(args = {}) {
|
|
18
22
|
this.events = {}
|
|
19
23
|
this.timeout = args.timeout || 600000
|
|
24
|
+
this.useMetaElement = ("useMetaElement" in args) ? args.useMetaElement : true
|
|
20
25
|
|
|
21
26
|
this.connectOnlineEvent()
|
|
22
27
|
this.connectWakeEvent()
|
|
23
28
|
}
|
|
24
29
|
|
|
25
|
-
connectOnlineEvent
|
|
30
|
+
connectOnlineEvent() {
|
|
26
31
|
window.addEventListener("online", this.updateSessionStatus, false)
|
|
27
32
|
}
|
|
28
33
|
|
|
29
|
-
connectWakeEvent
|
|
34
|
+
connectWakeEvent() {
|
|
30
35
|
wakeEvent(this.updateSessionStatus)
|
|
31
36
|
}
|
|
32
37
|
|
|
33
|
-
async
|
|
38
|
+
async getCsrfToken() {
|
|
39
|
+
if (this.csrfToken) {
|
|
40
|
+
logger.debug("Get CSRF token from set variable")
|
|
41
|
+
|
|
42
|
+
return this.csrfToken
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (this.useMetaElement) {
|
|
46
|
+
const csrfTokenElement = document.querySelector("meta[name='csrf-token']")
|
|
47
|
+
|
|
48
|
+
if (csrfTokenElement) {
|
|
49
|
+
logger.debug("Get CSRF token from meta element")
|
|
50
|
+
|
|
51
|
+
this.csrfToken = csrfTokenElement.getAttribute("content")
|
|
52
|
+
|
|
53
|
+
return this.csrfToken
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
logger.debug("Updating session status because no CSRF token set yet")
|
|
58
|
+
await this.updateSessionStatus()
|
|
59
|
+
|
|
60
|
+
if (this.csrfToken) {
|
|
61
|
+
logger.debug("Returning CSRF token after updating session status")
|
|
62
|
+
|
|
63
|
+
return this.csrfToken
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
throw new Error("CSRF token hasn't been set")
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
sessionStatus() {
|
|
34
70
|
return new Promise((resolve) => {
|
|
35
71
|
let requestPath = ""
|
|
36
72
|
|
|
@@ -48,11 +84,11 @@ export default class ApiMakerSessionStatusUpdater {
|
|
|
48
84
|
})
|
|
49
85
|
}
|
|
50
86
|
|
|
51
|
-
onSignedOut
|
|
87
|
+
onSignedOut(callback) {
|
|
52
88
|
this.addEvent("onSignedOut", callback)
|
|
53
89
|
}
|
|
54
90
|
|
|
55
|
-
startTimeout
|
|
91
|
+
startTimeout() {
|
|
56
92
|
logger.debug("startTimeout")
|
|
57
93
|
|
|
58
94
|
if (this.updateTimeout)
|
|
@@ -67,7 +103,7 @@ export default class ApiMakerSessionStatusUpdater {
|
|
|
67
103
|
)
|
|
68
104
|
}
|
|
69
105
|
|
|
70
|
-
stopTimeout
|
|
106
|
+
stopTimeout() {
|
|
71
107
|
if (this.updateTimeout)
|
|
72
108
|
clearTimeout(this.updateTimeout)
|
|
73
109
|
}
|
|
@@ -82,25 +118,30 @@ export default class ApiMakerSessionStatusUpdater {
|
|
|
82
118
|
this.updateUserSessionsFromResult(result)
|
|
83
119
|
}
|
|
84
120
|
|
|
85
|
-
updateMetaElementsFromResult
|
|
121
|
+
updateMetaElementsFromResult(result) {
|
|
86
122
|
logger.debug("updateMetaElementsFromResult")
|
|
87
|
-
const csrfTokenElement = document.querySelector("meta[name='csrf-token']")
|
|
88
123
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
124
|
+
this.csrfToken = result.csrf_token
|
|
125
|
+
|
|
126
|
+
if (this.useMetaElement) {
|
|
127
|
+
const csrfTokenElement = document.querySelector("meta[name='csrf-token']")
|
|
128
|
+
|
|
129
|
+
if (csrfTokenElement) {
|
|
130
|
+
logger.debug(() => `Changing token from "${csrfTokenElement.getAttribute("content")}" to "${result.csrf_token}"`)
|
|
131
|
+
csrfTokenElement.setAttribute("content", result.csrf_token)
|
|
132
|
+
} else {
|
|
133
|
+
logger.debug("csrf token element couldn't be found")
|
|
134
|
+
}
|
|
94
135
|
}
|
|
95
136
|
}
|
|
96
137
|
|
|
97
|
-
updateUserSessionsFromResult
|
|
138
|
+
updateUserSessionsFromResult(result) {
|
|
98
139
|
for (const scopeName in result.scopes) {
|
|
99
140
|
this.updateUserSessionScopeFromResult(scopeName, result.scopes[scopeName])
|
|
100
141
|
}
|
|
101
142
|
}
|
|
102
143
|
|
|
103
|
-
updateUserSessionScopeFromResult
|
|
144
|
+
updateUserSessionScopeFromResult(scopeName, scope) {
|
|
104
145
|
const deviseIsSignedInMethodName = `is${inflection.camelize(scopeName)}SignedIn`
|
|
105
146
|
|
|
106
147
|
if (!(deviseIsSignedInMethodName in Devise)) {
|