@sendbird/uikit-utils 2.4.0 → 2.4.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 (79) hide show
  1. package/README.md +1 -1
  2. package/lib/commonjs/hooks/index.js +3 -30
  3. package/lib/commonjs/hooks/index.js.map +1 -1
  4. package/lib/commonjs/hooks/react-native.js +2 -11
  5. package/lib/commonjs/hooks/react-native.js.map +1 -1
  6. package/lib/commonjs/index.js +36 -155
  7. package/lib/commonjs/index.js.map +1 -1
  8. package/lib/commonjs/sendbird/attrs.js +8 -11
  9. package/lib/commonjs/sendbird/attrs.js.map +1 -1
  10. package/lib/commonjs/sendbird/channel.js +0 -16
  11. package/lib/commonjs/sendbird/channel.js.map +1 -1
  12. package/lib/commonjs/sendbird/message.js +5 -36
  13. package/lib/commonjs/sendbird/message.js.map +1 -1
  14. package/lib/commonjs/sendbird/user.js +0 -2
  15. package/lib/commonjs/sendbird/user.js.map +1 -1
  16. package/lib/commonjs/shared/arrayToMap.js +0 -6
  17. package/lib/commonjs/shared/arrayToMap.js.map +1 -1
  18. package/lib/commonjs/shared/bufferedRequest.js +5 -26
  19. package/lib/commonjs/shared/bufferedRequest.js.map +1 -1
  20. package/lib/commonjs/shared/file.js +208 -0
  21. package/lib/commonjs/shared/file.js.map +1 -0
  22. package/lib/commonjs/shared/index.js +12 -49
  23. package/lib/commonjs/shared/index.js.map +1 -1
  24. package/lib/commonjs/shared/logger.js +3 -22
  25. package/lib/commonjs/shared/logger.js.map +1 -1
  26. package/lib/commonjs/shared/regex.js +3 -55
  27. package/lib/commonjs/shared/regex.js.map +1 -1
  28. package/lib/commonjs/ui-format/common.js +6 -18
  29. package/lib/commonjs/ui-format/common.js.map +1 -1
  30. package/lib/commonjs/ui-format/groupChannel.js +0 -15
  31. package/lib/commonjs/ui-format/groupChannel.js.map +1 -1
  32. package/lib/commonjs/ui-format/openChannel.js +0 -4
  33. package/lib/commonjs/ui-format/openChannel.js.map +1 -1
  34. package/lib/module/hooks/index.js +3 -7
  35. package/lib/module/hooks/index.js.map +1 -1
  36. package/lib/module/hooks/react-native.js +2 -2
  37. package/lib/module/hooks/react-native.js.map +1 -1
  38. package/lib/module/index.js +3 -3
  39. package/lib/module/index.js.map +1 -1
  40. package/lib/module/sendbird/attrs.js +6 -9
  41. package/lib/module/sendbird/attrs.js.map +1 -1
  42. package/lib/module/sendbird/channel.js +0 -1
  43. package/lib/module/sendbird/channel.js.map +1 -1
  44. package/lib/module/sendbird/message.js +4 -18
  45. package/lib/module/sendbird/message.js.map +1 -1
  46. package/lib/module/sendbird/user.js.map +1 -1
  47. package/lib/module/shared/arrayToMap.js +0 -4
  48. package/lib/module/shared/arrayToMap.js.map +1 -1
  49. package/lib/module/shared/bufferedRequest.js +5 -24
  50. package/lib/module/shared/bufferedRequest.js.map +1 -1
  51. package/lib/module/shared/file.js +187 -0
  52. package/lib/module/shared/file.js.map +1 -0
  53. package/lib/module/shared/index.js +12 -39
  54. package/lib/module/shared/index.js.map +1 -1
  55. package/lib/module/shared/logger.js +3 -21
  56. package/lib/module/shared/logger.js.map +1 -1
  57. package/lib/module/shared/regex.js +3 -35
  58. package/lib/module/shared/regex.js.map +1 -1
  59. package/lib/module/ui-format/common.js +6 -9
  60. package/lib/module/ui-format/common.js.map +1 -1
  61. package/lib/module/ui-format/groupChannel.js +0 -7
  62. package/lib/module/ui-format/groupChannel.js.map +1 -1
  63. package/lib/module/ui-format/openChannel.js.map +1 -1
  64. package/lib/typescript/src/index.d.ts +3 -3
  65. package/lib/typescript/src/shared/file.d.ts +68 -0
  66. package/lib/typescript/src/shared/index.d.ts +10 -16
  67. package/lib/typescript/src/shared/regex.d.ts +0 -6
  68. package/package.json +11 -7
  69. package/src/index.ts +3 -19
  70. package/src/sendbird/message.ts +1 -1
  71. package/src/shared/file.ts +193 -0
  72. package/src/shared/index.ts +10 -37
  73. package/src/shared/regex.ts +0 -34
  74. package/lib/commonjs/shared/pubsub.js +0 -54
  75. package/lib/commonjs/shared/pubsub.js.map +0 -1
  76. package/lib/module/shared/pubsub.js +0 -45
  77. package/lib/module/shared/pubsub.js.map +0 -1
  78. package/lib/typescript/src/shared/pubsub.d.ts +0 -8
  79. package/src/shared/pubsub.ts +0 -42
@@ -1,4 +1,4 @@
1
- import { getFileExtension, getFileType } from '../shared/regex';
1
+ import { getFileExtension, getFileType } from '../shared/file';
2
2
  import { getMessageTimeFormat } from '../ui-format/common';
3
3
  export function isNewMessage(msg, currentUserId) {
4
4
  const myMessage = isMyMessage(msg, currentUserId);
@@ -11,14 +11,15 @@ export function isSendableMessage(msg) {
11
11
  }
12
12
  export function isMyMessage(msg) {
13
13
  var _msg$sender;
14
-
15
14
  let currentUserId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '##__USER_ID_IS_NOT_PROVIDED__##';
16
15
  if (!isSendableMessage(msg)) return false;
17
16
  return 'sender' in msg && ((_msg$sender = msg.sender) === null || _msg$sender === void 0 ? void 0 : _msg$sender.userId) === currentUserId || msg.sendingStatus === 'pending' || msg.sendingStatus === 'failed' || msg.sendingStatus === 'canceled';
18
17
  }
19
18
  export function messageKeyExtractor(message) {
20
19
  return getMessageUniqId(message);
21
- } // |-------------------|-------------------|-----------------|-------------------|
20
+ }
21
+
22
+ // |-------------------|-------------------|-----------------|-------------------|
22
23
  // | sending status | reqId | messageId | createdAt |
23
24
  // |-------------------|-------------------|-----------------|-------------------|
24
25
  // | pending | timestamp(A) | 0 | timestamp(B) |
