@capytale/activity.js 3.1.21 → 3.1.23
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/api/lti/index.d.ts +2 -0
- package/api/lti/index.js +14 -0
- package/api/lti/index.js.map +1 -1
- package/backend/capytale/lti.d.ts +2 -0
- package/package.json +1 -1
- package/tracker/index.js +3 -0
- package/tracker/index.js.map +1 -1
package/api/lti/index.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export default function createLtiSession(): {
|
|
2
2
|
setSessId(sessId: string): void;
|
|
3
|
+
setToken(token: string): void;
|
|
3
4
|
getProperty(key: string): any;
|
|
5
|
+
setProperty(key: string, value: any): void;
|
|
4
6
|
readonly isActive: boolean;
|
|
5
7
|
getSessId(): string | null;
|
|
6
8
|
addLtiAuthHeader(hdr: Headers): Headers;
|
package/api/lti/index.js
CHANGED
|
@@ -15,11 +15,25 @@ export default function createLtiSession() {
|
|
|
15
15
|
ltiProps = {};
|
|
16
16
|
isActive = true;
|
|
17
17
|
},
|
|
18
|
+
setToken(token) {
|
|
19
|
+
if (!isActive)
|
|
20
|
+
return;
|
|
21
|
+
if (ltiToken === token)
|
|
22
|
+
return;
|
|
23
|
+
ltiToken = token;
|
|
24
|
+
sessionStorage.setItem(`lti_session_${ltiSessionId}`, token);
|
|
25
|
+
},
|
|
18
26
|
getProperty(key) {
|
|
19
27
|
if (!isActive)
|
|
20
28
|
return;
|
|
21
29
|
return ltiProps[key];
|
|
22
30
|
},
|
|
31
|
+
setProperty(key, value) {
|
|
32
|
+
if (!isActive)
|
|
33
|
+
return;
|
|
34
|
+
ltiProps[key] = value;
|
|
35
|
+
sessionStorage.setItem(`lti_props_${ltiSessionId}`, JSON.stringify(ltiProps));
|
|
36
|
+
},
|
|
23
37
|
get isActive() {
|
|
24
38
|
return isActive;
|
|
25
39
|
},
|
package/api/lti/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/lti/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,UAAU,gBAAgB;IACpC,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,YAAoB,CAAC;IACzB,IAAI,QAAgB,CAAC;IACrB,IAAI,QAAgC,CAAC;IACrC,OAAO;QACH,SAAS,CAAC,MAAc;YACpB,IAAI,YAAY,KAAK,MAAM;gBAAE,OAAO;YACpC,YAAY,GAAG,MAAM,CAAC;YACtB,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,eAAe,MAAM,EAAE,CAAE,CAAC;YAC5D,MAAM,cAAc,GAAG,cAAc,CAAC,OAAO,CAAC,aAAa,MAAM,EAAE,CAAC,CAAC;YACrE,QAAQ,GAAG,cAAc,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;YACtE,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;gBAAE,QAAQ,GAAG,EAAE,CAAC;YAC3C,QAAQ,GAAG,IAAI,CAAC;QACpB,CAAC;QACD,WAAW,CAAC,GAAW;YACnB,IAAI,CAAC,QAAQ;gBAAE,OAAO;YACtB,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;QACD,IAAI,QAAQ;YACR,OAAO,QAAQ,CAAC;QACpB,CAAC;QACD,SAAS;YACL,OAAO,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1C,CAAC;QACD,gBAAgB,CAAC,GAAY;YACzB,IAAI,QAAQ,IAAI,IAAI;gBAAE,GAAG,CAAC,GAAG,CAAC,iBAAiB,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC;YACpE,OAAO,GAAG,CAAC;QACf,CAAC;KACJ,CAAC;AACN,CAAC","sourcesContent":["export default function createLtiSession() {\n let isActive = false;\n let ltiSessionId: string;\n let ltiToken: string;\n let ltiProps: { [key: string]: any };\n return {\n setSessId(sessId: string) {\n if (ltiSessionId === sessId) return;\n ltiSessionId = sessId;\n ltiToken = sessionStorage.getItem(`lti_session_${sessId}`)!;\n const ltiPropsString = sessionStorage.getItem(`lti_props_${sessId}`);\n ltiProps = ltiPropsString == null ? {} : (JSON.parse(ltiPropsString));\n if (Array.isArray(ltiProps)) ltiProps = {};\n isActive = true;\n },\n getProperty(key: string): any {\n if (!isActive) return;\n return ltiProps[key];\n },\n get isActive() {\n return isActive;\n },\n getSessId(): string | null {\n return isActive ? ltiSessionId : null;\n },\n addLtiAuthHeader(hdr: Headers): Headers {\n if (ltiToken != null) hdr.set('X-CAPYTALE-AUTH', 'lti ' + ltiToken);\n return hdr;\n }\n };\n}"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/lti/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,UAAU,gBAAgB;IACpC,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,YAAoB,CAAC;IACzB,IAAI,QAAgB,CAAC;IACrB,IAAI,QAAgC,CAAC;IACrC,OAAO;QACH,SAAS,CAAC,MAAc;YACpB,IAAI,YAAY,KAAK,MAAM;gBAAE,OAAO;YACpC,YAAY,GAAG,MAAM,CAAC;YACtB,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,eAAe,MAAM,EAAE,CAAE,CAAC;YAC5D,MAAM,cAAc,GAAG,cAAc,CAAC,OAAO,CAAC,aAAa,MAAM,EAAE,CAAC,CAAC;YACrE,QAAQ,GAAG,cAAc,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;YACtE,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;gBAAE,QAAQ,GAAG,EAAE,CAAC;YAC3C,QAAQ,GAAG,IAAI,CAAC;QACpB,CAAC;QACD,QAAQ,CAAC,KAAa;YAClB,IAAI,CAAC,QAAQ;gBAAE,OAAO;YACtB,IAAI,QAAQ,KAAK,KAAK;gBAAE,OAAO;YAC/B,QAAQ,GAAG,KAAK,CAAC;YACjB,cAAc,CAAC,OAAO,CAAC,eAAe,YAAY,EAAE,EAAE,KAAK,CAAC,CAAC;QACjE,CAAC;QACD,WAAW,CAAC,GAAW;YACnB,IAAI,CAAC,QAAQ;gBAAE,OAAO;YACtB,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;QACD,WAAW,CAAC,GAAW,EAAE,KAAU;YAC/B,IAAI,CAAC,QAAQ;gBAAE,OAAO;YACtB,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACtB,cAAc,CAAC,OAAO,CAAC,aAAa,YAAY,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;QAClF,CAAC;QACD,IAAI,QAAQ;YACR,OAAO,QAAQ,CAAC;QACpB,CAAC;QACD,SAAS;YACL,OAAO,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1C,CAAC;QACD,gBAAgB,CAAC,GAAY;YACzB,IAAI,QAAQ,IAAI,IAAI;gBAAE,GAAG,CAAC,GAAG,CAAC,iBAAiB,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC;YACpE,OAAO,GAAG,CAAC;QACf,CAAC;KACJ,CAAC;AACN,CAAC","sourcesContent":["export default function createLtiSession() {\n let isActive = false;\n let ltiSessionId: string;\n let ltiToken: string;\n let ltiProps: { [key: string]: any };\n return {\n setSessId(sessId: string) {\n if (ltiSessionId === sessId) return;\n ltiSessionId = sessId;\n ltiToken = sessionStorage.getItem(`lti_session_${sessId}`)!;\n const ltiPropsString = sessionStorage.getItem(`lti_props_${sessId}`);\n ltiProps = ltiPropsString == null ? {} : (JSON.parse(ltiPropsString));\n if (Array.isArray(ltiProps)) ltiProps = {};\n isActive = true;\n },\n setToken(token: string) {\n if (!isActive) return;\n if (ltiToken === token) return;\n ltiToken = token;\n sessionStorage.setItem(`lti_session_${ltiSessionId}`, token);\n },\n getProperty(key: string): any {\n if (!isActive) return;\n return ltiProps[key];\n },\n setProperty(key: string, value: any): void {\n if (!isActive) return;\n ltiProps[key] = value;\n sessionStorage.setItem(`lti_props_${ltiSessionId}`, JSON.stringify(ltiProps));\n },\n get isActive() {\n return isActive;\n },\n getSessId(): string | null {\n return isActive ? ltiSessionId : null;\n },\n addLtiAuthHeader(hdr: Headers): Headers {\n if (ltiToken != null) hdr.set('X-CAPYTALE-AUTH', 'lti ' + ltiToken);\n return hdr;\n }\n };\n}"]}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
declare const ltiSession: {
|
|
2
2
|
setSessId(sessId: string): void;
|
|
3
|
+
setToken(token: string): void;
|
|
3
4
|
getProperty(key: string): any;
|
|
5
|
+
setProperty(key: string, value: any): void;
|
|
4
6
|
readonly isActive: boolean;
|
|
5
7
|
getSessId(): string | null;
|
|
6
8
|
addLtiAuthHeader(hdr: Headers): Headers;
|
package/package.json
CHANGED
package/tracker/index.js
CHANGED
|
@@ -133,6 +133,9 @@ export default function (trackerHost, siteId) {
|
|
|
133
133
|
this.push(['trackPageView']);
|
|
134
134
|
}
|
|
135
135
|
};
|
|
136
|
+
// SameSite=None pour les cookies
|
|
137
|
+
// Nécessaire pour le tracking dans une iframe
|
|
138
|
+
tracker.push(['setCookieSameSite', 'None']);
|
|
136
139
|
if (siteId == null) {
|
|
137
140
|
tracking = false;
|
|
138
141
|
tempPaq = undefined;
|
package/tracker/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/tracker/index.ts"],"names":[],"mappings":"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","sourcesContent":["import loadScript from '../util/scriptLoader';\n\nimport type ActivitySession from \"../activity/activitySession\";\n\nexport type Tracker = {\n push: (args: any[]) => void;\n setUserId: (userId: string | null) => void;\n trackActivity: (data: ActivitySession) => void;\n trackPageView: () => void;\n};\n\nconst jsFile = \"matomo.js\";\nconst phpFile = \"matomo.php\";\n\nconst voidTracker: Tracker = {\n push() { },\n setUserId() { },\n trackActivity() { },\n trackPageView() { },\n}\n\n/**\n * Indique si le chargement du script de tracking a échoué.\n * Dans ce cas, le tracking est désactivé.\n */\nlet loadFailed: boolean = false;\n\n/**\n * Charge le script de tracking Matomo.\n * Cette fonction est appelée une seule fois dès que le siteId est connu.\n * \n * @param matomoUrl url du script de tracking\n * @param siteId id du site à tracker\n * @returns \n */\nfunction loadTracker(matomoUrl: string, siteId: number) {\n if ((loadFailed) || (globalThis._paq != null)) return;\n globalThis._paq = globalThis._paq || [];\n globalThis._paq.push(['setTrackerUrl', matomoUrl + phpFile]);\n globalThis._paq.push(['setSiteId', siteId]);\n loadScript(matomoUrl + jsFile).catch(() => {\n // retry once after 30s\n setTimeout(() => {\n loadScript(matomoUrl + jsFile)\n .catch(() => {\n loadFailed = true;\n delete globalThis._paq;\n });\n }, 30000);\n })\n}\n\nlet instantiated: boolean = false;\n\n/**\n * @param trackerHost nom de domaine du serveur de tracking\n * @param siteId id du site à tracker. Si null, le tracking est désactivé.\n * @returns l'objet Tracker permettant d'envoyer des événements de tracking.\n */\nexport default function (trackerHost: string, siteId: number | null | Promise<number | null>): Tracker {\n if (instantiated) {\n console.warn(\"Tracker already instantiated\");\n return voidTracker;\n }\n instantiated = true;\n const matomoUrl = \"//\" + trackerHost + \"/\";\n\n /**\n * sauvegarde des appels à push avant l'initialisation du tracker\n * c'est à dire tant que le siteId et le userId ne sont pas connus.\n */\n let tempPaq: any[] | undefined = [];\n\n /**\n * true si le tracking doit être effectué.\n * Reste à true tant que le siteId n'est pas connu.\n * Si le siteId est null, le tracking est désactivé et tracking est mis à false.\n */\n let tracking: boolean = true;\n\n /**\n * sauvegarde du userId pour initialiser le tracker quand le siteId sera connu.\n */\n let userIdSave: string | null = null;\n\n /**\n * true si le userId a été donné et sauvegardé.\n */\n let userIdSaved: boolean = false;\n\n const tracker: Tracker = {\n push(args: any[]) {\n if (loadFailed || !tracking) return;\n if (tempPaq == null) {\n globalThis._paq!.push(args);\n } else {\n tempPaq.push(args);\n }\n },\n setUserId(userId: string | null) {\n if (loadFailed || !tracking) return;\n if (globalThis._paq != null) {\n if (null == userId) {\n globalThis._paq.push(['resetUserId']);\n } else {\n globalThis._paq.push(['setUserId', userId]);\n }\n if (tempPaq != null) {\n // On pousse les appels en attente\n tempPaq.forEach((args) => {\n globalThis._paq!.push(args);\n });\n tempPaq = undefined;\n }\n } else {\n userIdSave = userId;\n userIdSaved = true;\n }\n },\n trackActivity(data: ActivitySession) {\n if (loadFailed || !tracking) return;\n let action: string | false = false;\n if (data.isAssignment) {\n if (data.mode === 'assignment') {\n action = 'edit assignment';\n } else if (data.mode === 'review') {\n action = 'review assignment';\n }\n } else {\n if (data.mode === 'create') {\n action = 'edit activity';\n } else if (data.mode === 'view') {\n action = 'view activity';\n }\n }\n if (action !== false) {\n this.push(['trackEvent', 'activity', action, data.activityBunch.activityType]);\n }\n },\n trackPageView() {\n if (loadFailed || !tracking) return;\n this.push(['trackPageView']);\n }\n }\n\n if (siteId == null) {\n tracking = false;\n tempPaq = undefined;\n } else if (siteId instanceof Promise) {\n siteId.then((sId) => {\n if (sId == null) {\n tracking = false;\n tempPaq = undefined;\n } else {\n loadTracker(matomoUrl, sId);\n if (userIdSaved) {\n tracker.setUserId(userIdSave);\n userIdSaved = false;\n userIdSave = null;\n }\n }\n }, () => {\n tracking = false;\n tempPaq = undefined;\n userIdSave = null;\n });\n } else {\n loadTracker(matomoUrl, siteId);\n }\n\n return tracker;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/tracker/index.ts"],"names":[],"mappings":"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","sourcesContent":["import loadScript from '../util/scriptLoader';\n\nimport type ActivitySession from \"../activity/activitySession\";\n\nexport type Tracker = {\n push: (args: any[]) => void;\n setUserId: (userId: string | null) => void;\n trackActivity: (data: ActivitySession) => void;\n trackPageView: () => void;\n};\n\nconst jsFile = \"matomo.js\";\nconst phpFile = \"matomo.php\";\n\nconst voidTracker: Tracker = {\n push() { },\n setUserId() { },\n trackActivity() { },\n trackPageView() { },\n}\n\n/**\n * Indique si le chargement du script de tracking a échoué.\n * Dans ce cas, le tracking est désactivé.\n */\nlet loadFailed: boolean = false;\n\n/**\n * Charge le script de tracking Matomo.\n * Cette fonction est appelée une seule fois dès que le siteId est connu.\n * \n * @param matomoUrl url du script de tracking\n * @param siteId id du site à tracker\n * @returns \n */\nfunction loadTracker(matomoUrl: string, siteId: number) {\n if ((loadFailed) || (globalThis._paq != null)) return;\n globalThis._paq = globalThis._paq || [];\n globalThis._paq.push(['setTrackerUrl', matomoUrl + phpFile]);\n globalThis._paq.push(['setSiteId', siteId]);\n loadScript(matomoUrl + jsFile).catch(() => {\n // retry once after 30s\n setTimeout(() => {\n loadScript(matomoUrl + jsFile)\n .catch(() => {\n loadFailed = true;\n delete globalThis._paq;\n });\n }, 30000);\n })\n}\n\nlet instantiated: boolean = false;\n\n/**\n * @param trackerHost nom de domaine du serveur de tracking\n * @param siteId id du site à tracker. Si null, le tracking est désactivé.\n * @returns l'objet Tracker permettant d'envoyer des événements de tracking.\n */\nexport default function (trackerHost: string, siteId: number | null | Promise<number | null>): Tracker {\n if (instantiated) {\n console.warn(\"Tracker already instantiated\");\n return voidTracker;\n }\n instantiated = true;\n const matomoUrl = \"//\" + trackerHost + \"/\";\n\n /**\n * sauvegarde des appels à push avant l'initialisation du tracker\n * c'est à dire tant que le siteId et le userId ne sont pas connus.\n */\n let tempPaq: any[] | undefined = [];\n\n /**\n * true si le tracking doit être effectué.\n * Reste à true tant que le siteId n'est pas connu.\n * Si le siteId est null, le tracking est désactivé et tracking est mis à false.\n */\n let tracking: boolean = true;\n\n /**\n * sauvegarde du userId pour initialiser le tracker quand le siteId sera connu.\n */\n let userIdSave: string | null = null;\n\n /**\n * true si le userId a été donné et sauvegardé.\n */\n let userIdSaved: boolean = false;\n\n const tracker: Tracker = {\n push(args: any[]) {\n if (loadFailed || !tracking) return;\n if (tempPaq == null) {\n globalThis._paq!.push(args);\n } else {\n tempPaq.push(args);\n }\n },\n setUserId(userId: string | null) {\n if (loadFailed || !tracking) return;\n if (globalThis._paq != null) {\n if (null == userId) {\n globalThis._paq.push(['resetUserId']);\n } else {\n globalThis._paq.push(['setUserId', userId]);\n }\n if (tempPaq != null) {\n // On pousse les appels en attente\n tempPaq.forEach((args) => {\n globalThis._paq!.push(args);\n });\n tempPaq = undefined;\n }\n } else {\n userIdSave = userId;\n userIdSaved = true;\n }\n },\n trackActivity(data: ActivitySession) {\n if (loadFailed || !tracking) return;\n let action: string | false = false;\n if (data.isAssignment) {\n if (data.mode === 'assignment') {\n action = 'edit assignment';\n } else if (data.mode === 'review') {\n action = 'review assignment';\n }\n } else {\n if (data.mode === 'create') {\n action = 'edit activity';\n } else if (data.mode === 'view') {\n action = 'view activity';\n }\n }\n if (action !== false) {\n this.push(['trackEvent', 'activity', action, data.activityBunch.activityType]);\n }\n },\n trackPageView() {\n if (loadFailed || !tracking) return;\n this.push(['trackPageView']);\n }\n }\n\n // SameSite=None pour les cookies\n // Nécessaire pour le tracking dans une iframe\n tracker.push(['setCookieSameSite', 'None']);\n\n if (siteId == null) {\n tracking = false;\n tempPaq = undefined;\n } else if (siteId instanceof Promise) {\n siteId.then((sId) => {\n if (sId == null) {\n tracking = false;\n tempPaq = undefined;\n } else {\n loadTracker(matomoUrl, sId);\n if (userIdSaved) {\n tracker.setUserId(userIdSave);\n userIdSaved = false;\n userIdSave = null;\n }\n }\n }, () => {\n tracking = false;\n tempPaq = undefined;\n userIdSave = null;\n });\n } else {\n loadTracker(matomoUrl, siteId);\n }\n\n return tracker;\n}\n"]}
|