matrix-js-sdk 41.6.0 → 41.7.0-rc.2

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.
Files changed (171) hide show
  1. package/lib/ReEmitter.js +1 -1
  2. package/lib/ReEmitter.js.map +1 -1
  3. package/lib/ToDeviceMessageQueue.js +2 -2
  4. package/lib/ToDeviceMessageQueue.js.map +1 -1
  5. package/lib/autodiscovery.js +1 -0
  6. package/lib/autodiscovery.js.map +1 -1
  7. package/lib/client.d.ts.map +1 -1
  8. package/lib/client.js +77 -3
  9. package/lib/client.js.map +1 -1
  10. package/lib/common-crypto/CryptoBackend.js +2 -0
  11. package/lib/common-crypto/CryptoBackend.js.map +1 -1
  12. package/lib/crypto/store/indexeddb-crypto-store-backend.js +1 -1
  13. package/lib/crypto/store/indexeddb-crypto-store-backend.js.map +1 -1
  14. package/lib/crypto/store/indexeddb-crypto-store.js +2 -0
  15. package/lib/crypto/store/indexeddb-crypto-store.js.map +1 -1
  16. package/lib/crypto-api/index.js +58 -58
  17. package/lib/crypto-api/index.js.map +1 -1
  18. package/lib/embedded.js +13 -9
  19. package/lib/embedded.js.map +1 -1
  20. package/lib/extensible_events_v1/MessageEvent.js +15 -15
  21. package/lib/extensible_events_v1/MessageEvent.js.map +1 -1
  22. package/lib/extensible_events_v1/PollEndEvent.js +8 -8
  23. package/lib/extensible_events_v1/PollEndEvent.js.map +1 -1
  24. package/lib/extensible_events_v1/PollResponseEvent.js +1 -0
  25. package/lib/extensible_events_v1/PollResponseEvent.js.map +1 -1
  26. package/lib/extensible_events_v1/PollStartEvent.js +28 -28
  27. package/lib/extensible_events_v1/PollStartEvent.js.map +1 -1
  28. package/lib/filter.js +3 -1
  29. package/lib/filter.js.map +1 -1
  30. package/lib/http-api/errors.js +16 -16
  31. package/lib/http-api/errors.js.map +1 -1
  32. package/lib/http-api/fetch.js +2 -1
  33. package/lib/http-api/fetch.js.map +1 -1
  34. package/lib/http-api/refresh.js +7 -6
  35. package/lib/http-api/refresh.js.map +1 -1
  36. package/lib/http-api/utils.d.ts.map +1 -1
  37. package/lib/http-api/utils.js +1 -5
  38. package/lib/http-api/utils.js.map +1 -1
  39. package/lib/interactive-auth.js +11 -1
  40. package/lib/interactive-auth.js.map +1 -1
  41. package/lib/logger.js +2 -0
  42. package/lib/logger.js.map +1 -1
  43. package/lib/matrixrtc/CallMembership.js +6 -5
  44. package/lib/matrixrtc/CallMembership.js.map +1 -1
  45. package/lib/matrixrtc/MatrixRTCSession.d.ts.map +1 -1
  46. package/lib/matrixrtc/MatrixRTCSession.js +15 -5
  47. package/lib/matrixrtc/MatrixRTCSession.js.map +1 -1
  48. package/lib/matrixrtc/MatrixRTCSessionManager.js +3 -2
  49. package/lib/matrixrtc/MatrixRTCSessionManager.js.map +1 -1
  50. package/lib/matrixrtc/MembershipManager.js +24 -17
  51. package/lib/matrixrtc/MembershipManager.js.map +1 -1
  52. package/lib/matrixrtc/MembershipManagerActionScheduler.js +2 -1
  53. package/lib/matrixrtc/MembershipManagerActionScheduler.js.map +1 -1
  54. package/lib/matrixrtc/RTCEncryptionManager.js +6 -4
  55. package/lib/matrixrtc/RTCEncryptionManager.js.map +1 -1
  56. package/lib/matrixrtc/ToDeviceKeyTransport.js +4 -4
  57. package/lib/matrixrtc/ToDeviceKeyTransport.js.map +1 -1
  58. package/lib/models/MSC3089TreeSpace.js +2 -1
  59. package/lib/models/MSC3089TreeSpace.js.map +1 -1
  60. package/lib/models/beacon.js +8 -4
  61. package/lib/models/beacon.js.map +1 -1
  62. package/lib/models/device.js +7 -0
  63. package/lib/models/device.js.map +1 -1
  64. package/lib/models/event-context.js +2 -1
  65. package/lib/models/event-context.js.map +1 -1
  66. package/lib/models/event-timeline-set.js +7 -1
  67. package/lib/models/event-timeline-set.js.map +1 -1
  68. package/lib/models/event-timeline.js +5 -1
  69. package/lib/models/event-timeline.js.map +1 -1
  70. package/lib/models/event.js +35 -11
  71. package/lib/models/event.js.map +1 -1
  72. package/lib/models/poll.js +7 -3
  73. package/lib/models/poll.js.map +1 -1
  74. package/lib/models/related-relations.js +2 -0
  75. package/lib/models/related-relations.js.map +1 -1
  76. package/lib/models/relations-container.js +2 -2
  77. package/lib/models/relations-container.js.map +1 -1
  78. package/lib/models/relations.js +4 -3
  79. package/lib/models/relations.js.map +1 -1
  80. package/lib/models/room-member.js +24 -2
  81. package/lib/models/room-member.js.map +1 -1
  82. package/lib/models/room-receipts.js +19 -12
  83. package/lib/models/room-receipts.js.map +1 -1
  84. package/lib/models/room-state.js +2 -2
  85. package/lib/models/room-state.js.map +1 -1
  86. package/lib/models/room-sticky-events.js +1 -0
  87. package/lib/models/room-sticky-events.js.map +1 -1
  88. package/lib/models/room.js +35 -4
  89. package/lib/models/room.js.map +1 -1
  90. package/lib/models/thread.js +46 -2
  91. package/lib/models/thread.js.map +1 -1
  92. package/lib/models/user.js +20 -1
  93. package/lib/models/user.js.map +1 -1
  94. package/lib/oidc/tokenRefresher.js +11 -8
  95. package/lib/oidc/tokenRefresher.js.map +1 -1
  96. package/lib/pushprocessor.js +1 -1
  97. package/lib/pushprocessor.js.map +1 -1
  98. package/lib/rendezvous/MSC4108SignInWithQR.js +6 -1
  99. package/lib/rendezvous/MSC4108SignInWithQR.js.map +1 -1
  100. package/lib/rendezvous/channels/MSC4108SecureChannel.js +3 -1
  101. package/lib/rendezvous/channels/MSC4108SecureChannel.js.map +1 -1
  102. package/lib/rendezvous/transports/MSC4108RendezvousSession.js +8 -0
  103. package/lib/rendezvous/transports/MSC4108RendezvousSession.js.map +1 -1
  104. package/lib/room-hierarchy.js +8 -4
  105. package/lib/room-hierarchy.js.map +1 -1
  106. package/lib/rust-crypto/DehydratedDeviceManager.js +3 -2
  107. package/lib/rust-crypto/DehydratedDeviceManager.js.map +1 -1
  108. package/lib/rust-crypto/KeyClaimManager.js +2 -1
  109. package/lib/rust-crypto/KeyClaimManager.js.map +1 -1
  110. package/lib/rust-crypto/OutgoingRequestsManager.js +12 -12
  111. package/lib/rust-crypto/OutgoingRequestsManager.js.map +1 -1
  112. package/lib/rust-crypto/PerSessionKeyBackupDownloader.js +5 -3
  113. package/lib/rust-crypto/PerSessionKeyBackupDownloader.js.map +1 -1
  114. package/lib/rust-crypto/RoomEncryptor.js +6 -6
  115. package/lib/rust-crypto/RoomEncryptor.js.map +1 -1
  116. package/lib/rust-crypto/backup.js +6 -4
  117. package/lib/rust-crypto/backup.js.map +1 -1
  118. package/lib/rust-crypto/rust-crypto.js +18 -10
  119. package/lib/rust-crypto/rust-crypto.js.map +1 -1
  120. package/lib/rust-crypto/verification.js +9 -7
  121. package/lib/rust-crypto/verification.js.map +1 -1
  122. package/lib/scheduler.js +2 -2
  123. package/lib/scheduler.js.map +1 -1
  124. package/lib/serverCapabilities.js +5 -2
  125. package/lib/serverCapabilities.js.map +1 -1
  126. package/lib/sliding-sync-sdk.js +6 -3
  127. package/lib/sliding-sync-sdk.js.map +1 -1
  128. package/lib/sliding-sync.js +9 -4
  129. package/lib/sliding-sync.js.map +1 -1
  130. package/lib/store/indexeddb-local-backend.js +5 -1
  131. package/lib/store/indexeddb-local-backend.js.map +1 -1
  132. package/lib/store/indexeddb-remote-backend.js +7 -6
  133. package/lib/store/indexeddb-remote-backend.js.map +1 -1
  134. package/lib/store/indexeddb-store-worker.js +2 -1
  135. package/lib/store/indexeddb-store-worker.js.map +1 -1
  136. package/lib/store/indexeddb.js +1 -0
  137. package/lib/store/indexeddb.js.map +1 -1
  138. package/lib/store/memory.js +4 -0
  139. package/lib/store/memory.js.map +1 -1
  140. package/lib/sync-accumulator.js +1 -1
  141. package/lib/sync-accumulator.js.map +1 -1
  142. package/lib/sync.d.ts.map +1 -1
  143. package/lib/sync.js +32 -16
  144. package/lib/sync.js.map +1 -1
  145. package/lib/timeline-window.js +6 -2
  146. package/lib/timeline-window.js.map +1 -1
  147. package/lib/webrtc/call.js +42 -6
  148. package/lib/webrtc/call.js.map +1 -1
  149. package/lib/webrtc/callEventHandler.js +5 -0
  150. package/lib/webrtc/callEventHandler.js.map +1 -1
  151. package/lib/webrtc/callFeed.js +15 -0
  152. package/lib/webrtc/callFeed.js.map +1 -1
  153. package/lib/webrtc/groupCall.js +24 -8
  154. package/lib/webrtc/groupCall.js.map +1 -1
  155. package/lib/webrtc/groupCallEventHandler.js +1 -1
  156. package/lib/webrtc/groupCallEventHandler.js.map +1 -1
  157. package/lib/webrtc/mediaHandler.js +7 -3
  158. package/lib/webrtc/mediaHandler.js.map +1 -1
  159. package/lib/webrtc/stats/callStatsReportGatherer.js +5 -2
  160. package/lib/webrtc/stats/callStatsReportGatherer.js.map +1 -1
  161. package/lib/webrtc/stats/groupCallStats.js +4 -3
  162. package/lib/webrtc/stats/groupCallStats.js.map +1 -1
  163. package/lib/webrtc/stats/media/mediaTrackStats.js +3 -3
  164. package/lib/webrtc/stats/media/mediaTrackStats.js.map +1 -1
  165. package/lib/webrtc/stats/media/mediaTrackStatsHandler.js +1 -1
  166. package/lib/webrtc/stats/media/mediaTrackStatsHandler.js.map +1 -1
  167. package/package.json +125 -138
  168. package/src/client.ts +4 -1
  169. package/src/http-api/utils.ts +4 -9
  170. package/src/matrixrtc/MatrixRTCSession.ts +4 -3
  171. package/src/sync.ts +5 -1
@@ -30,12 +30,12 @@ import { ExtensibleEvent } from "./ExtensibleEvent.js";
30
30
  * within the PollStartEvent parsing.
31
31
  */