@@ -26,7 +27,6 @@ export function messageKeyExtractor(message) {
26
27
  // | failed | timestamp(A) | 0 | ? |
27
28
  // | succeeded | timestamp(A) / '' | id from DB | timestamp(C) |
28
29
  // |-------------------|-------------------|-----------------|-------------------|
29
-
30
30
  export function messageComparator(a, b) {
31
31
  let aStatusOffset = 0;
32
32
  let bStatusOffset = 0;
@@ -36,7 +36,6 @@ export function messageComparator(a, b) {
36
36
  }
37
37
  export function hasSameSender(a, b) {
38
38
  var _a$sender, _b$sender;
39
-
40
39
  if (!a || !b) return false;
41
40
  if ('sender' in a && 'sender' in b) return ((_a$sender = a.sender) === null || _a$sender === void 0 ? void 0 : _a$sender.userId) === ((_b$sender = b.sender) === null || _b$sender === void 0 ? void 0 : _b$sender.userId);
42
41
  return false;
@@ -50,7 +49,6 @@ export function calcMessageGrouping(groupEnabled, curr, prev, next) {
50
49
  if (getMessageTimeFormat(new Date(curr.createdAt)) !== getMessageTimeFormat(new Date(prev.createdAt))) return false;
51
50
  return true;
52
51
  };
53
-
54
52
  const getNext = () => {
55
53
  if (!groupEnabled) return false;
56
54
  if (!next) return false;
@@ -59,7 +57,6 @@ export function calcMessageGrouping(groupEnabled, curr, prev, next) {
59
57
  if (getMessageTimeFormat(new Date(curr.createdAt)) !== getMessageTimeFormat(new Date(next.createdAt))) return false;
60
58
  return true;
61
59
  };
62
-
63
60
  return {
64
61
  groupWithPrev: getPrev(),
65
62
  groupWithNext: getNext()
@@ -70,14 +67,12 @@ export function getMessageUniqId(msg) {
70
67
  if (msg.sendingStatus === 'succeeded') return String(msg.messageId);
71
68
  return msg.reqId;
72
69
  }
73
-
74
70
  return String(msg.messageId);
75
71
  }
76
72
  export function getAvailableUriFromFileMessage(message) {
77
73
  if (!message.url && message.messageParams.file && 'uri' in message.messageParams.file) {
78
74
  return message.messageParams.file.uri;
79
75
  }
80
-
81
76
  return message.url;
82
77
  }
83
78
  export function isSendbirdNotification(dataPayload) {
@@ -91,12 +86,10 @@ export function shouldRenderReaction(channel, reactionEnabled) {
91
86
  if (channel.isOpenChannel()) {
92
87
  return false;
93
88
  }
94
-
95
89
  if (channel.isGroupChannel()) {
96
90
  if (channel.isBroadcast) return false;
97
91
  if (channel.isSuper) return false;
98
92
  }
99
-
100
93
  return reactionEnabled;
101
94
  }
102
95
  export function getReactionCount(reaction) {
@@ -109,37 +102,30 @@ export function getMessageType(message) {
109
102
  if (message.isAdminMessage()) {
110
103
  return 'admin';
111
104
  }
112
-
113
105
  if (message.isUserMessage()) {
114
106
  if (message.ogMetaData) {
115
107
  return 'user.opengraph';
116
108
  }
117
-
118
109
  return 'user';
119
110
  }
120
-
121
111
  if (message.isFileMessage()) {
122
112
  const fileType = getFileTypeFromMessage(message);
123
-
124
113
  switch (fileType) {
125
114
  case 'image':
126
115
  case 'video':
127
116
  {
128
117
  return `file.${fileType}`;
129
118
  }
130
-
131
119
  case 'audio':
132
120
  {
133
121
  return `file.${fileType}`;
134
122
  }
135
-
136
123
  default:
137
124
  {
138
125
  return 'file';
139
126
  }
140
127
  }
141
128
  }
142
-
143
129
  return 'unknown';
144
130
  }
145
131
  //# sourceMappingURL=message.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["getFileExtension","getFileType","getMessageTimeFormat","isNewMessage","msg","currentUserId","myMessage","isMyMessage","isAdminMessage","updatedAt","isSendableMessage","undefined","sender","userId","sendingStatus","messageKeyExtractor","message","getMessageUniqId","messageComparator","a","b","aStatusOffset","bStatusOffset","createdAt","hasSameSender","calcMessageGrouping","groupEnabled","curr","prev","next","getPrev","Date","getNext","groupWithPrev","groupWithNext","isUserMessage","isFileMessage","String","messageId","reqId","getAvailableUriFromFileMessage","url","messageParams","file","uri","isSendbirdNotification","dataPayload","Boolean","parseSendbirdNotification","sendbird","JSON","parse","shouldRenderReaction","channel","reactionEnabled","isOpenChannel","isGroupChannel","isBroadcast","isSuper","getReactionCount","reaction","userIds","length","getFileTypeFromMessage","type","name","getMessageType","ogMetaData","fileType"],"sources":["message.ts"],"sourcesContent":["import { getFileExtension, getFileType } from '../shared/regex';\nimport type {\n SendbirdBaseChannel,\n SendbirdBaseMessage,\n SendbirdDataPayload,\n SendbirdFileMessage,\n SendbirdMessage,\n SendbirdReaction,\n SendbirdSendableMessage,\n} from '../types';\nimport { getMessageTimeFormat } from '../ui-format/common';\n\nexport function isNewMessage(msg: SendbirdMessage, currentUserId?: string) {\n const myMessage = isMyMessage(msg, currentUserId);\n if (myMessage) return false;\n if (msg.isAdminMessage()) return false;\n return msg.updatedAt === 0;\n}\n\nexport function isSendableMessage(msg?: SendbirdMessage | null): msg is SendbirdSendableMessage {\n return msg !== undefined && msg !== null && 'sendingStatus' in msg;\n}\n\nexport function isMyMessage(msg?: SendbirdMessage | null, currentUserId = '##__USER_ID_IS_NOT_PROVIDED__##') {\n if (!isSendableMessage(msg)) return false;\n return (\n ('sender' in msg && msg.sender?.userId === currentUserId) ||\n msg.sendingStatus === 'pending' ||\n msg.sendingStatus === 'failed' ||\n msg.sendingStatus === 'canceled'\n );\n}\n\nexport function messageKeyExtractor(message: SendbirdMessage): string {\n return getMessageUniqId(message);\n}\n\n// |-------------------|-------------------|-----------------|-------------------|\n// | sending status | reqId | messageId | createdAt |\n// |-------------------|-------------------|-----------------|-------------------|\n// | pending | timestamp(A) | 0 | timestamp(B) |\n// | canceled | timestamp(A) | 0 | ? |\n// | failed | timestamp(A) | 0 | ? |\n// | succeeded | timestamp(A) / '' | id from DB | timestamp(C) |\n// |-------------------|-------------------|-----------------|-------------------|\nexport function messageComparator(a: SendbirdMessage, b: SendbirdMessage) {\n let aStatusOffset = 0;\n let bStatusOffset = 0;\n\n if (isSendableMessage(a) && a.sendingStatus !== 'succeeded') aStatusOffset = 999999;\n if (isSendableMessage(b) && b.sendingStatus !== 'succeeded') bStatusOffset = 999999;\n\n return b.createdAt + bStatusOffset - (a.createdAt + aStatusOffset);\n}\n\nexport function hasSameSender(a?: SendbirdMessage, b?: SendbirdMessage) {\n if (!a || !b) return false;\n if ('sender' in a && 'sender' in b) return a.sender?.userId === b.sender?.userId;\n return false;\n}\n\nexport function calcMessageGrouping(\n groupEnabled: boolean,\n curr: SendbirdMessage,\n prev?: SendbirdMessage,\n next?: SendbirdMessage,\n) {\n const getPrev = () => {\n if (!groupEnabled) return false;\n if (!prev) return false;\n if (curr.isAdminMessage()) return false;\n if (!hasSameSender(curr, prev)) return false;\n if (getMessageTimeFormat(new Date(curr.createdAt)) !== getMessageTimeFormat(new Date(prev.createdAt))) return false;\n return true;\n };\n\n const getNext = () => {\n if (!groupEnabled) return false;\n if (!next) return false;\n if (curr.isAdminMessage()) return false;\n if (!hasSameSender(curr, next)) return false;\n if (getMessageTimeFormat(new Date(curr.createdAt)) !== getMessageTimeFormat(new Date(next.createdAt))) return false;\n return true;\n };\n\n return { groupWithPrev: getPrev(), groupWithNext: getNext() };\n}\n\nexport function getMessageUniqId(msg: SendbirdBaseMessage) {\n if (msg.isUserMessage() || msg.isFileMessage()) {\n if (msg.sendingStatus === 'succeeded') return String(msg.messageId);\n return msg.reqId;\n }\n\n return String(msg.messageId);\n}\n\nexport function getAvailableUriFromFileMessage(message: SendbirdFileMessage) {\n if (!message.url && message.messageParams.file && 'uri' in message.messageParams.file) {\n return message.messageParams.file.uri;\n }\n return message.url;\n}\n\ntype RawSendbirdDataPayload = { sendbird: string | object };\nexport function isSendbirdNotification(dataPayload?: {\n [key: string]: string | object;\n}): dataPayload is RawSendbirdDataPayload {\n if (!dataPayload) return false;\n return Boolean(dataPayload['sendbird']);\n}\n\nexport function parseSendbirdNotification(dataPayload: RawSendbirdDataPayload): SendbirdDataPayload {\n return typeof dataPayload.sendbird === 'string' ? JSON.parse(dataPayload.sendbird) : dataPayload.sendbird;\n}\n\nexport function shouldRenderReaction(channel: SendbirdBaseChannel, reactionEnabled: boolean) {\n if (channel.isOpenChannel()) {\n return false;\n }\n\n if (channel.isGroupChannel()) {\n if (channel.isBroadcast) return false;\n if (channel.isSuper) return false;\n }\n\n return reactionEnabled;\n}\n\nexport function getReactionCount(reaction: SendbirdReaction) {\n return reaction.userIds.length;\n}\n\ntype MessageType =\n | 'user'\n | 'admin'\n | 'file'\n | 'unknown'\n | `user.${'opengraph'}`\n | `file.${'image' | 'video' | 'audio'}`;\n\nexport function getFileTypeFromMessage(message: SendbirdFileMessage) {\n return getFileType(message.type || getFileExtension(message.name));\n}\n\nexport function getMessageType(message: SendbirdMessage): MessageType {\n if (message.isAdminMessage()) {\n return 'admin';\n }\n\n if (message.isUserMessage()) {\n if (message.ogMetaData) {\n return 'user.opengraph';\n }\n return 'user';\n }\n\n if (message.isFileMessage()) {\n const fileType = getFileTypeFromMessage(message);\n switch (fileType) {\n case 'image':\n case 'video': {\n return `file.${fileType}`;\n }\n case 'audio': {\n return `file.${fileType}`;\n }\n default: {\n return 'file';\n }\n }\n }\n\n return 'unknown';\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["getFileExtension","getFileType","getMessageTimeFormat","isNewMessage","msg","currentUserId","myMessage","isMyMessage","isAdminMessage","updatedAt","isSendableMessage","undefined","_msg$sender","arguments","length","sender","userId","sendingStatus","messageKeyExtractor","message","getMessageUniqId","messageComparator","a","b","aStatusOffset","bStatusOffset","createdAt","hasSameSender","_a$sender","_b$sender","calcMessageGrouping","groupEnabled","curr","prev","next","getPrev","Date","getNext","groupWithPrev","groupWithNext","isUserMessage","isFileMessage","String","messageId","reqId","getAvailableUriFromFileMessage","url","messageParams","file","uri","isSendbirdNotification","dataPayload","Boolean","parseSendbirdNotification","sendbird","JSON","parse","shouldRenderReaction","channel","reactionEnabled","isOpenChannel","isGroupChannel","isBroadcast","isSuper","getReactionCount","reaction","userIds","getFileTypeFromMessage","type","name","getMessageType","ogMetaData","fileType"],"sources":["message.ts"],"sourcesContent":["import { getFileExtension, getFileType } from '../shared/file';\nimport type {\n SendbirdBaseChannel,\n SendbirdBaseMessage,\n SendbirdDataPayload,\n SendbirdFileMessage,\n SendbirdMessage,\n SendbirdReaction,\n SendbirdSendableMessage,\n} from '../types';\nimport { getMessageTimeFormat } from '../ui-format/common';\n\nexport function isNewMessage(msg: SendbirdMessage, currentUserId?: string) {\n const myMessage = isMyMessage(msg, currentUserId);\n if (myMessage) return false;\n if (msg.isAdminMessage()) return false;\n return msg.updatedAt === 0;\n}\n\nexport function isSendableMessage(msg?: SendbirdMessage | null): msg is SendbirdSendableMessage {\n return msg !== undefined && msg !== null && 'sendingStatus' in msg;\n}\n\nexport function isMyMessage(msg?: SendbirdMessage | null, currentUserId = '##__USER_ID_IS_NOT_PROVIDED__##') {\n if (!isSendableMessage(msg)) return false;\n return (\n ('sender' in msg && msg.sender?.userId === currentUserId) ||\n msg.sendingStatus === 'pending' ||\n msg.sendingStatus === 'failed' ||\n msg.sendingStatus === 'canceled'\n );\n}\n\nexport function messageKeyExtractor(message: SendbirdMessage): string {\n return getMessageUniqId(message);\n}\n\n// |-------------------|-------------------|-----------------|-------------------|\n// | sending status | reqId | messageId | createdAt |\n// |-------------------|-------------------|-----------------|-------------------|\n// | pending | timestamp(A) | 0 | timestamp(B) |\n// | canceled | timestamp(A) | 0 | ? |\n// | failed | timestamp(A) | 0 | ? |\n// | succeeded | timestamp(A) / '' | id from DB | timestamp(C) |\n// |-------------------|-------------------|-----------------|-------------------|\nexport function messageComparator(a: SendbirdMessage, b: SendbirdMessage) {\n let aStatusOffset = 0;\n let bStatusOffset = 0;\n\n if (isSendableMessage(a) && a.sendingStatus !== 'succeeded') aStatusOffset = 999999;\n if (isSendableMessage(b) && b.sendingStatus !== 'succeeded') bStatusOffset = 999999;\n\n return b.createdAt + bStatusOffset - (a.createdAt + aStatusOffset);\n}\n\nexport function hasSameSender(a?: SendbirdMessage, b?: SendbirdMessage) {\n if (!a || !b) return false;\n if ('sender' in a && 'sender' in b) return a.sender?.userId === b.sender?.userId;\n return false;\n}\n\nexport function calcMessageGrouping(\n groupEnabled: boolean,\n curr: SendbirdMessage,\n prev?: SendbirdMessage,\n next?: SendbirdMessage,\n) {\n const getPrev = () => {\n if (!groupEnabled) return false;\n if (!prev) return false;\n if (curr.isAdminMessage()) return false;\n if (!hasSameSender(curr, prev)) return false;\n if (getMessageTimeFormat(new Date(curr.createdAt)) !== getMessageTimeFormat(new Date(prev.createdAt))) return false;\n return true;\n };\n\n const getNext = () => {\n if (!groupEnabled) return false;\n if (!next) return false;\n if (curr.isAdminMessage()) return false;\n if (!hasSameSender(curr, next)) return false;\n if (getMessageTimeFormat(new Date(curr.createdAt)) !== getMessageTimeFormat(new Date(next.createdAt))) return false;\n return true;\n };\n\n return { groupWithPrev: getPrev(), groupWithNext: getNext() };\n}\n\nexport function getMessageUniqId(msg: SendbirdBaseMessage) {\n if (msg.isUserMessage() || msg.isFileMessage()) {\n if (msg.sendingStatus === 'succeeded') return String(msg.messageId);\n return msg.reqId;\n }\n\n return String(msg.messageId);\n}\n\nexport function getAvailableUriFromFileMessage(message: SendbirdFileMessage) {\n if (!message.url && message.messageParams.file && 'uri' in message.messageParams.file) {\n return message.messageParams.file.uri;\n }\n return message.url;\n}\n\ntype RawSendbirdDataPayload = { sendbird: string | object };\nexport function isSendbirdNotification(dataPayload?: {\n [key: string]: string | object;\n}): dataPayload is RawSendbirdDataPayload {\n if (!dataPayload) return false;\n return Boolean(dataPayload['sendbird']);\n}\n\nexport function parseSendbirdNotification(dataPayload: RawSendbirdDataPayload): SendbirdDataPayload {\n return typeof dataPayload.sendbird === 'string' ? JSON.parse(dataPayload.sendbird) : dataPayload.sendbird;\n}\n\nexport function shouldRenderReaction(channel: SendbirdBaseChannel, reactionEnabled: boolean) {\n if (channel.isOpenChannel()) {\n return false;\n }\n\n if (channel.isGroupChannel()) {\n if (channel.isBroadcast) return false;\n if (channel.isSuper) return false;\n }\n\n return reactionEnabled;\n}\n\nexport function getReactionCount(reaction: SendbirdReaction) {\n return reaction.userIds.length;\n}\n\ntype MessageType =\n | 'user'\n | 'admin'\n | 'file'\n | 'unknown'\n | `user.${'opengraph'}`\n | `file.${'image' | 'video' | 'audio'}`;\n\nexport function getFileTypeFromMessage(message: SendbirdFileMessage) {\n return getFileType(message.type || getFileExtension(message.name));\n}\n\nexport function getMessageType(message: SendbirdMessage): MessageType {\n if (message.isAdminMessage()) {\n return 'admin';\n }\n\n if (message.isUserMessage()) {\n if (message.ogMetaData) {\n return 'user.opengraph';\n }\n return 'user';\n }\n\n if (message.isFileMessage()) {\n const fileType = getFileTypeFromMessage(message);\n switch (fileType) {\n case 'image':\n case 'video': {\n return `file.${fileType}`;\n }\n case 'audio': {\n return `file.${fileType}`;\n }\n default: {\n return 'file';\n }\n }\n }\n\n return 'unknown';\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"names":["ifOperator","role","then","or","getUserUniqId","user","userId"],"sources":["user.ts"],"sourcesContent":["import type { Role } from '@sendbird/chat';\n\nimport type { UserStruct } from '../types';\n\nexport function ifOperator<T>(role: Role, then: T): T | undefined;\nexport function ifOperator<T, V>(role: Role, then: T, or: V): T | V;\nexport function ifOperator(role: Role, then: unknown, or?: unknown) {\n if (role === 'operator') return then;\n return or;\n}\n\nexport function getUserUniqId<T extends UserStruct>(user: T) {\n return user.userId;\n}\n"],"mappings":"AAMA,OAAO,SAASA,UAAT,CAAoBC,IAApB,EAAgCC,IAAhC,EAA+CC,EAA/C,EAA6D;EAClE,IAAIF,IAAI,KAAK,UAAb,EAAyB,OAAOC,IAAP;EACzB,OAAOC,EAAP;AACD;AAED,OAAO,SAASC,aAAT,CAA6CC,IAA7C,EAAsD;EAC3D,OAAOA,IAAI,CAACC,MAAZ;AACD"}
1
+ {"version":3,"names":["ifOperator","role","then","or","getUserUniqId","user","userId"],"sources":["user.ts"],"sourcesContent":["import type { Role } from '@sendbird/chat';\n\nimport type { UserStruct } from '../types';\n\nexport function ifOperator<T>(role: Role, then: T): T | undefined;\nexport function ifOperator<T, V>(role: Role, then: T, or: V): T | V;\nexport function ifOperator(role: Role, then: unknown, or?: unknown) {\n if (role === 'operator') return then;\n return or;\n}\n\nexport function getUserUniqId<T extends UserStruct>(user: T) {\n return user.userId;\n}\n"],"mappings":"AAMA,OAAO,SAASA,UAAUA,CAACC,IAAU,EAAEC,IAAa,EAAEC,EAAY,EAAE;EAClE,IAAIF,IAAI,KAAK,UAAU,EAAE,OAAOC,IAAI;EACpC,OAAOC,EAAE;AACX;AAEA,OAAO,SAASC,aAAaA,CAAuBC,IAAO,EAAE;EAC3D,OAAOA,IAAI,CAACC,MAAM;AACpB"}
@@ -23,21 +23,17 @@ export default function arrayToMap(arr, selector, fallbackSelector, combine) {
23
23
  return arr.reduce((accum, curr) => {
24
24
  if (combine && fallbackSelector) {
25
25
  const _key = curr[selector] + curr[fallbackSelector];
26
-
27
26
  accum[_key] = curr;
28
27
  } else {
29
28
  const _key = curr[selector] || curr[fallbackSelector];
30
-
31
29
  accum[_key] = curr;
32
30
  }
33
-
34
31
  return accum;
35
32
  }, {});
36
33
  }
37
34
  export function arrayToMapWithGetter(arr, getSelector) {
38
35
  return arr.reduce((accum, curr) => {
39
36
  const _key = getSelector(curr);
40
-
41
37
  accum[_key] = curr;
42
38
  return accum;
43
39
  }, {});
@@ -1 +1 @@
1
- {"version":3,"names":["arrayToMap","arr","selector","fallbackSelector","combine","reduce","accum","curr","_key","arrayToMapWithGetter","getSelector"],"sources":["arrayToMap.ts"],"sourcesContent":["import type { FilterByValueType } from '../types';\n\nexport default function arrayToMap<T extends Record<K, unknown>, K extends keyof T = keyof T>(\n arr: T[],\n selector: keyof FilterByValueType<T, string | number>,\n): Record<string, T>;\n\nexport default function arrayToMap<T extends Record<K, unknown>, K extends keyof T = keyof T>(\n arr: T[],\n selector: string,\n fallbackSelector: K,\n): Record<string, T>;\n\nexport default function arrayToMap<T extends Record<K, unknown>, K extends keyof T = keyof T>(\n arr: T[],\n selector: string,\n selector2: string,\n combineKey: true,\n): Record<string, T>;\n\n/**\n * Convert Array of the object to Object\n * @param {object[]} arr\n * @param {keyof object} selector\n * @param {keyof object} [fallbackSelector]\n * @param {boolean} [combine]\n * @returns {Record<keyof object, object>}\n * @example\n * ```\n * const arr = [{name: 'john'}, {name: 'chris'}, {name: 'sravan'}, {name: 'hoon'}];\n * const obj = arrayToMap(arr, 'name');\n *\n * console.log(obj);\n * // {\n * // 'john': {name: 'john'},\n * // 'chris': {name: 'chris'},\n * // 'sravan': {name: 'sravan'},\n * // 'hoon': {name: 'hoon'}\n * // }\n * ```\n * */\nexport default function arrayToMap<T extends Record<K, unknown>, K extends keyof T = keyof T>(\n arr: T[],\n selector: K,\n fallbackSelector?: K,\n combine?: boolean,\n) {\n return arr.reduce((accum, curr) => {\n if (combine && fallbackSelector) {\n const _key = curr[selector] + (curr[fallbackSelector] as string);\n accum[_key] = curr;\n } else {\n const _key = (curr[selector] || curr[fallbackSelector as K]) as string;\n accum[_key] = curr;\n }\n\n return accum;\n }, {} as Record<string, T>);\n}\n\nexport function arrayToMapWithGetter<T>(arr: T[], getSelector: (item: T) => string) {\n return arr.reduce((accum, curr) => {\n const _key = getSelector(curr);\n accum[_key] = curr;\n return accum;\n }, {} as Record<string, T>);\n}\n"],"mappings":"AAoBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,SAASA,UAAT,CACbC,GADa,EAEbC,QAFa,EAGbC,gBAHa,EAIbC,OAJa,EAKb;EACA,OAAOH,GAAG,CAACI,MAAJ,CAAW,CAACC,KAAD,EAAQC,IAAR,KAAiB;IACjC,IAAIH,OAAO,IAAID,gBAAf,EAAiC;MAC/B,MAAMK,IAAI,GAAGD,IAAI,CAACL,QAAD,CAAJ,GAAkBK,IAAI,CAACJ,gBAAD,CAAnC;;MACAG,KAAK,CAACE,IAAD,CAAL,GAAcD,IAAd;IACD,CAHD,MAGO;MACL,MAAMC,IAAI,GAAID,IAAI,CAACL,QAAD,CAAJ,IAAkBK,IAAI,CAACJ,gBAAD,CAApC;;MACAG,KAAK,CAACE,IAAD,CAAL,GAAcD,IAAd;IACD;;IAED,OAAOD,KAAP;EACD,CAVM,EAUJ,EAVI,CAAP;AAWD;AAED,OAAO,SAASG,oBAAT,CAAiCR,GAAjC,EAA2CS,WAA3C,EAA6E;EAClF,OAAOT,GAAG,CAACI,MAAJ,CAAW,CAACC,KAAD,EAAQC,IAAR,KAAiB;IACjC,MAAMC,IAAI,GAAGE,WAAW,CAACH,IAAD,CAAxB;;IACAD,KAAK,CAACE,IAAD,CAAL,GAAcD,IAAd;IACA,OAAOD,KAAP;EACD,CAJM,EAIJ,EAJI,CAAP;AAKD"}
1
+ {"version":3,"names":["arrayToMap","arr","selector","fallbackSelector","combine","reduce","accum","curr","_key","arrayToMapWithGetter","getSelector"],"sources":["arrayToMap.ts"],"sourcesContent":["import type { FilterByValueType } from '../types';\n\nexport default function arrayToMap<T extends Record<K, unknown>, K extends keyof T = keyof T>(\n arr: T[],\n selector: keyof FilterByValueType<T, string | number>,\n): Record<string, T>;\n\nexport default function arrayToMap<T extends Record<K, unknown>, K extends keyof T = keyof T>(\n arr: T[],\n selector: string,\n fallbackSelector: K,\n): Record<string, T>;\n\nexport default function arrayToMap<T extends Record<K, unknown>, K extends keyof T = keyof T>(\n arr: T[],\n selector: string,\n selector2: string,\n combineKey: true,\n): Record<string, T>;\n\n/**\n * Convert Array of the object to Object\n * @param {object[]} arr\n * @param {keyof object} selector\n * @param {keyof object} [fallbackSelector]\n * @param {boolean} [combine]\n * @returns {Record<keyof object, object>}\n * @example\n * ```\n * const arr = [{name: 'john'}, {name: 'chris'}, {name: 'sravan'}, {name: 'hoon'}];\n * const obj = arrayToMap(arr, 'name');\n *\n * console.log(obj);\n * // {\n * // 'john': {name: 'john'},\n * // 'chris': {name: 'chris'},\n * // 'sravan': {name: 'sravan'},\n * // 'hoon': {name: 'hoon'}\n * // }\n * ```\n * */\nexport default function arrayToMap<T extends Record<K, unknown>, K extends keyof T = keyof T>(\n arr: T[],\n selector: K,\n fallbackSelector?: K,\n combine?: boolean,\n) {\n return arr.reduce((accum, curr) => {\n if (combine && fallbackSelector) {\n const _key = curr[selector] + (curr[fallbackSelector] as string);\n accum[_key] = curr;\n } else {\n const _key = (curr[selector] || curr[fallbackSelector as K]) as string;\n accum[_key] = curr;\n }\n\n return accum;\n }, {} as Record<string, T>);\n}\n\nexport function arrayToMapWithGetter<T>(arr: T[], getSelector: (item: T) => string) {\n return arr.reduce((accum, curr) => {\n const _key = getSelector(curr);\n accum[_key] = curr;\n return accum;\n }, {} as Record<string, T>);\n}\n"],"mappings":"AAoBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,SAASA,UAAUA,CAChCC,GAAQ,EACRC,QAAW,EACXC,gBAAoB,EACpBC,OAAiB,EACjB;EACA,OAAOH,GAAG,CAACI,MAAM,CAAC,CAACC,KAAK,EAAEC,IAAI,KAAK;IACjC,IAAIH,OAAO,IAAID,gBAAgB,EAAE;MAC/B,MAAMK,IAAI,GAAGD,IAAI,CAACL,QAAQ,CAAC,GAAIK,IAAI,CAACJ,gBAAgB,CAAY;MAChEG,KAAK,CAACE,IAAI,CAAC,GAAGD,IAAI;IACpB,CAAC,MAAM;MACL,MAAMC,IAAI,GAAID,IAAI,CAACL,QAAQ,CAAC,IAAIK,IAAI,CAACJ,gBAAgB,CAAiB;MACtEG,KAAK,CAACE,IAAI,CAAC,GAAGD,IAAI;IACpB;IAEA,OAAOD,KAAK;EACd,CAAC,EAAE,CAAC,CAAC,CAAsB;AAC7B;AAEA,OAAO,SAASG,oBAAoBA,CAAIR,GAAQ,EAAES,WAAgC,EAAE;EAClF,OAAOT,GAAG,CAACI,MAAM,CAAC,CAACC,KAAK,EAAEC,IAAI,KAAK;IACjC,MAAMC,IAAI,GAAGE,WAAW,CAACH,IAAI,CAAC;IAC9BD,KAAK,CAACE,IAAI,CAAC,GAAGD,IAAI;IAClB,OAAOD,KAAK;EACd,CAAC,EAAE,CAAC,CAAC,CAAsB;AAC7B"}
@@ -1,42 +1,35 @@
1
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
2
-
1
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
2
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
3
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
3
4
  let REQ_PER_TIMEOUT = 5;
4
5
  let TIMEOUT_MILLS = 1000;
5
6
  const SAFE_TIMEOUT_BUFFER = 100;
6
-
7
7
  function generateRandomId() {
8
8
  return Math.random().toString(16).slice(2);
9
9
  }
10
-
11
10
  export class BufferedRequest {
12
11
  static updateMarkAsReadOptions(reqPerTimeout, timeoutMills) {
13
12
  BufferedRequest.markAsRead = BufferedRequest.create(reqPerTimeout, timeoutMills);
14
13
  }
15
-
16
14
  static updateMarkAsDeliveredOptions(reqPerTimeout, timeoutMills) {
17
15
  BufferedRequest.markAsDelivered = BufferedRequest.create(reqPerTimeout, timeoutMills);
18
16
  }
19
-
20
17
  static get reqPerTimeout() {
21
18
  return REQ_PER_TIMEOUT;
22
19
  }
23
-
24
20
  static set reqPerTimeout(value) {
25
21
  REQ_PER_TIMEOUT = value;
26
22
  BufferedRequest.markAsRead = BufferedRequest.create();
27
23
  BufferedRequest.markAsDelivered = BufferedRequest.create();
28
24
  }
29
-
30
25
  static get timeoutMills() {
31
26
  return TIMEOUT_MILLS;
32
27
  }
33
-
34
28
  static set timeoutMills(value) {
35
29
  TIMEOUT_MILLS = value;
36
30
  BufferedRequest.markAsRead = BufferedRequest.create();
37
31
  BufferedRequest.markAsDelivered = BufferedRequest.create();
38
32
  }
39
-
40
33
  static create() {
41
34
  let reqPerTimeout = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : REQ_PER_TIMEOUT;
42
35
  let timeoutMills = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : TIMEOUT_MILLS;
@@ -49,16 +42,13 @@ export class BufferedRequest {
49
42
  waitQueue.set(lane ?? generateRandomId(), func);
50
43
  this.invoke();
51
44
  },
52
-
53
45
  shift() {
54
46
  if (nextQueue.size < reqPerTimeout) {
55
47
  const nextRemains = Math.min(reqPerTimeout - nextQueue.size, waitQueue.size);
56
48
  const lanes = [...waitQueue.keys()];
57
-
58
49
  for (let n = 0; n < nextRemains; n++) {
59
50
  const lane = lanes[n];
60
51
  const func = waitQueue.get(lane);
61
-
62
52
  if (func) {
63
53
  waitQueue.delete(lane);
64
54
  nextQueue.set(lane, func);
@@ -66,19 +56,16 @@ export class BufferedRequest {
66
56
  }
67
57
  }
68
58
  },
69
-
70
59
  handleIdle() {
71
60
  if (0 < nextQueue.size) {
72
61
  state = 'processing';
73
62
  this.invoke();
74
63
  }
75
64
  },
76
-
77
65
  handleProcessing() {
78
66
  if (timeout) return;
79
67
  timeout = setTimeout(() => {
80
68
  timeout = undefined;
81
-
82
69
  if (0 < nextQueue.size || 0 < waitQueue.size) {
83
70
  this.invoke();
84
71
  } else {
@@ -89,32 +76,26 @@ export class BufferedRequest {
89
76
  const nextRequestBaseTimeout = timeoutMills / nextQueue.size;
90
77
  nextQueue.forEach(func => {
91
78
  setTimeout(() => {
92
- func(); // TODO: Add retry
79
+ func();
80
+ // TODO: Add retry
93
81
  //.catch(() => waitQueue.set(lane, func));
94
82
  }, nextRequestBaseTimeout * index);
95
83
  index++;
96
84
  });
97
85
  nextQueue.clear();
98
86
  },
99
-
100
87
  async invoke() {
101
88
  this.shift();
102
-
103
89
  if (state === 'idle') {
104
90
  this.handleIdle();
105
91
  }
106
-
107
92
  if (state === 'processing') {
108
93
  this.handleProcessing();
109
94
  }
110
95
  }
111
-
112
96
  };
113
97
  }
114
-
115
98
  }
116
-
117
99
  _defineProperty(BufferedRequest, "markAsRead", BufferedRequest.create());
118
-
119
100
  _defineProperty(BufferedRequest, "markAsDelivered", BufferedRequest.create());
120
101
  //# sourceMappingURL=bufferedRequest.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["REQ_PER_TIMEOUT","TIMEOUT_MILLS","SAFE_TIMEOUT_BUFFER","generateRandomId","Math","random","toString","slice","BufferedRequest","updateMarkAsReadOptions","reqPerTimeout","timeoutMills","markAsRead","create","updateMarkAsDeliveredOptions","markAsDelivered","value","waitQueue","Map","nextQueue","state","timeout","push","func","lane","set","invoke","shift","size","nextRemains","min","lanes","keys","n","get","delete","handleIdle","handleProcessing","setTimeout","undefined","index","nextRequestBaseTimeout","forEach","clear"],"sources":["bufferedRequest.ts"],"sourcesContent":["type Func = (...args: unknown[]) => Promise<unknown>;\ntype State = 'idle' | 'processing';\n\nlet REQ_PER_TIMEOUT = 5;\nlet TIMEOUT_MILLS = 1000;\nconst SAFE_TIMEOUT_BUFFER = 100;\n\nfunction generateRandomId() {\n return Math.random().toString(16).slice(2);\n}\n\nexport class BufferedRequest {\n public static markAsRead = BufferedRequest.create();\n public static markAsDelivered = BufferedRequest.create();\n\n public static updateMarkAsReadOptions(reqPerTimeout: number, timeoutMills: number) {\n BufferedRequest.markAsRead = BufferedRequest.create(reqPerTimeout, timeoutMills);\n }\n public static updateMarkAsDeliveredOptions(reqPerTimeout: number, timeoutMills: number) {\n BufferedRequest.markAsDelivered = BufferedRequest.create(reqPerTimeout, timeoutMills);\n }\n\n public static get reqPerTimeout() {\n return REQ_PER_TIMEOUT;\n }\n public static set reqPerTimeout(value: number) {\n REQ_PER_TIMEOUT = value;\n BufferedRequest.markAsRead = BufferedRequest.create();\n BufferedRequest.markAsDelivered = BufferedRequest.create();\n }\n\n public static get timeoutMills() {\n return TIMEOUT_MILLS;\n }\n public static set timeoutMills(value: number) {\n TIMEOUT_MILLS = value;\n BufferedRequest.markAsRead = BufferedRequest.create();\n BufferedRequest.markAsDelivered = BufferedRequest.create();\n }\n\n public static create(reqPerTimeout = REQ_PER_TIMEOUT, timeoutMills = TIMEOUT_MILLS) {\n const waitQueue = new Map<string, Func>();\n const nextQueue = new Map<string, Func>();\n\n let state: State = 'idle';\n let timeout: NodeJS.Timeout | undefined;\n\n return {\n push(func: Func, lane?: string) {\n waitQueue.set(lane ?? generateRandomId(), func);\n this.invoke();\n },\n shift() {\n if (nextQueue.size < reqPerTimeout) {\n const nextRemains = Math.min(reqPerTimeout - nextQueue.size, waitQueue.size);\n const lanes = [...waitQueue.keys()];\n for (let n = 0; n < nextRemains; n++) {\n const lane = lanes[n];\n const func = waitQueue.get(lane);\n if (func) {\n waitQueue.delete(lane);\n nextQueue.set(lane, func);\n }\n }\n }\n },\n handleIdle() {\n if (0 < nextQueue.size) {\n state = 'processing';\n this.invoke();\n }\n },\n handleProcessing() {\n if (timeout) return;\n\n timeout = setTimeout(() => {\n timeout = undefined;\n if (0 < nextQueue.size || 0 < waitQueue.size) {\n this.invoke();\n } else {\n state = 'idle';\n }\n }, timeoutMills + SAFE_TIMEOUT_BUFFER);\n\n let index = 0;\n const nextRequestBaseTimeout = timeoutMills / nextQueue.size;\n nextQueue.forEach((func) => {\n setTimeout(() => {\n func();\n // TODO: Add retry\n //.catch(() => waitQueue.set(lane, func));\n }, nextRequestBaseTimeout * index);\n index++;\n });\n nextQueue.clear();\n },\n async invoke() {\n this.shift();\n\n if (state === 'idle') {\n this.handleIdle();\n }\n\n if (state === 'processing') {\n this.handleProcessing();\n }\n },\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["REQ_PER_TIMEOUT","TIMEOUT_MILLS","SAFE_TIMEOUT_BUFFER","generateRandomId","Math","random","toString","slice","BufferedRequest","updateMarkAsReadOptions","reqPerTimeout","timeoutMills","markAsRead","create","updateMarkAsDeliveredOptions","markAsDelivered","value","arguments","length","undefined","waitQueue","Map","nextQueue","state","timeout","push","func","lane","set","invoke","shift","size","nextRemains","min","lanes","keys","n","get","delete","handleIdle","handleProcessing","setTimeout","index","nextRequestBaseTimeout","forEach","clear","_defineProperty"],"sources":["bufferedRequest.ts"],"sourcesContent":["type Func = (...args: unknown[]) => Promise<unknown>;\ntype State = 'idle' | 'processing';\n\nlet REQ_PER_TIMEOUT = 5;\nlet TIMEOUT_MILLS = 1000;\nconst SAFE_TIMEOUT_BUFFER = 100;\n\nfunction generateRandomId() {\n return Math.random().toString(16).slice(2);\n}\n\nexport class BufferedRequest {\n public static markAsRead = BufferedRequest.create();\n public static markAsDelivered = BufferedRequest.create();\n\n public static updateMarkAsReadOptions(reqPerTimeout: number, timeoutMills: number) {\n BufferedRequest.markAsRead = BufferedRequest.create(reqPerTimeout, timeoutMills);\n }\n public static updateMarkAsDeliveredOptions(reqPerTimeout: number, timeoutMills: number) {\n BufferedRequest.markAsDelivered = BufferedRequest.create(reqPerTimeout, timeoutMills);\n }\n\n public static get reqPerTimeout() {\n return REQ_PER_TIMEOUT;\n }\n public static set reqPerTimeout(value: number) {\n REQ_PER_TIMEOUT = value;\n BufferedRequest.markAsRead = BufferedRequest.create();\n BufferedRequest.markAsDelivered = BufferedRequest.create();\n }\n\n public static get timeoutMills() {\n return TIMEOUT_MILLS;\n }\n public static set timeoutMills(value: number) {\n TIMEOUT_MILLS = value;\n BufferedRequest.markAsRead = BufferedRequest.create();\n BufferedRequest.markAsDelivered = BufferedRequest.create();\n }\n\n public static create(reqPerTimeout = REQ_PER_TIMEOUT, timeoutMills = TIMEOUT_MILLS) {\n const waitQueue = new Map<string, Func>();\n const nextQueue = new Map<string, Func>();\n\n let state: State = 'idle';\n let timeout: NodeJS.Timeout | undefined;\n\n return {\n push(func: Func, lane?: string) {\n waitQueue.set(lane ?? generateRandomId(), func);\n this.invoke();\n },\n shift() {\n if (nextQueue.size < reqPerTimeout) {\n const nextRemains = Math.min(reqPerTimeout - nextQueue.size, waitQueue.size);\n const lanes = [...waitQueue.keys()];\n for (let n = 0; n < nextRemains; n++) {\n const lane = lanes[n];\n const func = waitQueue.get(lane);\n if (func) {\n waitQueue.delete(lane);\n nextQueue.set(lane, func);\n }\n }\n }\n },\n handleIdle() {\n if (0 < nextQueue.size) {\n state = 'processing';\n this.invoke();\n }\n },\n handleProcessing() {\n if (timeout) return;\n\n timeout = setTimeout(() => {\n timeout = undefined;\n if (0 < nextQueue.size || 0 < waitQueue.size) {\n this.invoke();\n } else {\n state = 'idle';\n }\n }, timeoutMills + SAFE_TIMEOUT_BUFFER);\n\n let index = 0;\n const nextRequestBaseTimeout = timeoutMills / nextQueue.size;\n nextQueue.forEach((func) => {\n setTimeout(() => {\n func();\n // TODO: Add retry\n //.catch(() => waitQueue.set(lane, func));\n }, nextRequestBaseTimeout * index);\n index++;\n });\n nextQueue.clear();\n },\n async invoke() {\n this.shift();\n\n if (state === 'idle') {\n this.handleIdle();\n }\n\n if (state === 'processing') {\n this.handleProcessing();\n }\n },\n };\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,187 @@
1
+ const EXTENSION_MIME_MAP = {
2
+ // Image
3
+ 'jpeg': 'image/jpeg',
4
+ 'jpg': 'image/jpeg',
5
+ 'png': 'image/png',
6
+ 'gif': 'image/gif',
7
+ 'webp': 'image/webp',
8
+ 'svg': 'image/svg+xml',
9
+ // Video
10
+ '3gp': 'video/3gpp',
11
+ 'mp4': 'video/mp4',
12
+ 'mpeg': 'video/mpeg',
13
+ 'ogv': 'video/ogg',
14
+ 'video/quicktime': 'mov',
15
+ 'webm': 'video/webm',
16
+ 'avi': 'video/x-msvideo',
17
+ // Audio
18
+ 'aac': 'audio/aac',
19
+ 'mid': 'audio/midi',
20
+ 'mp3': 'audio/mpeg',
21
+ 'ogg': 'audio/ogg',
22
+ 'wav': 'audio/wav',
23
+ 'weba': 'audio/webm',
24
+ // Files
25
+ 'txt': 'text/plain',
26
+ 'pdf': 'application/pdf',
27
+ 'doc': 'application/msword',
28
+ 'docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
29
+ 'xls': 'application/vnd.ms-excel',
30
+ 'xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
31
+ 'ppt': 'application/vnd.ms-powerpoint',
32
+ 'pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
33
+ 'zip': 'application/zip',
34
+ 'json': 'application/json',
35
+ 'gzip': 'application/x-gzip'
36
+ };
37
+ export const imageExtRegex = /jpeg|jpg|png|webp|gif/i;
38
+ export const audioExtRegex = /3gp|aac|aax|act|aiff|flac|gsm|m4a|m4b|m4p|tta|wma|mp3|webm|wav/i;
39
+ export const videoExtRegex = /mov|vod|mp4|avi/i;
40
+ export const getFileType = extOrType => {
41
+ if (extOrType.indexOf('/') > -1) {
42
+ const type = extOrType.split('/')[0];
43
+ if (type === 'video') return 'video';
44
+ if (type === 'audio') return 'audio';
45
+ if (type === 'image') return 'image';
46
+ return 'file';
47
+ }
48
+ if (extOrType.match(imageExtRegex)) return 'image';
49
+ if (extOrType.match(audioExtRegex)) return 'audio';
50
+ if (extOrType.match(videoExtRegex)) return 'video';
51
+ return 'file';
52
+ };
53
+
54
+ /**
55
+ * Calculates the downscaled size of an image while preserving its aspect ratio.
56
+ *
57
+ * @param {Object} origin - The original size object with `width` and `height` properties.
58
+ * @param {Object} resizing - The resizing object with optional `width` and `height` properties.
59
+ * @returns {Object} - A new size object with the downscaled `width` and `height` properties.
60
+ * @example
61
+ * ```ts
62
+ * getDownscaleSize({ width: 1200, height: 800 }, { width: 600 }); // returns { width: 600, height: 400 }
63
+ * ```
64
+ */
65
+
66
+ export function getDownscaleSize(origin, resizing) {
67
+ let ratio;
68
+ const maxWidth = resizing.width || origin.width,
69
+ maxHeight = resizing.height || origin.height;
70
+ if (origin.width <= maxWidth && origin.height <= maxHeight) {
71
+ ratio = 1;
72
+ } else if (origin.width > maxWidth && origin.height <= maxHeight) {
73
+ ratio = maxWidth / origin.width;
74
+ } else if (origin.width <= maxWidth && origin.height > maxHeight) {
75
+ ratio = maxHeight / origin.height;
76
+ } else {
77
+ ratio = Math.min(maxWidth / origin.width, maxHeight / origin.height);
78
+ }
79
+ return {
80
+ width: origin.width * ratio,
81
+ height: origin.height * ratio
82
+ };
83
+ }
84
+
85
+ /**
86
+ * Normalize a file name by ensuring it has the given extension, if it doesn't already.
87
+ *
88
+ * @param {string} fileName - The file name to normalize.
89
+ * @param {string} extension - The desired extension, without a leading period.
90
+ * @returns {string} - The normalized file name, with the extension.
91
+ */
92
+ export function normalizeFileName(fileName, extension) {
93
+ if (!extension) return fileName;
94
+
95
+ // .extension
96
+ let _extension = extension.toLowerCase();
97
+ if (_extension.indexOf('.') !== 0) {
98
+ _extension = '.' + _extension;
99
+ }
100
+
101
+ // filename.extension | filename
102
+ const _filename = fileName.toLowerCase();
103
+ const hasExtension = _filename.lastIndexOf(_extension) === _filename.length - _extension.length;
104
+ if (!hasExtension) {
105
+ // filename.extension
106
+ return fileName + _extension;
107
+ } else {
108
+ // filename.extension
109
+ return fileName;
110
+ }
111
+ }
112
+
113
+ /**
114
+ * Parses a MIME type string into its components.
115
+ *
116
+ * @param mimeType - The MIME type string to parse.
117
+ * @returns An object containing the type, subtype, and parameters of the MIME type.
118
+ */
119
+
120
+ export function parseMimeType(mimeType) {
121
+ const [fullType, ...parts] = mimeType.split(';');
122
+ const [type, subtype] = fullType.split('/');
123
+ const parameters = {};
124
+ for (const part of parts) {
125
+ const [name, value] = part.trim().split('=');
126
+ parameters[name] = value;
127
+ }
128
+ return {
129
+ type,
130
+ subtype,
131
+ parameters
132
+ };
133
+ }
134
+
135
+ /**
136
+ * Returns the file extension based on the MIME type.
137
+ *
138
+ * @param {string | null | undefined} mimeType - The MIME type to look up.
139
+ * @returns {string} - The file extension for the given MIME type, or an empty string if no matching file extension was found.
140
+ */
141
+ export function getFileExtensionFromMime(mimeType) {
142
+ if (!mimeType) return '';
143
+ const MIME_EXTENSION_MAP = Object.entries(EXTENSION_MIME_MAP).reduce((acc, _ref) => {
144
+ let [key, value] = _ref;
145
+ acc[value] = key;
146
+ return acc;
147
+ }, {});
148
+ return MIME_EXTENSION_MAP[mimeType.toLowerCase()] || '';
149
+ }
150
+
151
+ /**
152
+ * Returns the MIME type based on the file extension.
153
+ *
154
+ * @param {string | null | undefined} ext - The file extension to look up.
155
+ * @returns {string} - The MIME type for the given file extension, or an empty string if no matching MIME type was found.
156
+ */
157
+ export function getMimeFromFileExtension(ext) {
158
+ if (!ext) return '';
159
+ return EXTENSION_MIME_MAP[ext.toLowerCase()] || '';
160
+ }
161
+
162
+ /**
163
+ * Returns the file extension of a file path.
164
+ *
165
+ * @param {string} filePath - The file path to extract the extension from.
166
+ * @returns {string} - The file extension, or an empty string if the file path does not have an extension.
167
+ */
168
+ export function getFileExtension(filePath) {
169
+ const pathWithoutParams = filePath.split('?')[0];
170
+ const idx = pathWithoutParams.lastIndexOf('.');
171
+ if (idx === -1) return '';
172
+ const result = pathWithoutParams.slice(idx - pathWithoutParams.length).toLowerCase();
173
+ if (result === '.') return '';else return result;
174
+ }
175
+ export function getFileExtensionFromUri(uri) {
176
+ return fetch(uri).then(response => response.headers.get('content-type'));
177
+ }
178
+ export function isImage(filePath, mimeType) {
179
+ const type = getFileType(mimeType || getFileExtension(filePath));
180
+ return type === 'image';
181
+ }
182
+ export function shouldCompressImage(mime) {
183
+ let compressionEnabled = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
184
+ const extension = getFileExtensionFromMime(mime);
185
+ return Boolean(extension.match(/jpg|jpeg|png/i) && compressionEnabled);
186
+ }
187
+ //# sourceMappingURL=file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["EXTENSION_MIME_MAP","imageExtRegex","audioExtRegex","videoExtRegex","getFileType","extOrType","indexOf","type","split","match","getDownscaleSize","origin","resizing","ratio","maxWidth","width","maxHeight","height","Math","min","normalizeFileName","fileName","extension","_extension","toLowerCase","_filename","hasExtension","lastIndexOf","length","parseMimeType","mimeType","fullType","parts","subtype","parameters","part","name","value","trim","getFileExtensionFromMime","MIME_EXTENSION_MAP","Object","entries","reduce","acc","_ref","key","getMimeFromFileExtension","ext","getFileExtension","filePath","pathWithoutParams","idx","result","slice","getFileExtensionFromUri","uri","fetch","then","response","headers","get","isImage","shouldCompressImage","mime","compressionEnabled","arguments","undefined","Boolean"],"sources":["file.ts"],"sourcesContent":["const EXTENSION_MIME_MAP = {\n // Image\n 'jpeg': 'image/jpeg',\n 'jpg': 'image/jpeg',\n 'png': 'image/png',\n 'gif': 'image/gif',\n 'webp': 'image/webp',\n 'svg': 'image/svg+xml',\n\n // Video\n '3gp': 'video/3gpp',\n 'mp4': 'video/mp4',\n 'mpeg': 'video/mpeg',\n 'ogv': 'video/ogg',\n 'video/quicktime': 'mov',\n 'webm': 'video/webm',\n 'avi': 'video/x-msvideo',\n\n // Audio\n 'aac': 'audio/aac',\n 'mid': 'audio/midi',\n 'mp3': 'audio/mpeg',\n 'ogg': 'audio/ogg',\n 'wav': 'audio/wav',\n 'weba': 'audio/webm',\n\n // Files\n 'txt': 'text/plain',\n 'pdf': 'application/pdf',\n 'doc': 'application/msword',\n 'docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'xls': 'application/vnd.ms-excel',\n 'xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'ppt': 'application/vnd.ms-powerpoint',\n 'pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'zip': 'application/zip',\n 'json': 'application/json',\n 'gzip': 'application/x-gzip',\n} as Record<string, string>;\n\nexport const imageExtRegex = /jpeg|jpg|png|webp|gif/i;\nexport const audioExtRegex = /3gp|aac|aax|act|aiff|flac|gsm|m4a|m4b|m4p|tta|wma|mp3|webm|wav/i;\nexport const videoExtRegex = /mov|vod|mp4|avi/i;\nexport const getFileType = (extOrType: string) => {\n if (extOrType.indexOf('/') > -1) {\n const type = extOrType.split('/')[0];\n if (type === 'video') return 'video';\n if (type === 'audio') return 'audio';\n if (type === 'image') return 'image';\n return 'file';\n }\n\n if (extOrType.match(imageExtRegex)) return 'image';\n if (extOrType.match(audioExtRegex)) return 'audio';\n if (extOrType.match(videoExtRegex)) return 'video';\n return 'file';\n};\n\n/**\n * Calculates the downscaled size of an image while preserving its aspect ratio.\n *\n * @param {Object} origin - The original size object with `width` and `height` properties.\n * @param {Object} resizing - The resizing object with optional `width` and `height` properties.\n * @returns {Object} - A new size object with the downscaled `width` and `height` properties.\n * @example\n * ```ts\n * getDownscaleSize({ width: 1200, height: 800 }, { width: 600 }); // returns { width: 600, height: 400 }\n * ```\n */\ntype Size = { width: number; height: number };\nexport function getDownscaleSize(origin: Size, resizing: Partial<Size>) {\n let ratio: number;\n\n const maxWidth = resizing.width || origin.width,\n maxHeight = resizing.height || origin.height;\n\n if (origin.width <= maxWidth && origin.height <= maxHeight) {\n ratio = 1;\n } else if (origin.width > maxWidth && origin.height <= maxHeight) {\n ratio = maxWidth / origin.width;\n } else if (origin.width <= maxWidth && origin.height > maxHeight) {\n ratio = maxHeight / origin.height;\n } else {\n ratio = Math.min(maxWidth / origin.width, maxHeight / origin.height);\n }\n\n return { width: origin.width * ratio, height: origin.height * ratio };\n}\n\n/**\n * Normalize a file name by ensuring it has the given extension, if it doesn't already.\n *\n * @param {string} fileName - The file name to normalize.\n * @param {string} extension - The desired extension, without a leading period.\n * @returns {string} - The normalized file name, with the extension.\n */\nexport function normalizeFileName(fileName: string, extension: string) {\n if (!extension) return fileName;\n\n // .extension\n let _extension = extension.toLowerCase();\n if (_extension.indexOf('.') !== 0) {\n _extension = '.' + _extension;\n }\n\n // filename.extension | filename\n const _filename = fileName.toLowerCase();\n const hasExtension = _filename.lastIndexOf(_extension) === _filename.length - _extension.length;\n if (!hasExtension) {\n // filename.extension\n return fileName + _extension;\n } else {\n // filename.extension\n return fileName;\n }\n}\n\n/**\n * Parses a MIME type string into its components.\n *\n * @param mimeType - The MIME type string to parse.\n * @returns An object containing the type, subtype, and parameters of the MIME type.\n */\ntype MimeType = { type: string; subtype: string; parameters: Record<string, string> };\nexport function parseMimeType(mimeType: string): MimeType {\n const [fullType, ...parts] = mimeType.split(';');\n const [type, subtype] = fullType.split('/');\n const parameters: MimeType['parameters'] = {};\n\n for (const part of parts) {\n const [name, value] = part.trim().split('=');\n parameters[name] = value;\n }\n\n return { type, subtype, parameters };\n}\n\n/**\n * Returns the file extension based on the MIME type.\n *\n * @param {string | null | undefined} mimeType - The MIME type to look up.\n * @returns {string} - The file extension for the given MIME type, or an empty string if no matching file extension was found.\n */\nexport function getFileExtensionFromMime(mimeType?: string | null): string {\n if (!mimeType) return '';\n const MIME_EXTENSION_MAP = Object.entries(EXTENSION_MIME_MAP).reduce((acc, [key, value]) => {\n acc[value] = key;\n return acc;\n }, {} as Record<string, string>);\n return MIME_EXTENSION_MAP[mimeType.toLowerCase()] || '';\n}\n\n/**\n * Returns the MIME type based on the file extension.\n *\n * @param {string | null | undefined} ext - The file extension to look up.\n * @returns {string} - The MIME type for the given file extension, or an empty string if no matching MIME type was found.\n */\nexport function getMimeFromFileExtension(ext?: string | null) {\n if (!ext) return '';\n return EXTENSION_MIME_MAP[ext.toLowerCase()] || '';\n}\n\n/**\n * Returns the file extension of a file path.\n *\n * @param {string} filePath - The file path to extract the extension from.\n * @returns {string} - The file extension, or an empty string if the file path does not have an extension.\n */\nexport function getFileExtension(filePath: string) {\n const pathWithoutParams = filePath.split('?')[0];\n\n const idx = pathWithoutParams.lastIndexOf('.');\n if (idx === -1) return '';\n\n const result = pathWithoutParams.slice(idx - pathWithoutParams.length).toLowerCase();\n if (result === '.') return '';\n else return result;\n}\n\nexport function getFileExtensionFromUri(uri: string) {\n return fetch(uri).then((response) => response.headers.get('content-type'));\n}\n\nexport function isImage(filePath: string, mimeType?: string) {\n const type = getFileType(mimeType || getFileExtension(filePath));\n return type === 'image';\n}\n\nexport function shouldCompressImage(mime: string, compressionEnabled = true) {\n const extension = getFileExtensionFromMime(mime);\n return Boolean(extension.match(/jpg|jpeg|png/i) && compressionEnabled);\n}\n"],"mappings":"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"}