32
32
  export class PollAnswerSubevent extends MessageEvent {
33
- /**
34
- * The answer ID.
35
- */
36
-
37
33
  constructor(wireFormat) {
38
34
  super(wireFormat);
35
+ /**
36
+ * The answer ID.
37
+ */
38
+ _defineProperty(this, "id", void 0);
39
39
  var id = wireFormat.content.id;
40
40
  if (!id || typeof id !== "string") {
41
41
  throw new InvalidEventError("Answer ID must be a non-empty string");
@@ -72,30 +72,6 @@ export class PollAnswerSubevent extends MessageEvent {
72
72
  * Represents a poll start event.
73
73
  */
74
74
  export class PollStartEvent extends ExtensibleEvent {
75
- /**
76
- * The question being asked, as a MessageEvent node.
77
- */
78
-
79
- /**
80
- * The interpreted kind of poll. Note that this will infer a value that is known to the
81
- * SDK rather than verbatim - this means unknown types will be represented as undisclosed
82
- * polls.
83
- *
84
- * To get the raw kind, use rawKind.
85
- */
86
-
87
- /**
88
- * The true kind as provided by the event sender. Might not be valid.
89
- */
90
-
91
- /**
92
- * The maximum number of selections a user is allowed to make.
93
- */
94
-
95
- /**
96
- * The possible answers for the poll.
97
- */
98
-
99
75
  /**
100
76
  * Creates a new PollStartEvent from a pure format. Note that the event is *not*
101
77
  * parsed here: it will be treated as a literal m.poll.start primary typed event.
@@ -103,6 +79,30 @@ export class PollStartEvent extends ExtensibleEvent {
103
79
  */
104
80
  constructor(wireFormat) {
105
81
  super(wireFormat);
82
+ /**
83
+ * The question being asked, as a MessageEvent node.
84
+ */
85
+ _defineProperty(this, "question", void 0);
86
+ /**
87
+ * The interpreted kind of poll. Note that this will infer a value that is known to the
88
+ * SDK rather than verbatim - this means unknown types will be represented as undisclosed
89
+ * polls.
90
+ *
91
+ * To get the raw kind, use rawKind.
92
+ */
93
+ _defineProperty(this, "kind", void 0);
94
+ /**
95
+ * The true kind as provided by the event sender. Might not be valid.
96
+ */
97
+ _defineProperty(this, "rawKind", void 0);
98
+ /**
99
+ * The maximum number of selections a user is allowed to make.
100
+ */
101
+ _defineProperty(this, "maxSelections", void 0);
102
+ /**
103
+ * The possible answers for the poll.
104
+ */
105
+ _defineProperty(this, "answers", void 0);
106
106
  var poll = M_POLL_START.findIn(this.wireContent);
107
107
  if (!(poll !== null && poll !== void 0 && poll.question)) {
108
108
  throw new InvalidEventError("A question is required");
@@ -1 +1 @@
1
- {"version":3,"file":"PollStartEvent.js","names":["NamespacedValue","MessageEvent","isEventTypeSame","M_TEXT","M_POLL_KIND_DISCLOSED","M_POLL_KIND_UNDISCLOSED","M_POLL_START","InvalidEventError","ExtensibleEvent","PollAnswerSubevent","constructor","wireFormat","id","content","serialize","type","_objectSpread","serializeMMessageOnly","from","text","name","PollStartEvent","poll","findIn","wireContent","question","rawKind","kind","matches","maxSelections","Number","isFinite","max_selections","Array","isArray","answers","slice","map","a","length","isEquivalentTo","primaryEventType","concat","i","join","arguments","undefined","makeId","LETTERS","charAt","Math","floor","random"],"sources":["../../src/extensible_events_v1/PollStartEvent.ts"],"sourcesContent":["/*\nCopyright 2022 - 2023 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { NamespacedValue } from \"matrix-events-sdk\";\n\nimport { MessageEvent } from \"./MessageEvent.ts\";\nimport { type ExtensibleEventType, type IPartialEvent, isEventTypeSame, M_TEXT } from \"../@types/extensible_events.ts\";\nimport {\n type KnownPollKind,\n M_POLL_KIND_DISCLOSED,\n M_POLL_KIND_UNDISCLOSED,\n M_POLL_START,\n type PollStartEventContent,\n type PollStartSubtype,\n type PollAnswer,\n} from \"../@types/polls.ts\";\nimport { InvalidEventError } from \"./InvalidEventError.ts\";\nimport { ExtensibleEvent } from \"./ExtensibleEvent.ts\";\n\n/**\n * Represents a poll answer. Note that this is represented as a subtype and is\n * not registered as a parsable event - it is implied for usage exclusively\n * within the PollStartEvent parsing.\n */\nexport class PollAnswerSubevent extends MessageEvent {\n /**\n * The answer ID.\n */\n public readonly id: string;\n\n public constructor(wireFormat: IPartialEvent<PollAnswer>) {\n super(wireFormat);\n\n const id = wireFormat.content.id;\n if (!id || typeof id !== \"string\") {\n throw new InvalidEventError(\"Answer ID must be a non-empty string\");\n }\n this.id = id;\n }\n\n public serialize(): IPartialEvent<object> {\n return {\n type: \"org.matrix.sdk.poll.answer\",\n content: {\n id: this.id,\n ...this.serializeMMessageOnly(),\n },\n };\n }\n\n /**\n * Creates a new PollAnswerSubevent from ID and text.\n * @param id - The answer ID (unique within the poll).\n * @param text - The text.\n * @returns The representative answer.\n */\n public static from(id: string, text: string): PollAnswerSubevent {\n return new PollAnswerSubevent({\n type: \"org.matrix.sdk.poll.answer\",\n content: {\n id: id,\n [M_TEXT.name]: text,\n },\n });\n }\n}\n\n/**\n * Represents a poll start event.\n */\nexport class PollStartEvent extends ExtensibleEvent<PollStartEventContent> {\n /**\n * The question being asked, as a MessageEvent node.\n */\n public readonly question: MessageEvent;\n\n /**\n * The interpreted kind of poll. Note that this will infer a value that is known to the\n * SDK rather than verbatim - this means unknown types will be represented as undisclosed\n * polls.\n *\n * To get the raw kind, use rawKind.\n */\n public readonly kind: KnownPollKind;\n\n /**\n * The true kind as provided by the event sender. Might not be valid.\n */\n public readonly rawKind: string;\n\n /**\n * The maximum number of selections a user is allowed to make.\n */\n public readonly maxSelections: number;\n\n /**\n * The possible answers for the poll.\n */\n public readonly answers: PollAnswerSubevent[];\n\n /**\n * Creates a new PollStartEvent from a pure format. Note that the event is *not*\n * parsed here: it will be treated as a literal m.poll.start primary typed event.\n * @param wireFormat - The event.\n */\n public constructor(wireFormat: IPartialEvent<PollStartEventContent>) {\n super(wireFormat);\n\n const poll = M_POLL_START.findIn<PollStartSubtype>(this.wireContent);\n\n if (!poll?.question) {\n throw new InvalidEventError(\"A question is required\");\n }\n\n this.question = new MessageEvent({ type: \"org.matrix.sdk.poll.question\", content: poll.question });\n\n this.rawKind = poll.kind;\n if (M_POLL_KIND_DISCLOSED.matches(this.rawKind)) {\n this.kind = M_POLL_KIND_DISCLOSED;\n } else {\n this.kind = M_POLL_KIND_UNDISCLOSED; // default & assumed value\n }\n\n this.maxSelections =\n Number.isFinite(poll.max_selections) && poll.max_selections! > 0 ? poll.max_selections! : 1;\n\n if (!Array.isArray(poll.answers)) {\n throw new InvalidEventError(\"Poll answers must be an array\");\n }\n const answers = poll.answers.slice(0, 20).map(\n (a) =>\n new PollAnswerSubevent({\n type: \"org.matrix.sdk.poll.answer\",\n content: a,\n }),\n );\n if (answers.length <= 0) {\n throw new InvalidEventError(\"No answers available\");\n }\n this.answers = answers;\n }\n\n public isEquivalentTo(primaryEventType: ExtensibleEventType): boolean {\n return isEventTypeSame(primaryEventType, M_POLL_START);\n }\n\n public serialize(): IPartialEvent<object> {\n return {\n type: M_POLL_START.name,\n content: {\n [M_POLL_START.name]: {\n question: this.question.serialize().content,\n kind: this.rawKind,\n max_selections: this.maxSelections,\n answers: this.answers.map((a) => a.serialize().content),\n },\n [M_TEXT.name]: `${this.question.text}\\n${this.answers.map((a, i) => `${i + 1}. ${a.text}`).join(\"\\n\")}`,\n },\n };\n }\n\n /**\n * Creates a new PollStartEvent from question, answers, and metadata.\n * @param question - The question to ask.\n * @param answers - The answers. Should be unique within each other.\n * @param kind - The kind of poll.\n * @param maxSelections - The maximum number of selections. Must be 1 or higher.\n * @returns The representative poll start event.\n */\n public static from(\n question: string,\n answers: string[],\n kind: KnownPollKind | string,\n maxSelections = 1,\n ): PollStartEvent {\n return new PollStartEvent({\n type: M_POLL_START.name,\n content: {\n [M_TEXT.name]: question, // unused by parsing\n [M_POLL_START.name]: {\n question: { [M_TEXT.name]: question },\n kind: kind instanceof NamespacedValue ? kind.name : kind,\n max_selections: maxSelections,\n answers: answers.map((a) => ({ id: makeId(), [M_TEXT.name]: a })),\n },\n },\n });\n }\n}\n\nconst LETTERS = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\";\nfunction makeId(): string {\n return [...Array(16)].map(() => LETTERS.charAt(Math.floor(Math.random() * LETTERS.length))).join(\"\");\n}\n"],"mappings":";;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,eAAe,QAAQ,mBAAmB;AAEnD,SAASC,YAAY,QAAQ,mBAAmB;AAChD,SAAuDC,eAAe,EAAEC,MAAM,QAAQ,gCAAgC;AACtH,SAEIC,qBAAqB,EACrBC,uBAAuB,EACvBC,YAAY,QAIT,oBAAoB;AAC3B,SAASC,iBAAiB,QAAQ,wBAAwB;AAC1D,SAASC,eAAe,QAAQ,sBAAsB;;AAEtD;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,kBAAkB,SAASR,YAAY,CAAC;EACjD;AACJ;AACA;;EAGWS,WAAWA,CAACC,UAAqC,EAAE;IACtD,KAAK,CAACA,UAAU,CAAC;IAEjB,IAAMC,EAAE,GAAGD,UAAU,CAACE,OAAO,CAACD,EAAE;IAChC,IAAI,CAACA,EAAE,IAAI,OAAOA,EAAE,KAAK,QAAQ,EAAE;MAC/B,MAAM,IAAIL,iBAAiB,CAAC,sCAAsC,CAAC;IACvE;IACA,IAAI,CAACK,EAAE,GAAGA,EAAE;EAChB;EAEOE,SAASA,CAAA,EAA0B;IACtC,OAAO;MACHC,IAAI,EAAE,4BAA4B;MAClCF,OAAO,EAAAG,aAAA;QACHJ,EAAE,EAAE,IAAI,CAACA;MAAE,GACR,IAAI,CAACK,qBAAqB,CAAC,CAAC;IAEvC,CAAC;EACL;;EAEA;AACJ;AACA;AACA;AACA;AACA;EACI,OAAcC,IAAIA,CAACN,EAAU,EAAEO,IAAY,EAAsB;IAC7D,OAAO,IAAIV,kBAAkB,CAAC;MAC1BM,IAAI,EAAE,4BAA4B;MAClCF,OAAO,EAAE;QACLD,EAAE,EAAEA,EAAE;QACN,CAACT,MAAM,CAACiB,IAAI,GAAGD;MACnB;IACJ,CAAC,CAAC;EACN;AACJ;;AAEA;AACA;AACA;AACA,OAAO,MAAME,cAAc,SAASb,eAAe,CAAwB;EACvE;AACJ;AACA;;EAGI;AACJ;AACA;AACA;AACA;AACA;AACA;;EAGI;AACJ;AACA;;EAGI;AACJ;AACA;;EAGI;AACJ;AACA;;EAGI;AACJ;AACA;AACA;AACA;EACWE,WAAWA,CAACC,UAAgD,EAAE;IACjE,KAAK,CAACA,UAAU,CAAC;IAEjB,IAAMW,IAAI,GAAGhB,YAAY,CAACiB,MAAM,CAAmB,IAAI,CAACC,WAAW,CAAC;IAEpE,IAAI,EAACF,IAAI,aAAJA,IAAI,eAAJA,IAAI,CAAEG,QAAQ,GAAE;MACjB,MAAM,IAAIlB,iBAAiB,CAAC,wBAAwB,CAAC;IACzD;IAEA,IAAI,CAACkB,QAAQ,GAAG,IAAIxB,YAAY,CAAC;MAAEc,IAAI,EAAE,8BAA8B;MAAEF,OAAO,EAAES,IAAI,CAACG;IAAS,CAAC,CAAC;IAElG,IAAI,CAACC,OAAO,GAAGJ,IAAI,CAACK,IAAI;IACxB,IAAIvB,qBAAqB,CAACwB,OAAO,CAAC,IAAI,CAACF,OAAO,CAAC,EAAE;MAC7C,IAAI,CAACC,IAAI,GAAGvB,qBAAqB;IACrC,CAAC,MAAM;MACH,IAAI,CAACuB,IAAI,GAAGtB,uBAAuB,CAAC,CAAC;IACzC;IAEA,IAAI,CAACwB,aAAa,GACdC,MAAM,CAACC,QAAQ,CAACT,IAAI,CAACU,cAAc,CAAC,IAAIV,IAAI,CAACU,cAAc,GAAI,CAAC,GAAGV,IAAI,CAACU,cAAc,GAAI,CAAC;IAE/F,IAAI,CAACC,KAAK,CAACC,OAAO,CAACZ,IAAI,CAACa,OAAO,CAAC,EAAE;MAC9B,MAAM,IAAI5B,iBAAiB,CAAC,+BAA+B,CAAC;IAChE;IACA,IAAM4B,OAAO,GAAGb,IAAI,CAACa,OAAO,CAACC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAACC,GAAG,CACxCC,CAAC,IACE,IAAI7B,kBAAkB,CAAC;MACnBM,IAAI,EAAE,4BAA4B;MAClCF,OAAO,EAAEyB;IACb,CAAC,CACT,CAAC;IACD,IAAIH,OAAO,CAACI,MAAM,IAAI,CAAC,EAAE;MACrB,MAAM,IAAIhC,iBAAiB,CAAC,sBAAsB,CAAC;IACvD;IACA,IAAI,CAAC4B,OAAO,GAAGA,OAAO;EAC1B;EAEOK,cAAcA,CAACC,gBAAqC,EAAW;IAClE,OAAOvC,eAAe,CAACuC,gBAAgB,EAAEnC,YAAY,CAAC;EAC1D;EAEOQ,SAASA,CAAA,EAA0B;IACtC,OAAO;MACHC,IAAI,EAAET,YAAY,CAACc,IAAI;MACvBP,OAAO,EAAE;QACL,CAACP,YAAY,CAACc,IAAI,GAAG;UACjBK,QAAQ,EAAE,IAAI,CAACA,QAAQ,CAACX,SAAS,CAAC,CAAC,CAACD,OAAO;UAC3Cc,IAAI,EAAE,IAAI,CAACD,OAAO;UAClBM,cAAc,EAAE,IAAI,CAACH,aAAa;UAClCM,OAAO,EAAE,IAAI,CAACA,OAAO,CAACE,GAAG,CAAEC,CAAC,IAAKA,CAAC,CAACxB,SAAS,CAAC,CAAC,CAACD,OAAO;QAC1D,CAAC;QACD,CAACV,MAAM,CAACiB,IAAI,MAAAsB,MAAA,CAAM,IAAI,CAACjB,QAAQ,CAACN,IAAI,QAAAuB,MAAA,CAAK,IAAI,CAACP,OAAO,CAACE,GAAG,CAAC,CAACC,CAAC,EAAEK,CAAC,QAAAD,MAAA,CAAQC,CAAC,GAAG,CAAC,QAAAD,MAAA,CAAKJ,CAAC,CAACnB,IAAI,CAAE,CAAC,CAACyB,IAAI,CAAC,IAAI,CAAC;MACzG;IACJ,CAAC;EACL;;EAEA;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;EACI,OAAc1B,IAAIA,CACdO,QAAgB,EAChBU,OAAiB,EACjBR,IAA4B,EAEd;IAAA,IADdE,aAAa,GAAAgB,SAAA,CAAAN,MAAA,QAAAM,SAAA,QAAAC,SAAA,GAAAD,SAAA,MAAG,CAAC;IAEjB,OAAO,IAAIxB,cAAc,CAAC;MACtBN,IAAI,EAAET,YAAY,CAACc,IAAI;MACvBP,OAAO,EAAE;QACL,CAACV,MAAM,CAACiB,IAAI,GAAGK,QAAQ;QAAE;QACzB,CAACnB,YAAY,CAACc,IAAI,GAAG;UACjBK,QAAQ,EAAE;YAAE,CAACtB,MAAM,CAACiB,IAAI,GAAGK;UAAS,CAAC;UACrCE,IAAI,EAAEA,IAAI,YAAY3B,eAAe,GAAG2B,IAAI,CAACP,IAAI,GAAGO,IAAI;UACxDK,cAAc,EAAEH,aAAa;UAC7BM,OAAO,EAAEA,OAAO,CAACE,GAAG,CAAEC,CAAC,KAAM;YAAE1B,EAAE,EAAEmC,MAAM,CAAC,CAAC;YAAE,CAAC5C,MAAM,CAACiB,IAAI,GAAGkB;UAAE,CAAC,CAAC;QACpE;MACJ;IACJ,CAAC,CAAC;EACN;AACJ;AAEA,IAAMU,OAAO,GAAG,gEAAgE;AAChF,SAASD,MAAMA,CAAA,EAAW;EACtB,OAAO,CAAC,GAAGd,KAAK,CAAC,EAAE,CAAC,CAAC,CAACI,GAAG,CAAC,MAAMW,OAAO,CAACC,MAAM,CAACC,IAAI,CAACC,KAAK,CAACD,IAAI,CAACE,MAAM,CAAC,CAAC,GAAGJ,OAAO,CAACT,MAAM,CAAC,CAAC,CAAC,CAACK,IAAI,CAAC,EAAE,CAAC;AACxG","ignoreList":[]}
1
+ {"version":3,"file":"PollStartEvent.js","names":["NamespacedValue","MessageEvent","isEventTypeSame","M_TEXT","M_POLL_KIND_DISCLOSED","M_POLL_KIND_UNDISCLOSED","M_POLL_START","InvalidEventError","ExtensibleEvent","PollAnswerSubevent","constructor","wireFormat","_defineProperty","id","content","serialize","type","_objectSpread","serializeMMessageOnly","from","text","name","PollStartEvent","poll","findIn","wireContent","question","rawKind","kind","matches","maxSelections","Number","isFinite","max_selections","Array","isArray","answers","slice","map","a","length","isEquivalentTo","primaryEventType","concat","i","join","arguments","undefined","makeId","LETTERS","charAt","Math","floor","random"],"sources":["../../src/extensible_events_v1/PollStartEvent.ts"],"sourcesContent":["/*\nCopyright 2022 - 2023 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { NamespacedValue } from \"matrix-events-sdk\";\n\nimport { MessageEvent } from \"./MessageEvent.ts\";\nimport { type ExtensibleEventType, type IPartialEvent, isEventTypeSame, M_TEXT } from \"../@types/extensible_events.ts\";\nimport {\n type KnownPollKind,\n M_POLL_KIND_DISCLOSED,\n M_POLL_KIND_UNDISCLOSED,\n M_POLL_START,\n type PollStartEventContent,\n type PollStartSubtype,\n type PollAnswer,\n} from \"../@types/polls.ts\";\nimport { InvalidEventError } from \"./InvalidEventError.ts\";\nimport { ExtensibleEvent } from \"./ExtensibleEvent.ts\";\n\n/**\n * Represents a poll answer. Note that this is represented as a subtype and is\n * not registered as a parsable event - it is implied for usage exclusively\n * within the PollStartEvent parsing.\n */\nexport class PollAnswerSubevent extends MessageEvent {\n /**\n * The answer ID.\n */\n public readonly id: string;\n\n public constructor(wireFormat: IPartialEvent<PollAnswer>) {\n super(wireFormat);\n\n const id = wireFormat.content.id;\n if (!id || typeof id !== \"string\") {\n throw new InvalidEventError(\"Answer ID must be a non-empty string\");\n }\n this.id = id;\n }\n\n public serialize(): IPartialEvent<object> {\n return {\n type: \"org.matrix.sdk.poll.answer\",\n content: {\n id: this.id,\n ...this.serializeMMessageOnly(),\n },\n };\n }\n\n /**\n * Creates a new PollAnswerSubevent from ID and text.\n * @param id - The answer ID (unique within the poll).\n * @param text - The text.\n * @returns The representative answer.\n */\n public static from(id: string, text: string): PollAnswerSubevent {\n return new PollAnswerSubevent({\n type: \"org.matrix.sdk.poll.answer\",\n content: {\n id: id,\n [M_TEXT.name]: text,\n },\n });\n }\n}\n\n/**\n * Represents a poll start event.\n */\nexport class PollStartEvent extends ExtensibleEvent<PollStartEventContent> {\n /**\n * The question being asked, as a MessageEvent node.\n */\n public readonly question: MessageEvent;\n\n /**\n * The interpreted kind of poll. Note that this will infer a value that is known to the\n * SDK rather than verbatim - this means unknown types will be represented as undisclosed\n * polls.\n *\n * To get the raw kind, use rawKind.\n */\n public readonly kind: KnownPollKind;\n\n /**\n * The true kind as provided by the event sender. Might not be valid.\n */\n public readonly rawKind: string;\n\n /**\n * The maximum number of selections a user is allowed to make.\n */\n public readonly maxSelections: number;\n\n /**\n * The possible answers for the poll.\n */\n public readonly answers: PollAnswerSubevent[];\n\n /**\n * Creates a new PollStartEvent from a pure format. Note that the event is *not*\n * parsed here: it will be treated as a literal m.poll.start primary typed event.\n * @param wireFormat - The event.\n */\n public constructor(wireFormat: IPartialEvent<PollStartEventContent>) {\n super(wireFormat);\n\n const poll = M_POLL_START.findIn<PollStartSubtype>(this.wireContent);\n\n if (!poll?.question) {\n throw new InvalidEventError(\"A question is required\");\n }\n\n this.question = new MessageEvent({ type: \"org.matrix.sdk.poll.question\", content: poll.question });\n\n this.rawKind = poll.kind;\n if (M_POLL_KIND_DISCLOSED.matches(this.rawKind)) {\n this.kind = M_POLL_KIND_DISCLOSED;\n } else {\n this.kind = M_POLL_KIND_UNDISCLOSED; // default & assumed value\n }\n\n this.maxSelections =\n Number.isFinite(poll.max_selections) && poll.max_selections! > 0 ? poll.max_selections! : 1;\n\n if (!Array.isArray(poll.answers)) {\n throw new InvalidEventError(\"Poll answers must be an array\");\n }\n const answers = poll.answers.slice(0, 20).map(\n (a) =>\n new PollAnswerSubevent({\n type: \"org.matrix.sdk.poll.answer\",\n content: a,\n }),\n );\n if (answers.length <= 0) {\n throw new InvalidEventError(\"No answers available\");\n }\n this.answers = answers;\n }\n\n public isEquivalentTo(primaryEventType: ExtensibleEventType): boolean {\n return isEventTypeSame(primaryEventType, M_POLL_START);\n }\n\n public serialize(): IPartialEvent<object> {\n return {\n type: M_POLL_START.name,\n content: {\n [M_POLL_START.name]: {\n question: this.question.serialize().content,\n kind: this.rawKind,\n max_selections: this.maxSelections,\n answers: this.answers.map((a) => a.serialize().content),\n },\n [M_TEXT.name]: `${this.question.text}\\n${this.answers.map((a, i) => `${i + 1}. ${a.text}`).join(\"\\n\")}`,\n },\n };\n }\n\n /**\n * Creates a new PollStartEvent from question, answers, and metadata.\n * @param question - The question to ask.\n * @param answers - The answers. Should be unique within each other.\n * @param kind - The kind of poll.\n * @param maxSelections - The maximum number of selections. Must be 1 or higher.\n * @returns The representative poll start event.\n */\n public static from(\n question: string,\n answers: string[],\n kind: KnownPollKind | string,\n maxSelections = 1,\n ): PollStartEvent {\n return new PollStartEvent({\n type: M_POLL_START.name,\n content: {\n [M_TEXT.name]: question, // unused by parsing\n [M_POLL_START.name]: {\n question: { [M_TEXT.name]: question },\n kind: kind instanceof NamespacedValue ? kind.name : kind,\n max_selections: maxSelections,\n answers: answers.map((a) => ({ id: makeId(), [M_TEXT.name]: a })),\n },\n },\n });\n }\n}\n\nconst LETTERS = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\";\nfunction makeId(): string {\n return [...Array(16)].map(() => LETTERS.charAt(Math.floor(Math.random() * LETTERS.length))).join(\"\");\n}\n"],"mappings":"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","ignoreList":[]}
package/lib/filter.js CHANGED
@@ -59,9 +59,11 @@ export class Filter {
59
59
  * @param filterId - The filter ID if known.
60
60
  */
61
61
  constructor(userId, filterId) {
62
- _defineProperty(this, "definition", {});
63
62
  this.userId = userId;
64
63
  this.filterId = filterId;
64
+ _defineProperty(this, "definition", {});
65
+ _defineProperty(this, "roomFilter", void 0);
66
+ _defineProperty(this, "roomTimelineFilter", void 0);
65
67
  }
66
68
 
67
69
  /**
package/lib/filter.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"filter.js","names":["UNREAD_THREAD_NOTIFICATIONS","FilterComponent","NamespacedValue","profileFieldsFilterName","setProp","obj","keyNesting","val","nestedKeys","split","currentObj","i","length","Filter","fromJson","userId","filterId","jsonObj","filter","setDefinition","constructor","_defineProperty","getFilterId","getDefinition","definition","roomFilterJson","room","roomFilterFields","rooms","not_rooms","roomFilter","roomTimelineFilter","timeline","getRoomTimelineFilterComponent","filterRoomTimeline","events","setTimelineLimit","limit","setUnreadThreadNotifications","enabled","_this$definition","_this$definition2","_objectSpread","name","setLazyLoadMembers","setIncludeLeaveRooms","includeLeave","setUnstableMSC4429SyncUserProfiles","ids","stable","_profileFieldsFilterN","field","unstable","lazy_load_members"],"sources":["../src/filter.ts"],"sourcesContent":["/*\nCopyright 2015 - 2021 Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { type EventType, type RelationType } from \"./@types/event.ts\";\nimport { UNREAD_THREAD_NOTIFICATIONS } from \"./@types/sync.ts\";\nimport { FilterComponent, type IFilterComponent } from \"./filter-component.ts\";\nimport { type MatrixEvent } from \"./models/event.ts\";\nimport { NamespacedValue } from \"./NamespacedValue.ts\";\n\nconst profileFieldsFilterName = new NamespacedValue(\"profile_fields\", \"org.matrix.msc4429.profile_fields\");\n\n/**\n */\nfunction setProp(obj: Record<string, any>, keyNesting: string, val: any): void {\n const nestedKeys = keyNesting.split(\".\") as [keyof typeof obj];\n let currentObj = obj;\n for (let i = 0; i < nestedKeys.length - 1; i++) {\n if (!currentObj[nestedKeys[i]]) {\n currentObj[nestedKeys[i]] = {};\n }\n currentObj = currentObj[nestedKeys[i]];\n }\n currentObj[nestedKeys[nestedKeys.length - 1]] = val;\n}\n\n/* eslint-disable camelcase */\nexport interface IFilterDefinition {\n \"event_fields\"?: string[];\n \"event_format\"?: \"client\" | \"federation\";\n \"presence\"?: IFilterComponent;\n \"account_data\"?: IFilterComponent;\n \"room\"?: IRoomFilter;\n \"profile_fields\"?: ProfileFieldsFilter;\n \"org.matrix.msc4429.profile_fields\"?: ProfileFieldsFilter;\n}\n\nexport interface IRoomEventFilter extends IFilterComponent {\n \"lazy_load_members\"?: boolean;\n \"include_redundant_members\"?: boolean;\n \"types\"?: Array<EventType | string>;\n \"related_by_senders\"?: Array<RelationType | string>;\n \"related_by_rel_types\"?: string[];\n \"unread_thread_notifications\"?: boolean;\n \"org.matrix.msc3773.unread_thread_notifications\"?: boolean;\n\n // Unstable values\n \"io.element.relation_senders\"?: Array<RelationType | string>;\n \"io.element.relation_types\"?: string[];\n}\n\ninterface IStateFilter extends IRoomEventFilter {}\n\ninterface IRoomFilter {\n not_rooms?: string[];\n rooms?: string[];\n ephemeral?: IRoomEventFilter;\n include_leave?: boolean;\n state?: IStateFilter;\n timeline?: IRoomEventFilter;\n account_data?: IRoomEventFilter;\n}\n\n/**\n * Filter section used for requesting a set of extended profile fields that will be sent down the sync stream.\n */\ninterface ProfileFieldsFilter {\n ids: string[];\n}\n\n/* eslint-enable camelcase */\n\nexport class Filter {\n public static LAZY_LOADING_MESSAGES_FILTER = {\n lazy_load_members: true,\n };\n\n /**\n * Create a filter from existing data.\n */\n public static fromJson(userId: string | undefined | null, filterId: string, jsonObj: IFilterDefinition): Filter {\n const filter = new Filter(userId, filterId);\n filter.setDefinition(jsonObj);\n return filter;\n }\n\n private definition: IFilterDefinition = {};\n private roomFilter?: FilterComponent;\n private roomTimelineFilter?: FilterComponent;\n\n /**\n * Construct a new Filter.\n * @param userId - The user ID for this filter.\n * @param filterId - The filter ID if known.\n */\n public constructor(\n public readonly userId: string | undefined | null,\n public filterId?: string,\n ) {}\n\n /**\n * Get the ID of this filter on your homeserver (if known)\n * @returns The filter ID\n */\n public getFilterId(): string | undefined {\n return this.filterId;\n }\n\n /**\n * Get the JSON body of the filter.\n * @returns The filter definition\n */\n public getDefinition(): IFilterDefinition {\n return this.definition;\n }\n\n /**\n * Set the JSON body of the filter\n * @param definition - The filter definition\n */\n public setDefinition(definition: IFilterDefinition): void {\n this.definition = definition;\n\n // This is all ported from synapse's FilterCollection()\n\n // definitions look something like:\n // {\n // \"room\": {\n // \"rooms\": [\"!abcde:example.com\"],\n // \"not_rooms\": [\"!123456:example.com\"],\n // \"state\": {\n // \"types\": [\"m.room.*\"],\n // \"not_rooms\": [\"!726s6s6q:example.com\"],\n // \"lazy_load_members\": true,\n // },\n // \"timeline\": {\n // \"limit\": 10,\n // \"types\": [\"m.room.message\"],\n // \"not_rooms\": [\"!726s6s6q:example.com\"],\n // \"not_senders\": [\"@spam:example.com\"]\n // \"contains_url\": true\n // },\n // \"ephemeral\": {\n // \"types\": [\"m.receipt\", \"m.typing\"],\n // \"not_rooms\": [\"!726s6s6q:example.com\"],\n // \"not_senders\": [\"@spam:example.com\"]\n // }\n // },\n // \"presence\": {\n // \"types\": [\"m.presence\"],\n // \"not_senders\": [\"@alice:example.com\"]\n // },\n // \"event_format\": \"client\",\n // \"event_fields\": [\"type\", \"content\", \"sender\"]\n // }\n\n const roomFilterJson = definition.room;\n\n // consider the top level rooms/not_rooms filter\n const roomFilterFields: IRoomFilter = {};\n if (roomFilterJson) {\n if (roomFilterJson.rooms) {\n roomFilterFields.rooms = roomFilterJson.rooms;\n }\n if (roomFilterJson.rooms) {\n roomFilterFields.not_rooms = roomFilterJson.not_rooms;\n }\n }\n\n this.roomFilter = new FilterComponent(roomFilterFields, this.userId);\n this.roomTimelineFilter = new FilterComponent(roomFilterJson?.timeline || {}, this.userId);\n\n // don't bother porting this from synapse yet:\n // this._room_state_filter =\n // new FilterComponent(roomFilterJson.state || {});\n // this._room_ephemeral_filter =\n // new FilterComponent(roomFilterJson.ephemeral || {});\n // this._room_account_data_filter =\n // new FilterComponent(roomFilterJson.account_data || {});\n // this._presence_filter =\n // new FilterComponent(definition.presence || {});\n // this._account_data_filter =\n // new FilterComponent(definition.account_data || {});\n }\n\n /**\n * Get the room.timeline filter component of the filter\n * @returns room timeline filter component\n */\n public getRoomTimelineFilterComponent(): FilterComponent | undefined {\n return this.roomTimelineFilter;\n }\n\n /**\n * Filter the list of events based on whether they are allowed in a timeline\n * based on this filter\n * @param events - the list of events being filtered\n * @returns the list of events which match the filter\n */\n public filterRoomTimeline(events: MatrixEvent[]): MatrixEvent[] {\n if (this.roomFilter) {\n events = this.roomFilter.filter(events);\n }\n if (this.roomTimelineFilter) {\n events = this.roomTimelineFilter.filter(events);\n }\n return events;\n }\n\n /**\n * Set the max number of events to return for each room's timeline.\n * @param limit - The max number of events to return for each room.\n */\n public setTimelineLimit(limit: number): void {\n setProp(this.definition, \"room.timeline.limit\", limit);\n }\n\n /**\n * Enable threads unread notification\n */\n public setUnreadThreadNotifications(enabled: boolean): void {\n this.definition = {\n ...this.definition,\n room: {\n ...this.definition?.room,\n timeline: {\n ...this.definition?.room?.timeline,\n [UNREAD_THREAD_NOTIFICATIONS.name]: enabled,\n },\n },\n };\n }\n\n public setLazyLoadMembers(enabled: boolean): void {\n setProp(this.definition, \"room.state.lazy_load_members\", enabled);\n }\n\n /**\n * Control whether left rooms should be included in responses.\n * @param includeLeave - True to make rooms the user has left appear\n * in responses.\n */\n public setIncludeLeaveRooms(includeLeave: boolean): void {\n setProp(this.definition, \"room.include_leave\", includeLeave);\n }\n\n /**\n * Set the list of fields to be included in the profile information sent down the sync stream.\n * @param ids The field IDs to sync.\n * @param stable Whether to use the stable or unstable versions of this filter.\n * @experimental\n */\n public setUnstableMSC4429SyncUserProfiles(ids: string[], stable: boolean): void {\n const field = stable\n ? profileFieldsFilterName.name\n : (profileFieldsFilterName.unstable ?? profileFieldsFilterName.name);\n this.definition[field] = { ids };\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"filter.js","names":["UNREAD_THREAD_NOTIFICATIONS","FilterComponent","NamespacedValue","profileFieldsFilterName","setProp","obj","keyNesting","val","nestedKeys","split","currentObj","i","length","Filter","fromJson","userId","filterId","jsonObj","filter","setDefinition","constructor","_defineProperty","getFilterId","getDefinition","definition","roomFilterJson","room","roomFilterFields","rooms","not_rooms","roomFilter","roomTimelineFilter","timeline","getRoomTimelineFilterComponent","filterRoomTimeline","events","setTimelineLimit","limit","setUnreadThreadNotifications","enabled","_this$definition","_this$definition2","_objectSpread","name","setLazyLoadMembers","setIncludeLeaveRooms","includeLeave","setUnstableMSC4429SyncUserProfiles","ids","stable","_profileFieldsFilterN","field","unstable","lazy_load_members"],"sources":["../src/filter.ts"],"sourcesContent":["/*\nCopyright 2015 - 2021 Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { type EventType, type RelationType } from \"./@types/event.ts\";\nimport { UNREAD_THREAD_NOTIFICATIONS } from \"./@types/sync.ts\";\nimport { FilterComponent, type IFilterComponent } from \"./filter-component.ts\";\nimport { type MatrixEvent } from \"./models/event.ts\";\nimport { NamespacedValue } from \"./NamespacedValue.ts\";\n\nconst profileFieldsFilterName = new NamespacedValue(\"profile_fields\", \"org.matrix.msc4429.profile_fields\");\n\n/**\n */\nfunction setProp(obj: Record<string, any>, keyNesting: string, val: any): void {\n const nestedKeys = keyNesting.split(\".\") as [keyof typeof obj];\n let currentObj = obj;\n for (let i = 0; i < nestedKeys.length - 1; i++) {\n if (!currentObj[nestedKeys[i]]) {\n currentObj[nestedKeys[i]] = {};\n }\n currentObj = currentObj[nestedKeys[i]];\n }\n currentObj[nestedKeys[nestedKeys.length - 1]] = val;\n}\n\n/* eslint-disable camelcase */\nexport interface IFilterDefinition {\n \"event_fields\"?: string[];\n \"event_format\"?: \"client\" | \"federation\";\n \"presence\"?: IFilterComponent;\n \"account_data\"?: IFilterComponent;\n \"room\"?: IRoomFilter;\n \"profile_fields\"?: ProfileFieldsFilter;\n \"org.matrix.msc4429.profile_fields\"?: ProfileFieldsFilter;\n}\n\nexport interface IRoomEventFilter extends IFilterComponent {\n \"lazy_load_members\"?: boolean;\n \"include_redundant_members\"?: boolean;\n \"types\"?: Array<EventType | string>;\n \"related_by_senders\"?: Array<RelationType | string>;\n \"related_by_rel_types\"?: string[];\n \"unread_thread_notifications\"?: boolean;\n \"org.matrix.msc3773.unread_thread_notifications\"?: boolean;\n\n // Unstable values\n \"io.element.relation_senders\"?: Array<RelationType | string>;\n \"io.element.relation_types\"?: string[];\n}\n\ninterface IStateFilter extends IRoomEventFilter {}\n\ninterface IRoomFilter {\n not_rooms?: string[];\n rooms?: string[];\n ephemeral?: IRoomEventFilter;\n include_leave?: boolean;\n state?: IStateFilter;\n timeline?: IRoomEventFilter;\n account_data?: IRoomEventFilter;\n}\n\n/**\n * Filter section used for requesting a set of extended profile fields that will be sent down the sync stream.\n */\ninterface ProfileFieldsFilter {\n ids: string[];\n}\n\n/* eslint-enable camelcase */\n\nexport class Filter {\n public static LAZY_LOADING_MESSAGES_FILTER = {\n lazy_load_members: true,\n };\n\n /**\n * Create a filter from existing data.\n */\n public static fromJson(userId: string | undefined | null, filterId: string, jsonObj: IFilterDefinition): Filter {\n const filter = new Filter(userId, filterId);\n filter.setDefinition(jsonObj);\n return filter;\n }\n\n private definition: IFilterDefinition = {};\n private roomFilter?: FilterComponent;\n private roomTimelineFilter?: FilterComponent;\n\n /**\n * Construct a new Filter.\n * @param userId - The user ID for this filter.\n * @param filterId - The filter ID if known.\n */\n public constructor(\n public readonly userId: string | undefined | null,\n public filterId?: string,\n ) {}\n\n /**\n * Get the ID of this filter on your homeserver (if known)\n * @returns The filter ID\n */\n public getFilterId(): string | undefined {\n return this.filterId;\n }\n\n /**\n * Get the JSON body of the filter.\n * @returns The filter definition\n */\n public getDefinition(): IFilterDefinition {\n return this.definition;\n }\n\n /**\n * Set the JSON body of the filter\n * @param definition - The filter definition\n */\n public setDefinition(definition: IFilterDefinition): void {\n this.definition = definition;\n\n // This is all ported from synapse's FilterCollection()\n\n // definitions look something like:\n // {\n // \"room\": {\n // \"rooms\": [\"!abcde:example.com\"],\n // \"not_rooms\": [\"!123456:example.com\"],\n // \"state\": {\n // \"types\": [\"m.room.*\"],\n // \"not_rooms\": [\"!726s6s6q:example.com\"],\n // \"lazy_load_members\": true,\n // },\n // \"timeline\": {\n // \"limit\": 10,\n // \"types\": [\"m.room.message\"],\n // \"not_rooms\": [\"!726s6s6q:example.com\"],\n // \"not_senders\": [\"@spam:example.com\"]\n // \"contains_url\": true\n // },\n // \"ephemeral\": {\n // \"types\": [\"m.receipt\", \"m.typing\"],\n // \"not_rooms\": [\"!726s6s6q:example.com\"],\n // \"not_senders\": [\"@spam:example.com\"]\n // }\n // },\n // \"presence\": {\n // \"types\": [\"m.presence\"],\n // \"not_senders\": [\"@alice:example.com\"]\n // },\n // \"event_format\": \"client\",\n // \"event_fields\": [\"type\", \"content\", \"sender\"]\n // }\n\n const roomFilterJson = definition.room;\n\n // consider the top level rooms/not_rooms filter\n const roomFilterFields: IRoomFilter = {};\n if (roomFilterJson) {\n if (roomFilterJson.rooms) {\n roomFilterFields.rooms = roomFilterJson.rooms;\n }\n if (roomFilterJson.rooms) {\n roomFilterFields.not_rooms = roomFilterJson.not_rooms;\n }\n }\n\n this.roomFilter = new FilterComponent(roomFilterFields, this.userId);\n this.roomTimelineFilter = new FilterComponent(roomFilterJson?.timeline || {}, this.userId);\n\n // don't bother porting this from synapse yet:\n // this._room_state_filter =\n // new FilterComponent(roomFilterJson.state || {});\n // this._room_ephemeral_filter =\n // new FilterComponent(roomFilterJson.ephemeral || {});\n // this._room_account_data_filter =\n // new FilterComponent(roomFilterJson.account_data || {});\n // this._presence_filter =\n // new FilterComponent(definition.presence || {});\n // this._account_data_filter =\n // new FilterComponent(definition.account_data || {});\n }\n\n /**\n * Get the room.timeline filter component of the filter\n * @returns room timeline filter component\n */\n public getRoomTimelineFilterComponent(): FilterComponent | undefined {\n return this.roomTimelineFilter;\n }\n\n /**\n * Filter the list of events based on whether they are allowed in a timeline\n * based on this filter\n * @param events - the list of events being filtered\n * @returns the list of events which match the filter\n */\n public filterRoomTimeline(events: MatrixEvent[]): MatrixEvent[] {\n if (this.roomFilter) {\n events = this.roomFilter.filter(events);\n }\n if (this.roomTimelineFilter) {\n events = this.roomTimelineFilter.filter(events);\n }\n return events;\n }\n\n /**\n * Set the max number of events to return for each room's timeline.\n * @param limit - The max number of events to return for each room.\n */\n public setTimelineLimit(limit: number): void {\n setProp(this.definition, \"room.timeline.limit\", limit);\n }\n\n /**\n * Enable threads unread notification\n */\n public setUnreadThreadNotifications(enabled: boolean): void {\n this.definition = {\n ...this.definition,\n room: {\n ...this.definition?.room,\n timeline: {\n ...this.definition?.room?.timeline,\n [UNREAD_THREAD_NOTIFICATIONS.name]: enabled,\n },\n },\n };\n }\n\n public setLazyLoadMembers(enabled: boolean): void {\n setProp(this.definition, \"room.state.lazy_load_members\", enabled);\n }\n\n /**\n * Control whether left rooms should be included in responses.\n * @param includeLeave - True to make rooms the user has left appear\n * in responses.\n */\n public setIncludeLeaveRooms(includeLeave: boolean): void {\n setProp(this.definition, \"room.include_leave\", includeLeave);\n }\n\n /**\n * Set the list of fields to be included in the profile information sent down the sync stream.\n * @param ids The field IDs to sync.\n * @param stable Whether to use the stable or unstable versions of this filter.\n * @experimental\n */\n public setUnstableMSC4429SyncUserProfiles(ids: string[], stable: boolean): void {\n const field = stable\n ? profileFieldsFilterName.name\n : (profileFieldsFilterName.unstable ?? profileFieldsFilterName.name);\n this.definition[field] = { ids };\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,5 +1,5 @@
1
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
1
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
3
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
4
4
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
5
5
  /*
@@ -72,12 +72,6 @@ export class HTTPError extends Error {
72
72
  }
73
73
  }
74
74
  export class MatrixError extends HTTPError {
75
- // The Matrix 'errcode' value, e.g. "M_FORBIDDEN".
76
-
77
- // The Matrix 'error' value.
78
-
79
- // The raw Matrix error JSON used to construct this object.
80
-
81
75
  /**
82
76
  * Construct a Matrix error. This is a JavaScript Error with additional
83
77
  * information specific to the standard Matrix error response.
@@ -101,6 +95,12 @@ export class MatrixError extends HTTPError {
101
95
  super("MatrixError: ".concat(message), httpStatus, httpHeaders);
102
96
  this.url = url;
103
97
  this.event = event;
98
+ // The Matrix 'errcode' value, e.g. "M_FORBIDDEN".
99
+ _defineProperty(this, "errcode", void 0);
100
+ // The Matrix 'error' value.
101
+ _defineProperty(this, "error", void 0);
102
+ // The raw Matrix error JSON used to construct this object.
103
+ _defineProperty(this, "data", void 0);
104
104
  this.errcode = errorJson.errcode;
105
105
  this.error = errorJson.error;
106
106
  this.name = errorJson.errcode || "Unknown error code";
@@ -227,17 +227,17 @@ export var MatrixSafetyErrorCode = new NamespacedValue(null, "ORG.MATRIX.MSC4387
227
227
  * @see https://github.com/matrix-org/matrix-spec-proposals/pull/4387
228
228
  */
229
229
  export class MatrixSafetyError extends MatrixError {
230
- /**
231
- * The kinds of harms detected by the server.
232
- * @see https://github.com/matrix-org/matrix-spec-proposals/pull/4387 for a list of spec defined harms.
233
- */
234
-
235
- /**
236
- * The date at which a request can be reattempted.
237
- */
238
-
239
230
  constructor() {
240
231
  super(...arguments);
232
+ /**
233
+ * The kinds of harms detected by the server.
234
+ * @see https://github.com/matrix-org/matrix-spec-proposals/pull/4387 for a list of spec defined harms.
235
+ */
236
+ _defineProperty(this, "harms", void 0);
237
+ /**
238
+ * The date at which a request can be reattempted.
239
+ */
240
+ _defineProperty(this, "expiry", void 0);
241
241
  var body = arguments.length <= 0 ? undefined : arguments[0];
242
242
  this.harms = new Set(body && "harms" in body && Array.isArray(body.harms) ? body.harms : []);
243
243
  this.message = "".concat(super.message, " (").concat([...this.harms].join(", "), ")");
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","names":["NamespacedValue","HTTPError","Error","constructor","msg","httpStatus","httpHeaders","isRateLimitError","getRetryAfterMs","_this$httpHeaders","retryAfter","get","test","ms","Number","parseInt","isFinite","date","Date","toUTCString","getTime","now","MatrixError","errorJson","arguments","length","undefined","url","event","message","error","concat","errcode","name","data","headerValue","isInteger","retry_after_ms","asWidgetApiErrorData","_this$httpStatus","_this$url","_this$errcode","_this$data$error","headers","_ref3","_ref2","_slicedToArray","value","http_status","http_headers","response","_objectSpread","fromWidgetApiErrorData","Headers","safeGetRetryAfterMs","defaultMs","_error$getRetryAfterM","_unused","ConnectionError","cause","TokenRefreshError","_cause$message","TokenRefreshLogoutError","_cause$message2","MatrixSafetyErrorCode","MatrixSafetyError","body","harms","Set","Array","isArray","join","expiry"],"sources":["../../src/http-api/errors.ts"],"sourcesContent":["/*\nCopyright 2022 - 2024 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { type IMatrixApiError as IWidgetMatrixError } from \"matrix-widget-api\";\n\nimport { type IUsageLimit } from \"../@types/partials.ts\";\nimport { type MatrixEvent } from \"../models/event.ts\";\nimport { NamespacedValue } from \"../NamespacedValue.ts\";\n\ninterface IErrorJson extends Partial<IUsageLimit> {\n [key: string]: any; // extensible\n errcode?: string;\n error?: string;\n}\n\n/**\n * Construct a generic HTTP error. This is a JavaScript Error with additional information\n * specific to HTTP responses.\n * @param msg - The error message to include.\n * @param httpStatus - The HTTP response status code.\n * @param httpHeaders - The HTTP response headers.\n */\nexport class HTTPError extends Error {\n public constructor(\n msg: string,\n public readonly httpStatus?: number,\n public readonly httpHeaders?: Headers,\n ) {\n super(msg);\n }\n\n /**\n * Check if this error was due to rate-limiting on the server side (and should therefore be retried after a delay).\n *\n * If this returns `true`, {@link getRetryAfterMs} can be called to retrieve the server-side\n * recommendation for the retry period.\n *\n * @returns Whether this error is due to rate-limiting.\n */\n public isRateLimitError(): boolean {\n return this.httpStatus === 429;\n }\n\n /**\n * @returns The recommended delay in milliseconds to wait before retrying\n * the request that triggered this error, or null if no delay is recommended.\n * @throws Error if the recommended delay is an invalid value.\n * @see {@link safeGetRetryAfterMs} for a version of this check that doesn't throw.\n */\n public getRetryAfterMs(): number | null {\n const retryAfter = this.httpHeaders?.get(\"Retry-After\");\n if (retryAfter != null) {\n if (/^\\d+$/.test(retryAfter)) {\n const ms = Number.parseInt(retryAfter) * 1000;\n if (!Number.isFinite(ms)) {\n throw new Error(\"Retry-After header integer value is too large\");\n }\n return ms;\n }\n const date = new Date(retryAfter);\n if (date.toUTCString() !== retryAfter) {\n throw new Error(\"Retry-After header value is not a valid HTTP-date or non-negative decimal integer\");\n }\n return date.getTime() - Date.now();\n }\n return null;\n }\n}\n\nexport class MatrixError extends HTTPError {\n // The Matrix 'errcode' value, e.g. \"M_FORBIDDEN\".\n public readonly errcode?: string;\n // The Matrix 'error' value.\n public readonly error?: string;\n // The raw Matrix error JSON used to construct this object.\n public data: IErrorJson;\n\n /**\n * Construct a Matrix error. This is a JavaScript Error with additional\n * information specific to the standard Matrix error response.\n * @param errorJson - The Matrix error JSON returned from the homeserver.\n * @param httpStatus - The numeric HTTP status code given\n * @param httpHeaders - The HTTP response headers given\n */\n public constructor(\n errorJson: IErrorJson = {},\n httpStatus?: number,\n public url?: string,\n public event?: MatrixEvent,\n httpHeaders?: Headers,\n ) {\n let message = errorJson.error || \"Unknown message\";\n if (httpStatus) {\n message = `[${httpStatus}] ${message}`;\n }\n if (url) {\n message = `${message} (${url})`;\n }\n super(`MatrixError: ${message}`, httpStatus, httpHeaders);\n this.errcode = errorJson.errcode;\n this.error = errorJson.error;\n this.name = errorJson.errcode || \"Unknown error code\";\n this.data = errorJson;\n }\n\n public isRateLimitError(): boolean {\n return (\n this.errcode === \"M_LIMIT_EXCEEDED\" ||\n ((this.errcode === \"M_UNKNOWN\" || this.errcode === undefined) && super.isRateLimitError())\n );\n }\n\n public getRetryAfterMs(): number | null {\n const headerValue = super.getRetryAfterMs();\n if (headerValue !== null) {\n return headerValue;\n }\n // Note: retry_after_ms is deprecated as of spec version v1.10\n if (this.errcode === \"M_LIMIT_EXCEEDED\" && \"retry_after_ms\" in this.data) {\n if (!Number.isInteger(this.data.retry_after_ms)) {\n throw new Error(\"retry_after_ms is not an integer\");\n }\n return this.data.retry_after_ms;\n }\n return null;\n }\n\n /**\n * @returns this error expressed as a JSON payload\n * for use by Widget API error responses.\n */\n public asWidgetApiErrorData(): IWidgetMatrixError {\n const headers: Record<string, string> = {};\n if (this.httpHeaders) {\n for (const [name, value] of this.httpHeaders) {\n headers[name] = value;\n }\n }\n return {\n http_status: this.httpStatus ?? 400,\n http_headers: headers,\n url: this.url ?? \"\",\n response: {\n errcode: this.errcode ?? \"M_UNKNOWN\",\n error: this.data.error ?? \"Unknown message\",\n ...this.data,\n },\n };\n }\n\n /**\n * @returns a new {@link MatrixError} from a JSON payload\n * received from Widget API error responses.\n */\n public static fromWidgetApiErrorData(data: IWidgetMatrixError): MatrixError {\n return new MatrixError(data.response, data.http_status, data.url, undefined, new Headers(data.http_headers));\n }\n}\n\n/**\n * @returns The recommended delay in milliseconds to wait before retrying the request.\n * @param error - The error to check for a retry delay.\n * @param defaultMs - The delay to use if the error was not due to rate-limiting or if no valid delay is recommended.\n */\nexport function safeGetRetryAfterMs(error: unknown, defaultMs: number): number {\n if (!(error instanceof HTTPError) || !error.isRateLimitError()) {\n return defaultMs;\n }\n try {\n return error.getRetryAfterMs() ?? defaultMs;\n } catch {\n return defaultMs;\n }\n}\n\n/**\n * Construct a ConnectionError. This is a JavaScript Error indicating\n * that a request failed because of some error with the connection, either\n * CORS was not correctly configured on the server, the server didn't response,\n * the request timed out, or the internet connection on the client side went down.\n */\nexport class ConnectionError extends Error {\n public constructor(message: string, cause?: Error) {\n super(message + (cause ? `: ${cause.message}` : \"\"));\n }\n\n public get name(): string {\n return \"ConnectionError\";\n }\n}\n\n/**\n * Construct a TokenRefreshError. This indicates that a request failed due to the token being expired,\n * and attempting to refresh said token also failed but in a way which was not indicative of token invalidation.\n * Assumed to be a temporary failure.\n */\nexport class TokenRefreshError extends Error {\n public constructor(cause?: Error) {\n super(cause?.message ?? \"\");\n }\n\n public get name(): string {\n return \"TokenRefreshError\";\n }\n}\n\n/**\n * Construct a TokenRefreshError. This indicates that a request failed due to the token being expired,\n * and attempting to refresh said token failed in a way indicative of token invalidation.\n */\nexport class TokenRefreshLogoutError extends Error {\n public constructor(cause?: Error) {\n super(cause?.message ?? \"\");\n }\n\n public get name(): string {\n return \"TokenRefreshLogoutError\";\n }\n}\n\nexport const MatrixSafetyErrorCode = new NamespacedValue(null, \"ORG.MATRIX.MSC4387_SAFETY\");\n\n/***\n * This error is thrown when the homeserver refuses to handle an action due to a\n * safety concern.\n * @see https://github.com/matrix-org/matrix-spec-proposals/pull/4387\n */\nexport class MatrixSafetyError extends MatrixError {\n /**\n * The kinds of harms detected by the server.\n * @see https://github.com/matrix-org/matrix-spec-proposals/pull/4387 for a list of spec defined harms.\n */\n public readonly harms: Set<string>;\n /**\n * The date at which a request can be reattempted.\n */\n public readonly expiry?: Date;\n public constructor(...props: ConstructorParameters<typeof MatrixError>) {\n super(...props);\n const body = props[0];\n\n this.harms = new Set(body && \"harms\" in body && Array.isArray(body.harms) ? body.harms : []);\n this.message = `${super.message} (${[...this.harms].join(\", \")})`;\n if (body && \"expiry\" in body && typeof body.expiry === \"number\") {\n this.expiry = new Date(body.expiry);\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"errors.js","names":["NamespacedValue","HTTPError","Error","constructor","msg","httpStatus","httpHeaders","isRateLimitError","getRetryAfterMs","_this$httpHeaders","retryAfter","get","test","ms","Number","parseInt","isFinite","date","Date","toUTCString","getTime","now","MatrixError","errorJson","arguments","length","undefined","url","event","message","error","concat","_defineProperty","errcode","name","data","headerValue","isInteger","retry_after_ms","asWidgetApiErrorData","_this$httpStatus","_this$url","_this$errcode","_this$data$error","headers","_ref3","_ref2","_slicedToArray","value","http_status","http_headers","response","_objectSpread","fromWidgetApiErrorData","Headers","safeGetRetryAfterMs","defaultMs","_error$getRetryAfterM","_unused","ConnectionError","cause","TokenRefreshError","_cause$message","TokenRefreshLogoutError","_cause$message2","MatrixSafetyErrorCode","MatrixSafetyError","body","harms","Set","Array","isArray","join","expiry"],"sources":["../../src/http-api/errors.ts"],"sourcesContent":["/*\nCopyright 2022 - 2024 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { type IMatrixApiError as IWidgetMatrixError } from \"matrix-widget-api\";\n\nimport { type IUsageLimit } from \"../@types/partials.ts\";\nimport { type MatrixEvent } from \"../models/event.ts\";\nimport { NamespacedValue } from \"../NamespacedValue.ts\";\n\ninterface IErrorJson extends Partial<IUsageLimit> {\n [key: string]: any; // extensible\n errcode?: string;\n error?: string;\n}\n\n/**\n * Construct a generic HTTP error. This is a JavaScript Error with additional information\n * specific to HTTP responses.\n * @param msg - The error message to include.\n * @param httpStatus - The HTTP response status code.\n * @param httpHeaders - The HTTP response headers.\n */\nexport class HTTPError extends Error {\n public constructor(\n msg: string,\n public readonly httpStatus?: number,\n public readonly httpHeaders?: Headers,\n ) {\n super(msg);\n }\n\n /**\n * Check if this error was due to rate-limiting on the server side (and should therefore be retried after a delay).\n *\n * If this returns `true`, {@link getRetryAfterMs} can be called to retrieve the server-side\n * recommendation for the retry period.\n *\n * @returns Whether this error is due to rate-limiting.\n */\n public isRateLimitError(): boolean {\n return this.httpStatus === 429;\n }\n\n /**\n * @returns The recommended delay in milliseconds to wait before retrying\n * the request that triggered this error, or null if no delay is recommended.\n * @throws Error if the recommended delay is an invalid value.\n * @see {@link safeGetRetryAfterMs} for a version of this check that doesn't throw.\n */\n public getRetryAfterMs(): number | null {\n const retryAfter = this.httpHeaders?.get(\"Retry-After\");\n if (retryAfter != null) {\n if (/^\\d+$/.test(retryAfter)) {\n const ms = Number.parseInt(retryAfter) * 1000;\n if (!Number.isFinite(ms)) {\n throw new Error(\"Retry-After header integer value is too large\");\n }\n return ms;\n }\n const date = new Date(retryAfter);\n if (date.toUTCString() !== retryAfter) {\n throw new Error(\"Retry-After header value is not a valid HTTP-date or non-negative decimal integer\");\n }\n return date.getTime() - Date.now();\n }\n return null;\n }\n}\n\nexport class MatrixError extends HTTPError {\n // The Matrix 'errcode' value, e.g. \"M_FORBIDDEN\".\n public readonly errcode?: string;\n // The Matrix 'error' value.\n public readonly error?: string;\n // The raw Matrix error JSON used to construct this object.\n public data: IErrorJson;\n\n /**\n * Construct a Matrix error. This is a JavaScript Error with additional\n * information specific to the standard Matrix error response.\n * @param errorJson - The Matrix error JSON returned from the homeserver.\n * @param httpStatus - The numeric HTTP status code given\n * @param httpHeaders - The HTTP response headers given\n */\n public constructor(\n errorJson: IErrorJson = {},\n httpStatus?: number,\n public url?: string,\n public event?: MatrixEvent,\n httpHeaders?: Headers,\n ) {\n let message = errorJson.error || \"Unknown message\";\n if (httpStatus) {\n message = `[${httpStatus}] ${message}`;\n }\n if (url) {\n message = `${message} (${url})`;\n }\n super(`MatrixError: ${message}`, httpStatus, httpHeaders);\n this.errcode = errorJson.errcode;\n this.error = errorJson.error;\n this.name = errorJson.errcode || \"Unknown error code\";\n this.data = errorJson;\n }\n\n public isRateLimitError(): boolean {\n return (\n this.errcode === \"M_LIMIT_EXCEEDED\" ||\n ((this.errcode === \"M_UNKNOWN\" || this.errcode === undefined) && super.isRateLimitError())\n );\n }\n\n public getRetryAfterMs(): number | null {\n const headerValue = super.getRetryAfterMs();\n if (headerValue !== null) {\n return headerValue;\n }\n // Note: retry_after_ms is deprecated as of spec version v1.10\n if (this.errcode === \"M_LIMIT_EXCEEDED\" && \"retry_after_ms\" in this.data) {\n if (!Number.isInteger(this.data.retry_after_ms)) {\n throw new Error(\"retry_after_ms is not an integer\");\n }\n return this.data.retry_after_ms;\n }\n return null;\n }\n\n /**\n * @returns this error expressed as a JSON payload\n * for use by Widget API error responses.\n */\n public asWidgetApiErrorData(): IWidgetMatrixError {\n const headers: Record<string, string> = {};\n if (this.httpHeaders) {\n for (const [name, value] of this.httpHeaders) {\n headers[name] = value;\n }\n }\n return {\n http_status: this.httpStatus ?? 400,\n http_headers: headers,\n url: this.url ?? \"\",\n response: {\n errcode: this.errcode ?? \"M_UNKNOWN\",\n error: this.data.error ?? \"Unknown message\",\n ...this.data,\n },\n };\n }\n\n /**\n * @returns a new {@link MatrixError} from a JSON payload\n * received from Widget API error responses.\n */\n public static fromWidgetApiErrorData(data: IWidgetMatrixError): MatrixError {\n return new MatrixError(data.response, data.http_status, data.url, undefined, new Headers(data.http_headers));\n }\n}\n\n/**\n * @returns The recommended delay in milliseconds to wait before retrying the request.\n * @param error - The error to check for a retry delay.\n * @param defaultMs - The delay to use if the error was not due to rate-limiting or if no valid delay is recommended.\n */\nexport function safeGetRetryAfterMs(error: unknown, defaultMs: number): number {\n if (!(error instanceof HTTPError) || !error.isRateLimitError()) {\n return defaultMs;\n }\n try {\n return error.getRetryAfterMs() ?? defaultMs;\n } catch {\n return defaultMs;\n }\n}\n\n/**\n * Construct a ConnectionError. This is a JavaScript Error indicating\n * that a request failed because of some error with the connection, either\n * CORS was not correctly configured on the server, the server didn't response,\n * the request timed out, or the internet connection on the client side went down.\n */\nexport class ConnectionError extends Error {\n public constructor(message: string, cause?: Error) {\n super(message + (cause ? `: ${cause.message}` : \"\"));\n }\n\n public get name(): string {\n return \"ConnectionError\";\n }\n}\n\n/**\n * Construct a TokenRefreshError. This indicates that a request failed due to the token being expired,\n * and attempting to refresh said token also failed but in a way which was not indicative of token invalidation.\n * Assumed to be a temporary failure.\n */\nexport class TokenRefreshError extends Error {\n public constructor(cause?: Error) {\n super(cause?.message ?? \"\");\n }\n\n public get name(): string {\n return \"TokenRefreshError\";\n }\n}\n\n/**\n * Construct a TokenRefreshError. This indicates that a request failed due to the token being expired,\n * and attempting to refresh said token failed in a way indicative of token invalidation.\n */\nexport class TokenRefreshLogoutError extends Error {\n public constructor(cause?: Error) {\n super(cause?.message ?? \"\");\n }\n\n public get name(): string {\n return \"TokenRefreshLogoutError\";\n }\n}\n\nexport const MatrixSafetyErrorCode = new NamespacedValue(null, \"ORG.MATRIX.MSC4387_SAFETY\");\n\n/***\n * This error is thrown when the homeserver refuses to handle an action due to a\n * safety concern.\n * @see https://github.com/matrix-org/matrix-spec-proposals/pull/4387\n */\nexport class MatrixSafetyError extends MatrixError {\n /**\n * The kinds of harms detected by the server.\n * @see https://github.com/matrix-org/matrix-spec-proposals/pull/4387 for a list of spec defined harms.\n */\n public readonly harms: Set<string>;\n /**\n * The date at which a request can be reattempted.\n */\n public readonly expiry?: Date;\n public constructor(...props: ConstructorParameters<typeof MatrixError>) {\n super(...props);\n const body = props[0];\n\n this.harms = new Set(body && \"harms\" in body && Array.isArray(body.harms) ? body.harms : []);\n this.message = `${super.message} (${[...this.harms].join(\", \")})`;\n if (body && \"expiry\" in body && typeof body.expiry === \"number\") {\n this.expiry = new Date(body.expiry);\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -31,9 +31,10 @@ import { TokenRefresher, TokenRefreshOutcome } from "./refresh.js";
31
31
  export class FetchHttpApi {
32
32
  constructor(eventEmitter, opts) {
33
33
  var _opts$useAuthorizatio;
34
- _defineProperty(this, "abortController", new AbortController());
35
34
  this.eventEmitter = eventEmitter;
36
35
  this.opts = opts;
36
+ _defineProperty(this, "abortController", new AbortController());
37
+ _defineProperty(this, "tokenRefresher", void 0);
37
38
  checkObjectHasKeys(opts, ["baseUrl", "prefix"]);
38
39
  if (!opts.onlyData) {
39
40
  throw new Error("Constructing FetchHttpApi without `onlyData=true` is no longer supported.");
@@ -1 +1 @@
1
- {"version":3,"file":"fetch.js","names":["checkObjectHasKeys","deepCopy","encodeParams","Method","ConnectionError","MatrixError","TokenRefreshError","HttpApiEvent","anySignal","parseErrorResponse","timeoutSignal","TokenRefresher","TokenRefreshOutcome","FetchHttpApi","constructor","eventEmitter","opts","_opts$useAuthorizatio","_defineProperty","AbortController","onlyData","Error","useAuthorizationHeader","tokenRefresher","abort","abortController","fetch","resource","options","fetchFn","globalThis","setIdBaseUrl","url","idBaseUrl","idServerRequest","method","path","params","prefix","accessToken","queryParams","undefined","body","Get","fullUri","getUrl","json","headers","Authorization","concat","requestOtherUrl","authedRequest","arguments","length","paramOpts","doAuthedRequest","attempt","_arguments","_this","_asyncToGenerator","abortSignal","requestSnapshot","prepareForRequest","access_token","response","request","error","errcode","outcome","handleUnknownToken","Success","Failure","inhibitLogoutEmit","emit","SessionLoggedOut","NoConsent","message","data","consent_uri","baseUrl","_arguments2","_this2","_this2$opts$logger","_opts$localTimeoutMs","_opts$keepAlive","_body$constructor","rawResponseBody","urlForLogs","sanitizeUrlForLogs","logger","debug","Object","assign","jsonResponse","timeout","localTimeoutMs","keepAlive","signals","signal","push","name","JSON","stringify","_anySignal","cleanup","cacheMode","res","start","Date","now","_this2$opts$logger2","mode","redirect","referrer","referrerPolicy","cache","credentials","keepalive","priority","status","e","_this2$opts$logger3","ok","text","blob","asUrl","URL","sanitizedQs","URLSearchParams","key","searchParams","keys","append","sanitizedQsString","toString","sanitizedQsUrlPiece","origin","pathname","_unused","baseUrlWithFallback","baseUrlWithoutTrailingSlash","endsWith","slice","extraParams","mergedParams","_objectSpread"],"sources":["../../src/http-api/fetch.ts"],"sourcesContent":["/*\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n/**\n * This is an internal module. See {@link MatrixHttpApi} for the public class.\n */\n\nimport { checkObjectHasKeys, deepCopy, encodeParams } from \"../utils.ts\";\nimport { type TypedEventEmitter } from \"../models/typed-event-emitter.ts\";\nimport { Method } from \"./method.ts\";\nimport { ConnectionError, MatrixError, TokenRefreshError } from \"./errors.ts\";\nimport {\n type BaseRequestOpts,\n HttpApiEvent,\n type HttpApiEventHandlerMap,\n type IHttpOpts,\n type IRequestOpts,\n type Body,\n} from \"./interface.ts\";\nimport { anySignal, parseErrorResponse, timeoutSignal } from \"./utils.ts\";\nimport { type QueryDict } from \"../utils.ts\";\nimport { TokenRefresher, TokenRefreshOutcome } from \"./refresh.ts\";\n\nexport class FetchHttpApi<O extends IHttpOpts> {\n private abortController = new AbortController();\n private readonly tokenRefresher: TokenRefresher;\n\n public constructor(\n private eventEmitter: TypedEventEmitter<HttpApiEvent, HttpApiEventHandlerMap>,\n public readonly opts: O,\n ) {\n checkObjectHasKeys(opts, [\"baseUrl\", \"prefix\"]);\n if (!opts.onlyData) {\n throw new Error(\"Constructing FetchHttpApi without `onlyData=true` is no longer supported.\");\n }\n opts.useAuthorizationHeader = opts.useAuthorizationHeader ?? true;\n\n this.tokenRefresher = new TokenRefresher(opts);\n }\n\n public abort(): void {\n this.abortController.abort();\n this.abortController = new AbortController();\n }\n\n public fetch(resource: URL | string, options?: RequestInit): ReturnType<typeof globalThis.fetch> {\n if (this.opts.fetchFn) {\n return this.opts.fetchFn(resource, options);\n }\n return globalThis.fetch(resource, options);\n }\n\n /**\n * Sets the base URL for the identity server\n * @param url - The new base url\n */\n public setIdBaseUrl(url?: string): void {\n this.opts.idBaseUrl = url;\n }\n\n public idServerRequest<T extends object = Record<string, unknown>>(\n method: Method,\n path: string,\n params: Record<string, string | string[]> | undefined,\n prefix: string,\n accessToken?: string,\n ): Promise<T> {\n if (!this.opts.idBaseUrl) {\n throw new Error(\"No identity server base URL set\");\n }\n\n let queryParams: QueryDict | undefined = undefined;\n let body: Record<string, string | string[]> | undefined = undefined;\n if (method === Method.Get) {\n queryParams = params;\n } else {\n body = params;\n }\n\n const fullUri = this.getUrl(path, queryParams, prefix, this.opts.idBaseUrl);\n\n const opts: IRequestOpts = {\n json: true,\n headers: {},\n };\n if (accessToken) {\n opts.headers!.Authorization = `Bearer ${accessToken}`;\n }\n\n return this.requestOtherUrl(method, fullUri, body, opts);\n }\n\n /**\n * Perform an authorised request to the homeserver.\n * @param method - The HTTP method e.g. \"GET\".\n * @param path - The HTTP path <b>after</b> the supplied prefix e.g.\n * \"/createRoom\".\n *\n * @param queryParams - A dict of query params (these will NOT be\n * urlencoded). If unspecified, there will be no query params.\n *\n * @param body - The HTTP JSON body.\n *\n * @param paramOpts - additional options.\n * When `paramOpts.doNotAttemptTokenRefresh` is true, token refresh will not be attempted\n * when an expired token is encountered. Used to only attempt token refresh once.\n *\n * @returns The parsed response.\n * @throws Error if a problem occurred. This includes network problems and Matrix-specific error JSON.\n */\n public authedRequest<T>(\n method: Method,\n path: string,\n queryParams: QueryDict = {},\n body?: Body,\n paramOpts: IRequestOpts = {},\n ): Promise<T> {\n return this.doAuthedRequest<T>(1, method, path, queryParams, body, paramOpts);\n }\n\n // Wrapper around public method authedRequest to allow for tracking retry attempt counts\n private async doAuthedRequest<T>(\n attempt: number,\n method: Method,\n path: string,\n queryParams: QueryDict,\n body?: Body,\n paramOpts: IRequestOpts = {},\n ): Promise<T> {\n // avoid mutating paramOpts so they can be used on retry\n const opts = deepCopy(paramOpts);\n // we have to manually copy the abortSignal over as it is not a plain object\n opts.abortSignal = paramOpts.abortSignal;\n\n // Take a snapshot of the current token state before we start the request so we can reference it if we error\n const requestSnapshot = await this.tokenRefresher.prepareForRequest();\n if (requestSnapshot.accessToken) {\n if (this.opts.useAuthorizationHeader) {\n if (!opts.headers) {\n opts.headers = {};\n }\n if (!opts.headers.Authorization) {\n opts.headers.Authorization = `Bearer ${requestSnapshot.accessToken}`;\n }\n if (queryParams.access_token) {\n delete queryParams.access_token;\n }\n } else if (!queryParams.access_token) {\n queryParams.access_token = requestSnapshot.accessToken;\n }\n }\n\n try {\n const response = await this.request<T>(method, path, queryParams, body, opts);\n return response;\n } catch (error) {\n if (!(error instanceof MatrixError)) {\n throw error;\n }\n\n if (error.errcode === \"M_UNKNOWN_TOKEN\") {\n const outcome = await this.tokenRefresher.handleUnknownToken(requestSnapshot, attempt);\n if (outcome === TokenRefreshOutcome.Success) {\n // if we got a new token retry the request\n return this.doAuthedRequest(attempt + 1, method, path, queryParams, body, paramOpts);\n }\n if (outcome === TokenRefreshOutcome.Failure) {\n throw new TokenRefreshError(error);\n }\n\n if (!opts?.inhibitLogoutEmit) {\n this.eventEmitter.emit(HttpApiEvent.SessionLoggedOut, error);\n }\n } else if (error.errcode == \"M_CONSENT_NOT_GIVEN\") {\n this.eventEmitter.emit(HttpApiEvent.NoConsent, error.message, error.data.consent_uri);\n }\n\n throw error;\n }\n }\n\n /**\n * Perform a request to the homeserver without any credentials.\n * @param method - The HTTP method e.g. \"GET\".\n * @param path - The HTTP path <b>after</b> the supplied prefix e.g.\n * \"/createRoom\".\n *\n * @param queryParams - A dict of query params (these will NOT be\n * urlencoded). If unspecified, there will be no query params.\n *\n * @param body - The HTTP JSON body.\n *\n * @param opts - additional options\n *\n * @returns The parsed response.\n * @throws Error if a problem occurred. This includes network problems and Matrix-specific error JSON.\n */\n public request<T>(\n method: Method,\n path: string,\n queryParams?: QueryDict,\n body?: Body,\n opts?: IRequestOpts,\n ): Promise<T> {\n const fullUri = this.getUrl(path, queryParams, opts?.prefix, opts?.baseUrl);\n return this.requestOtherUrl<T>(method, fullUri, body, opts);\n }\n\n /**\n * Perform a request to an arbitrary URL.\n * @param method - The HTTP method e.g. \"GET\".\n * @param url - The HTTP URL object.\n *\n * @param body - The HTTP JSON body.\n *\n * @param opts - additional options\n *\n * @returns The parsed response.\n * @throws Error if a problem occurred. This includes network problems and Matrix-specific error JSON.\n */\n public async requestOtherUrl<T>(\n method: Method,\n url: URL | string,\n body?: Body,\n opts: BaseRequestOpts = {},\n ): Promise<T> {\n if (opts.json !== undefined && opts.rawResponseBody !== undefined) {\n throw new Error(\"Invalid call to `FetchHttpApi` sets both `opts.json` and `opts.rawResponseBody`\");\n }\n\n const urlForLogs = this.sanitizeUrlForLogs(url);\n\n this.opts.logger?.debug(`FetchHttpApi: --> ${method} ${urlForLogs}`);\n\n const headers = Object.assign({}, opts.headers || {});\n\n const jsonResponse = !opts.rawResponseBody && opts.json !== false;\n if (jsonResponse) {\n if (!headers[\"Accept\"]) {\n headers[\"Accept\"] = \"application/json\";\n }\n }\n\n const timeout = opts.localTimeoutMs ?? this.opts.localTimeoutMs;\n const keepAlive = opts.keepAlive ?? false;\n const signals = [this.abortController.signal];\n if (timeout !== undefined) {\n signals.push(timeoutSignal(timeout));\n }\n if (opts.abortSignal) {\n signals.push(opts.abortSignal);\n }\n\n // If the body is an object, encode it as JSON and set the `Content-Type` header,\n // unless that has been explicitly inhibited by setting `opts.json: false`.\n // We can't use getPrototypeOf here as objects made in other contexts e.g. over postMessage won't have same ref\n let data: BodyInit;\n if (opts.json !== false && body?.constructor?.name === Object.name) {\n data = JSON.stringify(body);\n if (!headers[\"Content-Type\"]) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n } else {\n data = body as BodyInit;\n }\n\n const { signal, cleanup } = anySignal(signals);\n\n // Set cache mode based on presence of Authorization header.\n // Browsers/proxies do not cache responses to requests with Authorization headers.\n // So specifying \"no-cache\" is redundant, and actually prevents caching\n // of preflight requests in CORS scenarios. As such, we only set \"no-cache\"\n // when there is no Authorization header.\n const cacheMode = \"Authorization\" in headers ? undefined : \"no-cache\";\n\n let res: Response;\n const start = Date.now();\n try {\n res = await this.fetch(url, {\n signal,\n method,\n body: data,\n headers,\n mode: \"cors\",\n redirect: \"follow\",\n referrer: \"\",\n referrerPolicy: \"no-referrer\",\n cache: cacheMode,\n credentials: \"omit\", // we send credentials via headers\n keepalive: keepAlive,\n priority: opts.priority,\n });\n\n this.opts.logger?.debug(\n `FetchHttpApi: <-- ${method} ${urlForLogs} [${Date.now() - start}ms ${res.status}]`,\n );\n } catch (e) {\n this.opts.logger?.debug(`FetchHttpApi: <-- ${method} ${urlForLogs} [${Date.now() - start}ms ${e}]`);\n if ((<Error>e).name === \"AbortError\") {\n throw e;\n }\n throw new ConnectionError(\"fetch failed\", <Error>e);\n } finally {\n cleanup();\n }\n\n if (!res.ok) {\n throw parseErrorResponse(res, await res.text());\n }\n\n if (opts.rawResponseBody) {\n return (await res.blob()) as T;\n } else if (jsonResponse) {\n return await res.json();\n } else {\n return (await res.text()) as T;\n }\n }\n\n private sanitizeUrlForLogs(url: URL | string): string {\n try {\n let asUrl: URL;\n if (typeof url === \"string\") {\n asUrl = new URL(url);\n } else {\n asUrl = url;\n }\n // Remove the values of any URL params that could contain potential secrets\n const sanitizedQs = new URLSearchParams();\n for (const key of asUrl.searchParams.keys()) {\n sanitizedQs.append(key, \"xxx\");\n }\n const sanitizedQsString = sanitizedQs.toString();\n const sanitizedQsUrlPiece = sanitizedQsString ? `?${sanitizedQsString}` : \"\";\n\n return asUrl.origin + asUrl.pathname + sanitizedQsUrlPiece;\n } catch {\n // defensive coding for malformed url\n return \"??\";\n }\n }\n /**\n * Form and return a homeserver request URL based on the given path params and prefix.\n * @param path - The HTTP path <b>after</b> the supplied prefix e.g. \"/createRoom\".\n * @param queryParams - A dict of query params (these will NOT be urlencoded).\n * @param prefix - The full prefix to use e.g. \"/_matrix/client/v2_alpha\", defaulting to this.opts.prefix.\n * @param baseUrl - The baseUrl to use e.g. \"https://matrix.org\", defaulting to this.opts.baseUrl.\n * @returns URL\n */\n public getUrl(path: string, queryParams?: QueryDict, prefix?: string, baseUrl?: string): URL {\n const baseUrlWithFallback = baseUrl ?? this.opts.baseUrl;\n const baseUrlWithoutTrailingSlash = baseUrlWithFallback.endsWith(\"/\")\n ? baseUrlWithFallback.slice(0, -1)\n : baseUrlWithFallback;\n const url = new URL(baseUrlWithoutTrailingSlash + (prefix ?? this.opts.prefix) + path);\n // If there are any params, encode and append them to the URL.\n if (this.opts.extraParams || queryParams) {\n const mergedParams = { ...this.opts.extraParams, ...queryParams };\n encodeParams(mergedParams, url.searchParams);\n }\n\n return url;\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"fetch.js","names":["checkObjectHasKeys","deepCopy","encodeParams","Method","ConnectionError","MatrixError","TokenRefreshError","HttpApiEvent","anySignal","parseErrorResponse","timeoutSignal","TokenRefresher","TokenRefreshOutcome","FetchHttpApi","constructor","eventEmitter","opts","_opts$useAuthorizatio","_defineProperty","AbortController","onlyData","Error","useAuthorizationHeader","tokenRefresher","abort","abortController","fetch","resource","options","fetchFn","globalThis","setIdBaseUrl","url","idBaseUrl","idServerRequest","method","path","params","prefix","accessToken","queryParams","undefined","body","Get","fullUri","getUrl","json","headers","Authorization","concat","requestOtherUrl","authedRequest","arguments","length","paramOpts","doAuthedRequest","attempt","_arguments","_this","_asyncToGenerator","abortSignal","requestSnapshot","prepareForRequest","access_token","response","request","error","errcode","outcome","handleUnknownToken","Success","Failure","inhibitLogoutEmit","emit","SessionLoggedOut","NoConsent","message","data","consent_uri","baseUrl","_arguments2","_this2","_this2$opts$logger","_opts$localTimeoutMs","_opts$keepAlive","_body$constructor","rawResponseBody","urlForLogs","sanitizeUrlForLogs","logger","debug","Object","assign","jsonResponse","timeout","localTimeoutMs","keepAlive","signals","signal","push","name","JSON","stringify","_anySignal","cleanup","cacheMode","res","start","Date","now","_this2$opts$logger2","mode","redirect","referrer","referrerPolicy","cache","credentials","keepalive","priority","status","e","_this2$opts$logger3","ok","text","blob","asUrl","URL","sanitizedQs","URLSearchParams","key","searchParams","keys","append","sanitizedQsString","toString","sanitizedQsUrlPiece","origin","pathname","_unused","baseUrlWithFallback","baseUrlWithoutTrailingSlash","endsWith","slice","extraParams","mergedParams","_objectSpread"],"sources":["../../src/http-api/fetch.ts"],"sourcesContent":["/*\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n/**\n * This is an internal module. See {@link MatrixHttpApi} for the public class.\n */\n\nimport { checkObjectHasKeys, deepCopy, encodeParams } from \"../utils.ts\";\nimport { type TypedEventEmitter } from \"../models/typed-event-emitter.ts\";\nimport { Method } from \"./method.ts\";\nimport { ConnectionError, MatrixError, TokenRefreshError } from \"./errors.ts\";\nimport {\n type BaseRequestOpts,\n HttpApiEvent,\n type HttpApiEventHandlerMap,\n type IHttpOpts,\n type IRequestOpts,\n type Body,\n} from \"./interface.ts\";\nimport { anySignal, parseErrorResponse, timeoutSignal } from \"./utils.ts\";\nimport { type QueryDict } from \"../utils.ts\";\nimport { TokenRefresher, TokenRefreshOutcome } from \"./refresh.ts\";\n\nexport class FetchHttpApi<O extends IHttpOpts> {\n private abortController = new AbortController();\n private readonly tokenRefresher: TokenRefresher;\n\n public constructor(\n private eventEmitter: TypedEventEmitter<HttpApiEvent, HttpApiEventHandlerMap>,\n public readonly opts: O,\n ) {\n checkObjectHasKeys(opts, [\"baseUrl\", \"prefix\"]);\n if (!opts.onlyData) {\n throw new Error(\"Constructing FetchHttpApi without `onlyData=true` is no longer supported.\");\n }\n opts.useAuthorizationHeader = opts.useAuthorizationHeader ?? true;\n\n this.tokenRefresher = new TokenRefresher(opts);\n }\n\n public abort(): void {\n this.abortController.abort();\n this.abortController = new AbortController();\n }\n\n public fetch(resource: URL | string, options?: RequestInit): ReturnType<typeof globalThis.fetch> {\n if (this.opts.fetchFn) {\n return this.opts.fetchFn(resource, options);\n }\n return globalThis.fetch(resource, options);\n }\n\n /**\n * Sets the base URL for the identity server\n * @param url - The new base url\n */\n public setIdBaseUrl(url?: string): void {\n this.opts.idBaseUrl = url;\n }\n\n public idServerRequest<T extends object = Record<string, unknown>>(\n method: Method,\n path: string,\n params: Record<string, string | string[]> | undefined,\n prefix: string,\n accessToken?: string,\n ): Promise<T> {\n if (!this.opts.idBaseUrl) {\n throw new Error(\"No identity server base URL set\");\n }\n\n let queryParams: QueryDict | undefined = undefined;\n let body: Record<string, string | string[]> | undefined = undefined;\n if (method === Method.Get) {\n queryParams = params;\n } else {\n body = params;\n }\n\n const fullUri = this.getUrl(path, queryParams, prefix, this.opts.idBaseUrl);\n\n const opts: IRequestOpts = {\n json: true,\n headers: {},\n };\n if (accessToken) {\n opts.headers!.Authorization = `Bearer ${accessToken}`;\n }\n\n return this.requestOtherUrl(method, fullUri, body, opts);\n }\n\n /**\n * Perform an authorised request to the homeserver.\n * @param method - The HTTP method e.g. \"GET\".\n * @param path - The HTTP path <b>after</b> the supplied prefix e.g.\n * \"/createRoom\".\n *\n * @param queryParams - A dict of query params (these will NOT be\n * urlencoded). If unspecified, there will be no query params.\n *\n * @param body - The HTTP JSON body.\n *\n * @param paramOpts - additional options.\n * When `paramOpts.doNotAttemptTokenRefresh` is true, token refresh will not be attempted\n * when an expired token is encountered. Used to only attempt token refresh once.\n *\n * @returns The parsed response.\n * @throws Error if a problem occurred. This includes network problems and Matrix-specific error JSON.\n */\n public authedRequest<T>(\n method: Method,\n path: string,\n queryParams: QueryDict = {},\n body?: Body,\n paramOpts: IRequestOpts = {},\n ): Promise<T> {\n return this.doAuthedRequest<T>(1, method, path, queryParams, body, paramOpts);\n }\n\n // Wrapper around public method authedRequest to allow for tracking retry attempt counts\n private async doAuthedRequest<T>(\n attempt: number,\n method: Method,\n path: string,\n queryParams: QueryDict,\n body?: Body,\n paramOpts: IRequestOpts = {},\n ): Promise<T> {\n // avoid mutating paramOpts so they can be used on retry\n const opts = deepCopy(paramOpts);\n // we have to manually copy the abortSignal over as it is not a plain object\n opts.abortSignal = paramOpts.abortSignal;\n\n // Take a snapshot of the current token state before we start the request so we can reference it if we error\n const requestSnapshot = await this.tokenRefresher.prepareForRequest();\n if (requestSnapshot.accessToken) {\n if (this.opts.useAuthorizationHeader) {\n if (!opts.headers) {\n opts.headers = {};\n }\n if (!opts.headers.Authorization) {\n opts.headers.Authorization = `Bearer ${requestSnapshot.accessToken}`;\n }\n if (queryParams.access_token) {\n delete queryParams.access_token;\n }\n } else if (!queryParams.access_token) {\n queryParams.access_token = requestSnapshot.accessToken;\n }\n }\n\n try {\n const response = await this.request<T>(method, path, queryParams, body, opts);\n return response;\n } catch (error) {\n if (!(error instanceof MatrixError)) {\n throw error;\n }\n\n if (error.errcode === \"M_UNKNOWN_TOKEN\") {\n const outcome = await this.tokenRefresher.handleUnknownToken(requestSnapshot, attempt);\n if (outcome === TokenRefreshOutcome.Success) {\n // if we got a new token retry the request\n return this.doAuthedRequest(attempt + 1, method, path, queryParams, body, paramOpts);\n }\n if (outcome === TokenRefreshOutcome.Failure) {\n throw new TokenRefreshError(error);\n }\n\n if (!opts?.inhibitLogoutEmit) {\n this.eventEmitter.emit(HttpApiEvent.SessionLoggedOut, error);\n }\n } else if (error.errcode == \"M_CONSENT_NOT_GIVEN\") {\n this.eventEmitter.emit(HttpApiEvent.NoConsent, error.message, error.data.consent_uri);\n }\n\n throw error;\n }\n }\n\n /**\n * Perform a request to the homeserver without any credentials.\n * @param method - The HTTP method e.g. \"GET\".\n * @param path - The HTTP path <b>after</b> the supplied prefix e.g.\n * \"/createRoom\".\n *\n * @param queryParams - A dict of query params (these will NOT be\n * urlencoded). If unspecified, there will be no query params.\n *\n * @param body - The HTTP JSON body.\n *\n * @param opts - additional options\n *\n * @returns The parsed response.\n * @throws Error if a problem occurred. This includes network problems and Matrix-specific error JSON.\n */\n public request<T>(\n method: Method,\n path: string,\n queryParams?: QueryDict,\n body?: Body,\n opts?: IRequestOpts,\n ): Promise<T> {\n const fullUri = this.getUrl(path, queryParams, opts?.prefix, opts?.baseUrl);\n return this.requestOtherUrl<T>(method, fullUri, body, opts);\n }\n\n /**\n * Perform a request to an arbitrary URL.\n * @param method - The HTTP method e.g. \"GET\".\n * @param url - The HTTP URL object.\n *\n * @param body - The HTTP JSON body.\n *\n * @param opts - additional options\n *\n * @returns The parsed response.\n * @throws Error if a problem occurred. This includes network problems and Matrix-specific error JSON.\n */\n public async requestOtherUrl<T>(\n method: Method,\n url: URL | string,\n body?: Body,\n opts: BaseRequestOpts = {},\n ): Promise<T> {\n if (opts.json !== undefined && opts.rawResponseBody !== undefined) {\n throw new Error(\"Invalid call to `FetchHttpApi` sets both `opts.json` and `opts.rawResponseBody`\");\n }\n\n const urlForLogs = this.sanitizeUrlForLogs(url);\n\n this.opts.logger?.debug(`FetchHttpApi: --> ${method} ${urlForLogs}`);\n\n const headers = Object.assign({}, opts.headers || {});\n\n const jsonResponse = !opts.rawResponseBody && opts.json !== false;\n if (jsonResponse) {\n if (!headers[\"Accept\"]) {\n headers[\"Accept\"] = \"application/json\";\n }\n }\n\n const timeout = opts.localTimeoutMs ?? this.opts.localTimeoutMs;\n const keepAlive = opts.keepAlive ?? false;\n const signals = [this.abortController.signal];\n if (timeout !== undefined) {\n signals.push(timeoutSignal(timeout));\n }\n if (opts.abortSignal) {\n signals.push(opts.abortSignal);\n }\n\n // If the body is an object, encode it as JSON and set the `Content-Type` header,\n // unless that has been explicitly inhibited by setting `opts.json: false`.\n // We can't use getPrototypeOf here as objects made in other contexts e.g. over postMessage won't have same ref\n let data: BodyInit;\n if (opts.json !== false && body?.constructor?.name === Object.name) {\n data = JSON.stringify(body);\n if (!headers[\"Content-Type\"]) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n } else {\n data = body as BodyInit;\n }\n\n const { signal, cleanup } = anySignal(signals);\n\n // Set cache mode based on presence of Authorization header.\n // Browsers/proxies do not cache responses to requests with Authorization headers.\n // So specifying \"no-cache\" is redundant, and actually prevents caching\n // of preflight requests in CORS scenarios. As such, we only set \"no-cache\"\n // when there is no Authorization header.\n const cacheMode = \"Authorization\" in headers ? undefined : \"no-cache\";\n\n let res: Response;\n const start = Date.now();\n try {\n res = await this.fetch(url, {\n signal,\n method,\n body: data,\n headers,\n mode: \"cors\",\n redirect: \"follow\",\n referrer: \"\",\n referrerPolicy: \"no-referrer\",\n cache: cacheMode,\n credentials: \"omit\", // we send credentials via headers\n keepalive: keepAlive,\n priority: opts.priority,\n });\n\n this.opts.logger?.debug(\n `FetchHttpApi: <-- ${method} ${urlForLogs} [${Date.now() - start}ms ${res.status}]`,\n );\n } catch (e) {\n this.opts.logger?.debug(`FetchHttpApi: <-- ${method} ${urlForLogs} [${Date.now() - start}ms ${e}]`);\n if ((<Error>e).name === \"AbortError\") {\n throw e;\n }\n throw new ConnectionError(\"fetch failed\", <Error>e);\n } finally {\n cleanup();\n }\n\n if (!res.ok) {\n throw parseErrorResponse(res, await res.text());\n }\n\n if (opts.rawResponseBody) {\n return (await res.blob()) as T;\n } else if (jsonResponse) {\n return await res.json();\n } else {\n return (await res.text()) as T;\n }\n }\n\n private sanitizeUrlForLogs(url: URL | string): string {\n try {\n let asUrl: URL;\n if (typeof url === \"string\") {\n asUrl = new URL(url);\n } else {\n asUrl = url;\n }\n // Remove the values of any URL params that could contain potential secrets\n const sanitizedQs = new URLSearchParams();\n for (const key of asUrl.searchParams.keys()) {\n sanitizedQs.append(key, \"xxx\");\n }\n const sanitizedQsString = sanitizedQs.toString();\n const sanitizedQsUrlPiece = sanitizedQsString ? `?${sanitizedQsString}` : \"\";\n\n return asUrl.origin + asUrl.pathname + sanitizedQsUrlPiece;\n } catch {\n // defensive coding for malformed url\n return \"??\";\n }\n }\n /**\n * Form and return a homeserver request URL based on the given path params and prefix.\n * @param path - The HTTP path <b>after</b> the supplied prefix e.g. \"/createRoom\".\n * @param queryParams - A dict of query params (these will NOT be urlencoded).\n * @param prefix - The full prefix to use e.g. \"/_matrix/client/v2_alpha\", defaulting to this.opts.prefix.\n * @param baseUrl - The baseUrl to use e.g. \"https://matrix.org\", defaulting to this.opts.baseUrl.\n * @returns URL\n */\n public getUrl(path: string, queryParams?: QueryDict, prefix?: string, baseUrl?: string): URL {\n const baseUrlWithFallback = baseUrl ?? this.opts.baseUrl;\n const baseUrlWithoutTrailingSlash = baseUrlWithFallback.endsWith(\"/\")\n ? baseUrlWithFallback.slice(0, -1)\n : baseUrlWithFallback;\n const url = new URL(baseUrlWithoutTrailingSlash + (prefix ?? this.opts.prefix) + path);\n // If there are any params, encode and append them to the URL.\n if (this.opts.extraParams || queryParams) {\n const mergedParams = { ...this.opts.extraParams, ...queryParams };\n encodeParams(mergedParams, url.searchParams);\n }\n\n return url;\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,4 +1,5 @@
1
1
  import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
3
  /*
3
4
  Copyright 2025 The Matrix.org Foundation C.I.C.
4
5
 
@@ -40,13 +41,13 @@ var REFRESH_ON_ERROR_IF_TOKEN_EXPIRES_WITHIN_MS = 60 * 1000;
40
41
  export class TokenRefresher {
41
42
  constructor(opts) {
42
43
  this.opts = opts;
44
+ /**
45
+ * Promise used to block authenticated requests during a token refresh to avoid repeated expected errors.
46
+ * @private
47
+ */
48
+ _defineProperty(this, "tokenRefreshPromise", void 0);
49
+ _defineProperty(this, "latestTokenRefreshExpiry", void 0);
43
50
  }
44
-
45
- /**
46
- * Promise used to block authenticated requests during a token refresh to avoid repeated expected errors.
47
- * @private
48
- */
49
-
50
51
  /**
51
52
  * This function is called before every request to ensure that the access token is valid.
52
53
  * @returns a snapshot containing the access token and other properties which must be passed to the handleUnknownToken
@@ -1 +1 @@
1
- {"version":3,"file":"refresh.js","names":["MatrixError","TokenRefreshLogoutError","sleep","TokenRefreshOutcome","REFRESH_IF_TOKEN_EXPIRES_WITHIN_MS","REFRESH_ON_ERROR_IF_TOKEN_EXPIRES_WITHIN_MS","TokenRefresher","constructor","opts","prepareForRequest","_this","_asyncToGenerator","refreshIfNeeded","accessToken","refreshToken","expiry","latestTokenRefreshExpiry","_this2","tokenRefreshPromise","expiresIn","getTime","Date","now","_handleUnknownToken","handleUnknownToken","snapshot","attempt","_this3","_this4","Logout","_this4$tokenRefreshPr","doTokenRefresh","undefined","Success","_this5","tokenRefreshFunction","_this5$opts$logger","logger","error","Math","min","_this5$opts$logger2","_this5$opts$logger3","debug","_yield$_this5$opts$to","_this5$opts$logger5","_this5$opts$logger4","warn","Failure"],"sources":["../../src/http-api/refresh.ts"],"sourcesContent":["/*\nCopyright 2025 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { MatrixError, TokenRefreshLogoutError } from \"./errors.ts\";\nimport { type IHttpOpts } from \"./interface.ts\";\nimport { sleep } from \"../utils.ts\";\n\n/**\n * This is an internal module. See {@link MatrixHttpApi} for the public class.\n */\n\nexport const enum TokenRefreshOutcome {\n Success = \"success\",\n Failure = \"failure\",\n Logout = \"logout\",\n}\n\ninterface Snapshot {\n accessToken: string;\n refreshToken?: string;\n expiry?: Date;\n}\n\n// If the token expires in less than this time amount of time, we will eagerly refresh it before making the intended request.\nconst REFRESH_IF_TOKEN_EXPIRES_WITHIN_MS = 500;\n// If we get an unknown token error and the token expires in less than this time amount of time, we will refresh it before making the intended request.\n// Otherwise, we will error as the token should not have expired yet and we need to avoid retrying indefinitely.\nconst REFRESH_ON_ERROR_IF_TOKEN_EXPIRES_WITHIN_MS = 60 * 1000;\n\ntype Opts = Pick<IHttpOpts, \"tokenRefreshFunction\" | \"logger\" | \"refreshToken\" | \"accessToken\">;\n\n/**\n * This class is responsible for managing the access token and refresh token for authenticated requests.\n * It will automatically refresh the access token when it is about to expire, and will handle unknown token errors.\n */\nexport class TokenRefresher {\n public constructor(private readonly opts: Opts) {}\n\n /**\n * Promise used to block authenticated requests during a token refresh to avoid repeated expected errors.\n * @private\n */\n private tokenRefreshPromise?: Promise<TokenRefreshOutcome>;\n\n private latestTokenRefreshExpiry?: Date;\n\n /**\n * This function is called before every request to ensure that the access token is valid.\n * @returns a snapshot containing the access token and other properties which must be passed to the handleUnknownToken\n * handler if an M_UNKNOWN_TOKEN error is encountered.\n */\n public async prepareForRequest(): Promise<Snapshot> {\n // Ensure our token is refreshed before we build the headers/params\n await this.refreshIfNeeded();\n\n return {\n accessToken: this.opts.accessToken!,\n refreshToken: this.opts.refreshToken,\n expiry: this.latestTokenRefreshExpiry,\n };\n }\n\n private async refreshIfNeeded(): Promise<unknown> {\n if (this.tokenRefreshPromise) {\n return this.tokenRefreshPromise;\n }\n // If we don't know the token expiry, we can't eagerly refresh\n if (!this.latestTokenRefreshExpiry) return;\n\n const expiresIn = this.latestTokenRefreshExpiry.getTime() - Date.now();\n if (expiresIn <= REFRESH_IF_TOKEN_EXPIRES_WITHIN_MS) {\n await this._handleUnknownToken();\n }\n }\n\n /**\n * This function is called when an M_UNKNOWN_TOKEN error is encountered.\n * It will attempt to refresh the access token if it is unknown, and will return a TokenRefreshOutcome.\n * @param snapshot - the snapshot returned by prepareForRequest\n * @param attempt - the number of attempts made for this request so far\n * @returns a TokenRefreshOutcome indicating the result of the refresh attempt\n */\n public async handleUnknownToken(snapshot: Snapshot, attempt: number): Promise<TokenRefreshOutcome> {\n return this._handleUnknownToken(snapshot, attempt);\n }\n\n /* eslint-disable @typescript-eslint/naming-convention */\n private async _handleUnknownToken(): Promise<TokenRefreshOutcome>;\n private async _handleUnknownToken(snapshot: Snapshot, attempt: number): Promise<TokenRefreshOutcome>;\n private async _handleUnknownToken(snapshot?: Snapshot, attempt?: number): Promise<TokenRefreshOutcome> {\n if (snapshot?.expiry) {\n // If our token is unknown, but it should not have expired yet, then we should not refresh\n const expiresIn = snapshot.expiry.getTime() - Date.now();\n // If it still has plenty of time left on the clock, we assume something else must be wrong and\n // do not refresh. Otherwise if it's expired, or will soon, we try refreshing.\n if (expiresIn >= REFRESH_ON_ERROR_IF_TOKEN_EXPIRES_WITHIN_MS) {\n return TokenRefreshOutcome.Logout;\n }\n }\n\n if (!snapshot || snapshot?.accessToken === this.opts.accessToken) {\n // If we have a snapshot, but the access token is the same as the current one then a refresh\n // did not happen behind us but one may be ongoing anyway\n this.tokenRefreshPromise ??= this.doTokenRefresh(attempt);\n\n try {\n return await this.tokenRefreshPromise;\n } finally {\n this.tokenRefreshPromise = undefined;\n }\n }\n\n // We may end up here if the token was refreshed in the background due to another request\n return TokenRefreshOutcome.Success;\n }\n\n /**\n * Attempt to refresh access tokens.\n * On success, sets new access and refresh tokens in opts.\n * @returns Promise that resolves to a boolean - true when token was refreshed successfully\n */\n private async doTokenRefresh(attempt?: number): Promise<TokenRefreshOutcome> {\n if (!this.opts.refreshToken || !this.opts.tokenRefreshFunction) {\n this.opts.logger?.error(\"Unable to refresh token - no refresh token or refresh function\");\n return TokenRefreshOutcome.Logout;\n }\n\n if (attempt && attempt > 1) {\n // Exponential backoff to ensure we don't trash the server, up to 2^5 seconds\n await sleep(1000 * Math.min(32, 2 ** attempt));\n }\n\n try {\n this.opts.logger?.debug(\"Attempting to refresh token\");\n const { accessToken, refreshToken, expiry } = await this.opts.tokenRefreshFunction(this.opts.refreshToken);\n this.opts.accessToken = accessToken;\n this.opts.refreshToken = refreshToken;\n this.latestTokenRefreshExpiry = expiry;\n this.opts.logger?.debug(\"... token refresh complete, new token expiry:\", expiry);\n\n // successfully got new tokens\n return TokenRefreshOutcome.Success;\n } catch (error) {\n // If we get a TokenError or MatrixError, we should log out, otherwise assume transient\n if (error instanceof TokenRefreshLogoutError || error instanceof MatrixError) {\n this.opts.logger?.error(\"Failed to refresh token\", error);\n return TokenRefreshOutcome.Logout;\n }\n\n this.opts.logger?.warn(\"Failed to refresh token\", error);\n return TokenRefreshOutcome.Failure;\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"refresh.js","names":["MatrixError","TokenRefreshLogoutError","sleep","TokenRefreshOutcome","REFRESH_IF_TOKEN_EXPIRES_WITHIN_MS","REFRESH_ON_ERROR_IF_TOKEN_EXPIRES_WITHIN_MS","TokenRefresher","constructor","opts","_defineProperty","prepareForRequest","_this","_asyncToGenerator","refreshIfNeeded","accessToken","refreshToken","expiry","latestTokenRefreshExpiry","_this2","tokenRefreshPromise","expiresIn","getTime","Date","now","_handleUnknownToken","handleUnknownToken","snapshot","attempt","_this3","_this4","Logout","_this4$tokenRefreshPr","doTokenRefresh","undefined","Success","_this5","tokenRefreshFunction","_this5$opts$logger","logger","error","Math","min","_this5$opts$logger2","_this5$opts$logger3","debug","_yield$_this5$opts$to","_this5$opts$logger5","_this5$opts$logger4","warn","Failure"],"sources":["../../src/http-api/refresh.ts"],"sourcesContent":["/*\nCopyright 2025 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { MatrixError, TokenRefreshLogoutError } from \"./errors.ts\";\nimport { type IHttpOpts } from \"./interface.ts\";\nimport { sleep } from \"../utils.ts\";\n\n/**\n * This is an internal module. See {@link MatrixHttpApi} for the public class.\n */\n\nexport const enum TokenRefreshOutcome {\n Success = \"success\",\n Failure = \"failure\",\n Logout = \"logout\",\n}\n\ninterface Snapshot {\n accessToken: string;\n refreshToken?: string;\n expiry?: Date;\n}\n\n// If the token expires in less than this time amount of time, we will eagerly refresh it before making the intended request.\nconst REFRESH_IF_TOKEN_EXPIRES_WITHIN_MS = 500;\n// If we get an unknown token error and the token expires in less than this time amount of time, we will refresh it before making the intended request.\n// Otherwise, we will error as the token should not have expired yet and we need to avoid retrying indefinitely.\nconst REFRESH_ON_ERROR_IF_TOKEN_EXPIRES_WITHIN_MS = 60 * 1000;\n\ntype Opts = Pick<IHttpOpts, \"tokenRefreshFunction\" | \"logger\" | \"refreshToken\" | \"accessToken\">;\n\n/**\n * This class is responsible for managing the access token and refresh token for authenticated requests.\n * It will automatically refresh the access token when it is about to expire, and will handle unknown token errors.\n */\nexport class TokenRefresher {\n public constructor(private readonly opts: Opts) {}\n\n /**\n * Promise used to block authenticated requests during a token refresh to avoid repeated expected errors.\n * @private\n */\n private tokenRefreshPromise?: Promise<TokenRefreshOutcome>;\n\n private latestTokenRefreshExpiry?: Date;\n\n /**\n * This function is called before every request to ensure that the access token is valid.\n * @returns a snapshot containing the access token and other properties which must be passed to the handleUnknownToken\n * handler if an M_UNKNOWN_TOKEN error is encountered.\n */\n public async prepareForRequest(): Promise<Snapshot> {\n // Ensure our token is refreshed before we build the headers/params\n await this.refreshIfNeeded();\n\n return {\n accessToken: this.opts.accessToken!,\n refreshToken: this.opts.refreshToken,\n expiry: this.latestTokenRefreshExpiry,\n };\n }\n\n private async refreshIfNeeded(): Promise<unknown> {\n if (this.tokenRefreshPromise) {\n return this.tokenRefreshPromise;\n }\n // If we don't know the token expiry, we can't eagerly refresh\n if (!this.latestTokenRefreshExpiry) return;\n\n const expiresIn = this.latestTokenRefreshExpiry.getTime() - Date.now();\n if (expiresIn <= REFRESH_IF_TOKEN_EXPIRES_WITHIN_MS) {\n await this._handleUnknownToken();\n }\n }\n\n /**\n * This function is called when an M_UNKNOWN_TOKEN error is encountered.\n * It will attempt to refresh the access token if it is unknown, and will return a TokenRefreshOutcome.\n * @param snapshot - the snapshot returned by prepareForRequest\n * @param attempt - the number of attempts made for this request so far\n * @returns a TokenRefreshOutcome indicating the result of the refresh attempt\n */\n public async handleUnknownToken(snapshot: Snapshot, attempt: number): Promise<TokenRefreshOutcome> {\n return this._handleUnknownToken(snapshot, attempt);\n }\n\n /* eslint-disable @typescript-eslint/naming-convention */\n private async _handleUnknownToken(): Promise<TokenRefreshOutcome>;\n private async _handleUnknownToken(snapshot: Snapshot, attempt: number): Promise<TokenRefreshOutcome>;\n private async _handleUnknownToken(snapshot?: Snapshot, attempt?: number): Promise<TokenRefreshOutcome> {\n if (snapshot?.expiry) {\n // If our token is unknown, but it should not have expired yet, then we should not refresh\n const expiresIn = snapshot.expiry.getTime() - Date.now();\n // If it still has plenty of time left on the clock, we assume something else must be wrong and\n // do not refresh. Otherwise if it's expired, or will soon, we try refreshing.\n if (expiresIn >= REFRESH_ON_ERROR_IF_TOKEN_EXPIRES_WITHIN_MS) {\n return TokenRefreshOutcome.Logout;\n }\n }\n\n if (!snapshot || snapshot?.accessToken === this.opts.accessToken) {\n // If we have a snapshot, but the access token is the same as the current one then a refresh\n // did not happen behind us but one may be ongoing anyway\n this.tokenRefreshPromise ??= this.doTokenRefresh(attempt);\n\n try {\n return await this.tokenRefreshPromise;\n } finally {\n this.tokenRefreshPromise = undefined;\n }\n }\n\n // We may end up here if the token was refreshed in the background due to another request\n return TokenRefreshOutcome.Success;\n }\n\n /**\n * Attempt to refresh access tokens.\n * On success, sets new access and refresh tokens in opts.\n * @returns Promise that resolves to a boolean - true when token was refreshed successfully\n */\n private async doTokenRefresh(attempt?: number): Promise<TokenRefreshOutcome> {\n if (!this.opts.refreshToken || !this.opts.tokenRefreshFunction) {\n this.opts.logger?.error(\"Unable to refresh token - no refresh token or refresh function\");\n return TokenRefreshOutcome.Logout;\n }\n\n if (attempt && attempt > 1) {\n // Exponential backoff to ensure we don't trash the server, up to 2^5 seconds\n await sleep(1000 * Math.min(32, 2 ** attempt));\n }\n\n try {\n this.opts.logger?.debug(\"Attempting to refresh token\");\n const { accessToken, refreshToken, expiry } = await this.opts.tokenRefreshFunction(this.opts.refreshToken);\n this.opts.accessToken = accessToken;\n this.opts.refreshToken = refreshToken;\n this.latestTokenRefreshExpiry = expiry;\n this.opts.logger?.debug(\"... token refresh complete, new token expiry:\", expiry);\n\n // successfully got new tokens\n return TokenRefreshOutcome.Success;\n } catch (error) {\n // If we get a TokenError or MatrixError, we should log out, otherwise assume transient\n if (error instanceof TokenRefreshLogoutError || error instanceof MatrixError) {\n this.opts.logger?.error(\"Failed to refresh token\", error);\n return TokenRefreshOutcome.Logout;\n }\n\n this.opts.logger?.warn(\"Failed to refresh token\", error);\n return TokenRefreshOutcome.Failure;\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}