@dxos/plugin-thread 0.8.4-main.c1de068 → 0.8.4-main.f5c0578
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/browser/ChannelContainer-O2SFQJU7.mjs +16 -0
- package/dist/lib/browser/{ChatContainer-AIGIWAUG.mjs → ChatContainer-PVT3DUZJ.mjs} +4 -4
- package/dist/lib/browser/{app-graph-builder-N7BE5TYW.mjs → app-graph-builder-AF3M7UWN.mjs} +5 -5
- package/dist/lib/browser/app-graph-builder-AF3M7UWN.mjs.map +7 -0
- package/dist/lib/browser/{call-manager-NIPDYUVD.mjs → call-manager-XRRCAVLI.mjs} +4 -4
- package/dist/lib/browser/call-manager-XRRCAVLI.mjs.map +7 -0
- package/dist/lib/browser/chunk-2CWJBXBH.mjs +21 -0
- package/dist/lib/browser/{chunk-LGSDKXPF.mjs → chunk-4APCDRSH.mjs} +1 -1
- package/dist/lib/browser/{chunk-LGSDKXPF.mjs.map → chunk-4APCDRSH.mjs.map} +1 -1
- package/dist/lib/browser/{chunk-GCLD5ESP.mjs → chunk-DW7JD64V.mjs} +1 -1
- package/dist/lib/browser/{chunk-GCLD5ESP.mjs.map → chunk-DW7JD64V.mjs.map} +2 -2
- package/dist/lib/browser/{chunk-XLPJXUKO.mjs → chunk-FY4ZRD5X.mjs} +8 -8
- package/dist/lib/{node-esm/chunk-J4NSON5Q.mjs.map → browser/chunk-FY4ZRD5X.mjs.map} +3 -3
- package/dist/lib/browser/{chunk-VUWC4IJM.mjs → chunk-J3JO5NWO.mjs} +26 -28
- package/dist/lib/browser/chunk-J3JO5NWO.mjs.map +7 -0
- package/dist/lib/browser/{chunk-6NSMBO3B.mjs → chunk-JGKMMI65.mjs} +2 -2
- package/dist/lib/browser/{chunk-6NSMBO3B.mjs.map → chunk-JGKMMI65.mjs.map} +3 -3
- package/dist/lib/browser/{chunk-ZE7KWN36.mjs → chunk-TUFWPOVS.mjs} +92 -63
- package/dist/lib/browser/chunk-TUFWPOVS.mjs.map +7 -0
- package/dist/lib/browser/{chunk-ERWASUQK.mjs → chunk-X5PIP5YR.mjs} +3 -3
- package/dist/lib/browser/{chunk-ERWASUQK.mjs.map → chunk-X5PIP5YR.mjs.map} +3 -3
- package/dist/lib/browser/{chunk-KWPRNHTK.mjs → chunk-ZJ7QBXK6.mjs} +225 -225
- package/dist/lib/browser/chunk-ZJ7QBXK6.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +7 -7
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/{intent-resolver-JFGLZ6VI.mjs → intent-resolver-DCY4P4OX.mjs} +8 -8
- package/dist/lib/browser/intent-resolver-DCY4P4OX.mjs.map +7 -0
- package/dist/lib/browser/{markdown-GEXBVJYN.mjs → markdown-WZSXCEZJ.mjs} +4 -4
- package/dist/lib/browser/markdown-WZSXCEZJ.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{react-root-X4UIVGTX.mjs → react-root-QXPALOUQ.mjs} +9 -9
- package/dist/lib/browser/{react-surface-YCYEFBPM.mjs → react-surface-PYAMIADB.mjs} +9 -9
- package/dist/lib/browser/react-surface-PYAMIADB.mjs.map +7 -0
- package/dist/lib/browser/{settings-E32MTL7A.mjs → settings-AC6YSASL.mjs} +2 -2
- package/dist/lib/browser/{state-H6CYONWE.mjs → state-2T4KDWBX.mjs} +2 -2
- package/dist/lib/browser/{state-H6CYONWE.mjs.map → state-2T4KDWBX.mjs.map} +2 -2
- package/dist/lib/browser/types/index.mjs +1 -1
- package/dist/lib/node-esm/{ChannelContainer-DET6T5N2.mjs → ChannelContainer-B2ZGAE4P.mjs} +7 -7
- package/dist/lib/node-esm/{ChatContainer-IQUWU426.mjs → ChatContainer-2CT4PJ7I.mjs} +4 -4
- package/dist/lib/node-esm/{app-graph-builder-VCW76Z6V.mjs → app-graph-builder-OLSJVCWY.mjs} +5 -5
- package/dist/lib/node-esm/app-graph-builder-OLSJVCWY.mjs.map +7 -0
- package/dist/lib/node-esm/{call-manager-D6O5ZJJ4.mjs → call-manager-EI7FXRAU.mjs} +4 -4
- package/dist/lib/node-esm/call-manager-EI7FXRAU.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-IHDNQLLR.mjs → chunk-4TME3BR4.mjs} +92 -63
- package/dist/lib/node-esm/chunk-4TME3BR4.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-6CRHHOST.mjs +23 -0
- package/dist/lib/node-esm/{chunk-J4NSON5Q.mjs → chunk-BF4UKS55.mjs} +8 -8
- package/dist/lib/node-esm/chunk-BF4UKS55.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-75RJ5DJI.mjs → chunk-PYTVBN5J.mjs} +1 -1
- package/dist/lib/node-esm/{chunk-75RJ5DJI.mjs.map → chunk-PYTVBN5J.mjs.map} +1 -1
- package/dist/lib/node-esm/{chunk-OU5BYIDO.mjs → chunk-QBHKLWGR.mjs} +2 -2
- package/dist/lib/node-esm/{chunk-OU5BYIDO.mjs.map → chunk-QBHKLWGR.mjs.map} +3 -3
- package/dist/lib/node-esm/{chunk-25ABSYP2.mjs → chunk-SED3O2XO.mjs} +3 -3
- package/dist/lib/node-esm/{chunk-25ABSYP2.mjs.map → chunk-SED3O2XO.mjs.map} +3 -3
- package/dist/lib/node-esm/{chunk-2MFNK53T.mjs → chunk-VNG6M2IY.mjs} +26 -28
- package/dist/lib/node-esm/chunk-VNG6M2IY.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-TDFHTCZZ.mjs → chunk-XVKWHTH4.mjs} +1 -1
- package/dist/lib/node-esm/{chunk-TDFHTCZZ.mjs.map → chunk-XVKWHTH4.mjs.map} +2 -2
- package/dist/lib/node-esm/{chunk-C3XFMUAY.mjs → chunk-YIDU3DXK.mjs} +225 -225
- package/dist/lib/node-esm/chunk-YIDU3DXK.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +7 -7
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/{intent-resolver-OXGNQ44Y.mjs → intent-resolver-QGTPU6QB.mjs} +8 -8
- package/dist/lib/node-esm/intent-resolver-QGTPU6QB.mjs.map +7 -0
- package/dist/lib/node-esm/{markdown-LIJZDK2J.mjs → markdown-3MZXUGUA.mjs} +4 -4
- package/dist/lib/node-esm/markdown-3MZXUGUA.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/{react-root-M7J6PZVW.mjs → react-root-7ZFJYVUZ.mjs} +9 -9
- package/dist/lib/node-esm/{react-surface-IRSEKM42.mjs → react-surface-UJFCSFNO.mjs} +9 -9
- package/dist/lib/node-esm/react-surface-UJFCSFNO.mjs.map +7 -0
- package/dist/lib/node-esm/{settings-SJ24YG7M.mjs → settings-N52O7MLS.mjs} +2 -2
- package/dist/lib/node-esm/{state-D7WNDT3N.mjs → state-62TQKQVB.mjs} +2 -2
- package/dist/lib/node-esm/{state-D7WNDT3N.mjs.map → state-62TQKQVB.mjs.map} +2 -2
- package/dist/lib/node-esm/types/index.mjs +1 -1
- package/dist/types/src/calls/call-manager.d.ts.map +1 -1
- package/dist/types/src/calls/call-swarm-synchronizer.d.ts.map +1 -1
- package/dist/types/src/calls/media-manager.d.ts.map +1 -1
- package/dist/types/src/calls/types.d.ts +1 -1
- package/dist/types/src/calls/types.d.ts.map +1 -1
- package/dist/types/src/calls/util/calls-service.d.ts +1 -1
- package/dist/types/src/calls/util/calls-service.d.ts.map +1 -1
- package/dist/types/src/calls/util/stub-media-streams.d.ts.map +1 -1
- package/dist/types/src/calls-service.stories.d.ts +1 -1
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/capabilities/call-manager.d.ts.map +1 -1
- package/dist/types/src/capabilities/capabilities.d.ts +2 -2
- package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
- package/dist/types/src/capabilities/index.d.ts +1 -1
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
- package/dist/types/src/capabilities/markdown.d.ts +1 -1
- package/dist/types/src/capabilities/markdown.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/capabilities/state.d.ts.map +1 -1
- package/dist/types/src/components/Call/Call.d.ts.map +1 -1
- package/dist/types/src/components/Call/Toolbar.d.ts.map +1 -1
- package/dist/types/src/components/CallDebugPanel.d.ts.map +1 -1
- package/dist/types/src/components/CallSidebar.d.ts.map +1 -1
- package/dist/types/src/components/ChannelContainer.d.ts.map +1 -1
- package/dist/types/src/components/ChannelContainer.stories.d.ts.map +1 -1
- package/dist/types/src/components/Chat.stories.d.ts.map +1 -1
- package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
- package/dist/types/src/components/Comments.stories.d.ts.map +1 -1
- package/dist/types/src/components/CommentsContainer.d.ts.map +1 -1
- package/dist/types/src/components/CommentsThreadContainer.d.ts.map +1 -1
- package/dist/types/src/components/Lobby/Lobby.d.ts.map +1 -1
- package/dist/types/src/components/Media/VideoObject.d.ts +1 -1
- package/dist/types/src/components/Media/VideoObject.stories.d.ts +1 -1
- package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +1 -1
- package/dist/types/src/components/MessageContainer.d.ts.map +1 -1
- package/dist/types/src/components/Participant/ParticipantGrid.d.ts.map +1 -1
- package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +1 -1
- package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +1 -1
- package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +1 -1
- package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -1
- package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +1 -1
- package/dist/types/src/extensions/threads.d.ts +2 -2
- package/dist/types/src/extensions/threads.d.ts.map +1 -1
- package/dist/types/src/types/schema.d.ts +7 -5
- package/dist/types/src/types/schema.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts +8 -6
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +47 -45
- package/src/ThreadPlugin.tsx +2 -2
- package/src/calls/call-manager.ts +1 -1
- package/src/calls/call-swarm-synchronizer.ts +1 -1
- package/src/calls/media-manager.ts +2 -2
- package/src/calls/types.ts +1 -1
- package/src/calls/util/calls-service.ts +4 -3
- package/src/calls/util/stub-media-streams.ts +2 -2
- package/src/calls-service.stories.tsx +3 -3
- package/src/capabilities/app-graph-builder.ts +6 -5
- package/src/capabilities/call-manager.ts +3 -2
- package/src/capabilities/capabilities.ts +2 -2
- package/src/capabilities/intent-resolver.ts +4 -3
- package/src/capabilities/markdown.ts +4 -3
- package/src/capabilities/react-surface.tsx +5 -4
- package/src/capabilities/state.ts +2 -1
- package/src/components/Call/Call.tsx +3 -2
- package/src/components/Call/Toolbar.tsx +2 -2
- package/src/components/CallDebugPanel.tsx +1 -1
- package/src/components/CallSidebar.tsx +2 -1
- package/src/components/ChannelContainer.stories.tsx +3 -2
- package/src/components/ChannelContainer.tsx +7 -6
- package/src/components/Chat.stories.tsx +3 -2
- package/src/components/ChatContainer.tsx +4 -3
- package/src/components/Comments.stories.tsx +4 -3
- package/src/components/CommentsContainer.tsx +2 -1
- package/src/components/CommentsThreadContainer.tsx +3 -2
- package/src/components/Lobby/Lobby.tsx +1 -1
- package/src/components/Media/VideoObject.stories.tsx +4 -3
- package/src/components/MessageContainer.tsx +4 -3
- package/src/components/Participant/ParticipantGrid.tsx +2 -1
- package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +4 -3
- package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +4 -3
- package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +1 -1
- package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +2 -2
- package/src/components/ThreadComplementary.tsx +1 -1
- package/src/components/command-extension.ts +1 -1
- package/src/extensions/threads.ts +6 -6
- package/src/hooks/useDebugMode.ts +1 -1
- package/src/testing/stories.ts +2 -2
- package/src/types/types.ts +2 -1
- package/src/typings.d.ts +8 -0
- package/dist/lib/browser/ChannelContainer-IY2UIRLF.mjs +0 -16
- package/dist/lib/browser/app-graph-builder-N7BE5TYW.mjs.map +0 -7
- package/dist/lib/browser/call-manager-NIPDYUVD.mjs.map +0 -7
- package/dist/lib/browser/chunk-4OYAYON2.mjs +0 -21
- package/dist/lib/browser/chunk-KWPRNHTK.mjs.map +0 -7
- package/dist/lib/browser/chunk-VUWC4IJM.mjs.map +0 -7
- package/dist/lib/browser/chunk-XLPJXUKO.mjs.map +0 -7
- package/dist/lib/browser/chunk-ZE7KWN36.mjs.map +0 -7
- package/dist/lib/browser/intent-resolver-JFGLZ6VI.mjs.map +0 -7
- package/dist/lib/browser/markdown-GEXBVJYN.mjs.map +0 -7
- package/dist/lib/browser/react-surface-YCYEFBPM.mjs.map +0 -7
- package/dist/lib/node-esm/app-graph-builder-VCW76Z6V.mjs.map +0 -7
- package/dist/lib/node-esm/call-manager-D6O5ZJJ4.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-2MFNK53T.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-C3XFMUAY.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-GW37AAM4.mjs +0 -23
- package/dist/lib/node-esm/chunk-IHDNQLLR.mjs.map +0 -7
- package/dist/lib/node-esm/intent-resolver-OXGNQ44Y.mjs.map +0 -7
- package/dist/lib/node-esm/markdown-LIJZDK2J.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-IRSEKM42.mjs.map +0 -7
- /package/dist/lib/browser/{ChannelContainer-IY2UIRLF.mjs.map → ChannelContainer-O2SFQJU7.mjs.map} +0 -0
- /package/dist/lib/browser/{ChatContainer-AIGIWAUG.mjs.map → ChatContainer-PVT3DUZJ.mjs.map} +0 -0
- /package/dist/lib/browser/{chunk-4OYAYON2.mjs.map → chunk-2CWJBXBH.mjs.map} +0 -0
- /package/dist/lib/browser/{react-root-X4UIVGTX.mjs.map → react-root-QXPALOUQ.mjs.map} +0 -0
- /package/dist/lib/browser/{settings-E32MTL7A.mjs.map → settings-AC6YSASL.mjs.map} +0 -0
- /package/dist/lib/node-esm/{ChannelContainer-DET6T5N2.mjs.map → ChannelContainer-B2ZGAE4P.mjs.map} +0 -0
- /package/dist/lib/node-esm/{ChatContainer-IQUWU426.mjs.map → ChatContainer-2CT4PJ7I.mjs.map} +0 -0
- /package/dist/lib/node-esm/{chunk-GW37AAM4.mjs.map → chunk-6CRHHOST.mjs.map} +0 -0
- /package/dist/lib/node-esm/{react-root-M7J6PZVW.mjs.map → react-root-7ZFJYVUZ.mjs.map} +0 -0
- /package/dist/lib/node-esm/{settings-SJ24YG7M.mjs.map → settings-N52O7MLS.mjs.map} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/components/ChatContainer.tsx", "../../../src/components/command-extension.ts", "../../../src/components/MessageContainer.tsx", "../../../src/components/CommentsThreadContainer.tsx"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useLayoutEffect, useMemo, useRef, useState } from 'react';\n\nimport { Obj, Ref } from '@dxos/echo';\nimport { type Space, fullyQualifiedId, useMembers } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { Icon, ScrollArea, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport { createBasicExtensions, createThemeExtensions, listener } from '@dxos/react-ui-editor';\nimport { StackItem } from '@dxos/react-ui-stack';\nimport { mx } from '@dxos/react-ui-theme';\nimport {\n MessageTextbox,\n type MessageTextboxProps,\n Thread,\n type ThreadRootProps,\n threadLayout,\n} from '@dxos/react-ui-thread';\nimport { DataType } from '@dxos/schema';\nimport { isNonNullable } from '@dxos/util';\n\nimport { useStatus } from '../hooks';\nimport { meta } from '../meta';\nimport { type ThreadType } from '../types';\nimport { getMessageMetadata } from '../util';\n\nimport { command } from './command-extension';\nimport { MessageContainer } from './MessageContainer';\n\nexport const ChatHeading = ({ attendableId }: { attendableId?: string }) => {\n const { t } = useTranslation(meta.id);\n return (\n <div role='none' className='flex items-center'>\n <StackItem.SigilButton attendableId={attendableId}>\n <Icon icon='ph--chat--regular' size={5} />\n </StackItem.SigilButton>\n <StackItem.HeadingLabel attendableId={attendableId}>{t('chat heading')}</StackItem.HeadingLabel>\n </div>\n );\n};\n\nexport type ChatContainerProps = {\n space: Space;\n thread: ThreadType;\n context?: Obj.Any;\n autoFocusTextbox?: boolean;\n} & Pick<ThreadRootProps, 'current'>;\n\nexport const ChatContainer = ({ space, thread, context, current, autoFocusTextbox }: ChatContainerProps) => {\n const { t } = useTranslation(meta.id);\n const id = fullyQualifiedId(thread);\n const identity = useIdentity()!;\n const members = useMembers(space?.key);\n const activity = useStatus(space, id);\n // TODO(wittjosiah): This is a hack to reset the editor after a message is sent.\n const [_count, _setCount] = useState(0);\n const rerenderEditor = () => _setCount((count) => count + 1);\n const [autoFocus, setAutoFocus] = useState(autoFocusTextbox);\n const threadScrollRef = useRef<HTMLDivElement | null>(null);\n const { themeMode } = useThemeContext();\n\n const textboxMetadata = getMessageMetadata(id, identity);\n const messageRef = useRef('');\n const extensions = useMemo(\n () => [\n createBasicExtensions({ placeholder: t('message placeholder') }),\n createThemeExtensions({ themeMode }),\n listener({ onChange: (text) => (messageRef.current = text) }),\n command,\n ],\n [themeMode, _count],\n );\n\n // TODO(thure): Factor out.\n // TODO(thure): `flex-col-reverse` does not work to start the container scrolled to the end while also using\n // `ScrollArea`. This is the least-bad way I found to scroll to the end on mount. Note that 0ms was insufficient\n // for the desired effect; this is likely hardware-dependent and should be reevaluated.\n const scrollToEnd = (behavior: ScrollBehavior) =>\n setTimeout(() => threadScrollRef.current?.scrollIntoView({ behavior, block: 'end' }), 10);\n\n useLayoutEffect(() => {\n scrollToEnd('instant');\n }, []);\n\n // TODO(burdon): Change to model.\n const handleCreate: MessageTextboxProps['onSend'] = () => {\n if (!messageRef.current?.length) {\n return false;\n }\n\n thread.messages.push(\n Ref.make(\n Obj.make(DataType.Message, {\n created: new Date().toISOString(),\n sender: { identityDid: identity.did },\n blocks: [{ _tag: 'text', text: messageRef.current }],\n properties: context ? { context: Ref.make(context) } : undefined,\n }),\n ),\n );\n\n messageRef.current = '';\n setAutoFocus(true);\n scrollToEnd('smooth');\n rerenderEditor();\n return true;\n };\n\n return (\n <Thread.Root\n current={current}\n id={id}\n classNames='bs-full grid-rows-[1fr_min-content_min-content] overflow-hidden transition-[padding-block-end] [[data-sidebar-inline-start-state=open]_&]:lg:pbe-0'\n >\n <ScrollArea.Root classNames='col-span-2'>\n <ScrollArea.Viewport classNames='overflow-anchored after:overflow-anchor after:block after:bs-px after:-mbs-px [&>div]:min-bs-full [&>div]:!grid [&>div]:grid-rows-[1fr_0]'>\n <div role='none' className={mx(threadLayout, 'place-self-end')}>\n {thread.messages\n .map((message) => message.target)\n .filter(isNonNullable)\n .map((message) => (\n <MessageContainer key={message.id} message={message} members={members} />\n ))}\n </div>\n {/* NOTE(thure): This can’t also be the `overflow-anchor` because `ScrollArea` injects an interceding node that contains this necessary ref’d element. */}\n <div role='none' className='bs-px -mbs-px' ref={threadScrollRef} />\n <ScrollArea.Scrollbar>\n <ScrollArea.Thumb />\n </ScrollArea.Scrollbar>\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n\n <MessageTextbox extensions={extensions} autoFocus={autoFocus} onSend={handleCreate} {...textboxMetadata} />\n\n <Thread.Status activity={activity}>{t('activity message')}</Thread.Status>\n </Thread.Root>\n );\n};\n\nexport default ChatContainer;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { HighlightStyle, StreamLanguage, syntaxHighlighting } from '@codemirror/language';\nimport { type Extension } from '@codemirror/state';\n\nimport { tags } from '@dxos/react-ui-editor';\nimport { mx } from '@dxos/react-ui-theme';\n\n/**\n * https://github.com/codemirror/stream-parser/blob/main/test/test-stream-parser.ts\n */\nconst parser = StreamLanguage.define<{ count: number }>({\n startState: () => ({ count: 0 }),\n token: (stream, state) => {\n state.count++;\n if (stream.eatSpace()) {\n return null;\n }\n if (state.count === 1 && stream.match(/^(\\/\\w+)/)) {\n return 'tagName';\n }\n stream.next();\n return null;\n },\n});\n\nconst styles = HighlightStyle.define([\n { tag: tags.tagName, class: mx('dx-tag dx-tag--indigo text-baseText font-medium') },\n]);\n\nexport const command: Extension = [parser, syntaxHighlighting(styles)];\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { EditorView } from '@codemirror/view';\nimport React, { forwardRef, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { Surface } from '@dxos/app-framework';\nimport { type Obj, Ref, type Type } from '@dxos/echo';\nimport { PublicKey } from '@dxos/react-client';\nimport { type SpaceMember } from '@dxos/react-client/echo';\nimport { type Identity, useIdentity } from '@dxos/react-client/halo';\nimport { IconButton, useOnTransition, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport { createBasicExtensions, createThemeExtensions, useTextEditor } from '@dxos/react-ui-editor';\nimport { hoverableControlItem, hoverableControls, hoverableFocusedWithinControls, mx } from '@dxos/react-ui-theme';\nimport { MessageHeading, MessageRoot } from '@dxos/react-ui-thread';\nimport { type DataType } from '@dxos/schema';\n\nimport { useOnEditAnalytics } from '../hooks';\nimport { meta } from '../meta';\nimport { getMessageMetadata } from '../util';\n\nimport { command } from './command-extension';\nimport { commentControlClassNames } from './CommentsThreadContainer';\n\nexport type MessageContainerProps = {\n message: DataType.Message;\n members: SpaceMember[];\n editable?: boolean;\n onDelete?: (id: string) => void;\n};\n\nexport const MessageContainer = ({ message, members, editable = false, onDelete }: MessageContainerProps) => {\n const { t } = useTranslation(meta.id);\n const senderIdentity = members.find(\n (member) =>\n (message.sender.identityDid && member.identity.did === message.sender.identityDid) ||\n (message.sender.identityKey && PublicKey.equals(member.identity.identityKey, message.sender.identityKey)),\n )?.identity;\n const messageMetadata = getMessageMetadata(message.id, senderIdentity);\n const userIsAuthor = useIdentity()?.did === messageMetadata.authorId;\n const [editing, setEditing] = useState(false);\n const handleDelete = useCallback(() => onDelete?.(message.id), [message, onDelete]);\n const textBlock = message.blocks.find((block) => block._tag === 'text');\n const references = message.blocks.filter((block) => block._tag === 'reference').map((block) => block.reference);\n\n useOnEditAnalytics(message, textBlock, !!editing);\n\n return (\n <MessageRoot {...messageMetadata} classNames={[hoverableControls, hoverableFocusedWithinControls]}>\n <MessageHeading authorName={messageMetadata.authorName} timestamp={messageMetadata.timestamp}>\n <div className='flex flex-row items-center gap-0.5'>\n {userIsAuthor && editable && (\n <IconButton\n data-testid={editing ? 'thread.message.save' : 'thread.message.edit'}\n variant='ghost'\n icon={editing ? 'ph--check--regular' : 'ph--pencil-simple--regular'}\n iconOnly\n label={t(editing ? 'save message label' : 'edit message label')}\n classNames={[commentControlClassNames, hoverableControlItem]}\n onClick={() => setEditing((editing) => !editing)}\n />\n )}\n {onDelete && (\n <IconButton\n data-testid='thread.message.delete'\n variant='ghost'\n icon='ph--x--regular'\n iconOnly\n label={t('delete message label')}\n classNames={[commentControlClassNames, hoverableControlItem]}\n onClick={() => handleDelete()}\n />\n )}\n </div>\n </MessageHeading>\n {textBlock && <TextboxBlock block={textBlock} isAuthor={userIsAuthor} editing={editing} />}\n {Ref.Array.targets(references).map((reference, index) => (\n <MessagePart key={index} part={reference} />\n ))}\n </MessageRoot>\n );\n};\n\nconst MessagePart = ({ part }: { part: Type.Expando }) => {\n return <MessageBlockObjectTile subject={part} />;\n};\n\nconst TextboxBlock = ({\n block,\n isAuthor,\n editing,\n}: {\n block: DataType.MessageBlock.Text;\n editing?: boolean;\n isAuthor?: boolean;\n identity?: Identity;\n}) => {\n const { themeMode } = useThemeContext();\n const inMemoryContentRef = useRef(block.text);\n\n const handleDocumentChange = useCallback((newState: string) => {\n inMemoryContentRef.current = newState;\n }, []);\n\n const saveDocumentChange = useCallback(() => {\n block.text = inMemoryContentRef.current;\n }, [block]);\n\n useOnTransition(editing, true, false, saveDocumentChange);\n\n const { parentRef, focusAttributes, view } = useTextEditor(\n () => ({\n initialValue: block.text,\n extensions: [\n createBasicExtensions({ readOnly: !isAuthor || !editing }),\n createThemeExtensions({ themeMode }),\n command,\n EditorView.updateListener.of((update) => {\n if (update.docChanged) {\n handleDocumentChange(update.state.doc.toString());\n }\n }),\n ],\n }),\n [block.text, editing, isAuthor, themeMode, handleDocumentChange],\n );\n\n useEffect(() => {\n editing && view?.focus();\n }, [editing, view]);\n\n return <div role='none' ref={parentRef} className='mie-4' {...focusAttributes} />;\n};\n\nconst MessageBlockObjectTile = forwardRef<HTMLDivElement, { subject: Obj.Any }>(({ subject }, forwardedRef) => {\n // TODO(burdon): Use annotation to get title.\n let title = (subject as any).name ?? (subject as any).title ?? (subject as any).type ?? 'Object';\n if (typeof title !== 'string') {\n title = title?.content ?? '';\n }\n\n return (\n <div\n role='group'\n className={mx('grid col-span-3 py-1 pr-4', hoverableControls, hoverableFocusedWithinControls)}\n ref={forwardedRef}\n >\n <Surface role='card' limit={1} data={{ subject }} fallback={title} />\n </div>\n );\n});\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useCallback, useMemo, useRef, useState } from 'react';\n\nimport { Ref, Relation } from '@dxos/echo';\nimport { fullyQualifiedId, getSpace, useMembers } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { IconButton, Tag, Tooltip, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport { createBasicExtensions, createThemeExtensions, listener } from '@dxos/react-ui-editor';\nimport { hoverableControlItem, hoverableControls, hoverableFocusedWithinControls, mx } from '@dxos/react-ui-theme';\nimport { MessageTextbox, type MessageTextboxProps, Thread, type ThreadRootProps } from '@dxos/react-ui-thread';\nimport { type AnchoredTo } from '@dxos/schema';\nimport { isNonNullable } from '@dxos/util';\n\nimport { useStatus } from '../hooks';\nimport { meta } from '../meta';\nimport { type ThreadType } from '../types';\nimport { getMessageMetadata } from '../util';\n\nimport { command } from './command-extension';\nimport { MessageContainer } from './MessageContainer';\n\n// TODO(burdon): Remove need for p-1.\nexport const commentControlClassNames = '!p-1 transition-opacity';\n\nexport type CommentsThreadContainerProps = {\n anchor: AnchoredTo;\n onAttend?: (anchor: AnchoredTo) => void;\n onComment?: (anchor: AnchoredTo, message: string) => void;\n onResolve?: (anchor: AnchoredTo) => void;\n onMessageDelete?: (anchor: AnchoredTo, messageId: string) => void;\n onThreadDelete?: (anchor: AnchoredTo) => void;\n} & Pick<ThreadRootProps, 'current'>;\n\nexport const CommentsThreadContainer = ({\n anchor,\n current,\n onAttend,\n onComment,\n onResolve,\n onMessageDelete,\n onThreadDelete,\n}: CommentsThreadContainerProps) => {\n const { t } = useTranslation(meta.id);\n const identity = useIdentity()!;\n const space = getSpace(anchor);\n const members = useMembers(space?.key);\n const detached = !anchor.anchor;\n const thread = Relation.getSource(anchor) as ThreadType;\n const activity = useStatus(space, fullyQualifiedId(thread));\n const threadScrollRef = useRef<HTMLDivElement | null>(null);\n const { themeMode } = useThemeContext();\n\n const textboxMetadata = getMessageMetadata(fullyQualifiedId(thread), identity);\n // TODO(wittjosiah): This is a hack to reset the editor after a message is sent.\n const [_count, _setCount] = useState(0);\n const rerenderEditor = () => _setCount((count) => count + 1);\n const messageRef = useRef('');\n const extensions = useMemo(\n () => [\n createBasicExtensions({ placeholder: t('message placeholder') }),\n createThemeExtensions({ themeMode }),\n listener({ onChange: (text) => (messageRef.current = text) }),\n command,\n ],\n [_count],\n );\n\n // TODO(thure): Factor out.\n const scrollToEnd = (behavior: ScrollBehavior) =>\n setTimeout(() => threadScrollRef.current?.scrollIntoView({ behavior, block: 'end' }), 10);\n\n const handleAttend = useCallback(() => onAttend?.(anchor), [onAttend, anchor]);\n const handleResolve = useCallback(() => onResolve?.(anchor), [onResolve, anchor]);\n const handleMessageDelete = useCallback((id: string) => onMessageDelete?.(anchor, id), [onMessageDelete, anchor]);\n const handleThreadDelete = useCallback(() => onThreadDelete?.(anchor), [onThreadDelete, anchor]);\n\n const handleComment: MessageTextboxProps['onSend'] = useCallback(() => {\n if (!messageRef.current) {\n return false;\n }\n\n onComment?.(anchor, messageRef.current);\n messageRef.current = '';\n scrollToEnd('instant');\n rerenderEditor();\n\n return true;\n }, [anchor, identity]);\n\n return (\n <Thread.Root\n id={fullyQualifiedId(thread)}\n classNames='pbs-2 border-be border-subduedSeparator last:border-none'\n current={current}\n onClickCapture={handleAttend}\n onFocusCapture={handleAttend}\n >\n <div\n role='none'\n className={mx(\n 'col-span-2 grid grid-cols-[var(--rail-size)_1fr_min-content]',\n hoverableControls,\n hoverableFocusedWithinControls,\n )}\n >\n {detached ? (\n <Tooltip.Trigger asChild content={t('detached thread label')} side='top'>\n <Thread.Header detached>{thread.name}</Thread.Header>\n </Tooltip.Trigger>\n ) : (\n <Thread.Header>{thread.name}</Thread.Header>\n )}\n <div className='flex flex-row items-center gap-0.5'>\n {thread.status === 'staged' && <Tag palette='neutral'>{t('draft button')}</Tag>}\n {onResolve && !(thread?.status === 'staged') && (\n <IconButton\n data-testid='thread.resolve'\n variant='ghost'\n icon={thread?.status === 'resolved' ? 'ph--check--fill' : 'ph--check--regular'}\n iconOnly\n label={t('resolve thread label')}\n classNames={[commentControlClassNames, thread?.status !== 'resolved' && hoverableControlItem]}\n onClick={handleResolve}\n />\n )}\n {onThreadDelete && (\n <IconButton\n data-testid='thread.delete'\n variant='ghost'\n icon='ph--x--regular'\n iconOnly\n label={t('delete thread label')}\n classNames={[commentControlClassNames, hoverableControlItem]}\n onClick={handleThreadDelete}\n />\n )}\n </div>\n </div>\n\n {/** TODO(dmaretskyi): How's `thread.messages` undefined? */}\n {Ref.Array.targets(thread.messages?.filter(isNonNullable) ?? []).map((message) => (\n <MessageContainer\n key={message.id}\n editable\n message={message}\n members={members}\n onDelete={handleMessageDelete}\n />\n ))}\n\n {/*\n TODO(wittjosiah): Can't autofocus this generally.\n There can be multiple threads with inputs and they can't all be focused.\n Also, it steals focus from documents when first rendered.\n Need to find a way to autofocus in one scenario only: when a new thread is created.\n */}\n <MessageTextbox extensions={extensions} onSend={handleComment} {...textboxMetadata} />\n\n <Thread.Status activity={activity}>{t('activity message')}</Thread.Status>\n\n {/* NOTE(thure): This can’t also be the `overflow-anchor` because `ScrollArea` injects an interceding node that contains this necessary ref’d element. */}\n <div role='none' className='bs-px -mbs-px' ref={threadScrollRef} />\n </Thread.Root>\n );\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["React", "useLayoutEffect", "useMemo", "useRef", "useState", "Obj", "Ref", "fullyQualifiedId", "useMembers", "useIdentity", "Icon", "ScrollArea", "useThemeContext", "useTranslation", "createBasicExtensions", "createThemeExtensions", "listener", "StackItem", "mx", "MessageTextbox", "Thread", "threadLayout", "DataType", "isNonNullable", "HighlightStyle", "StreamLanguage", "syntaxHighlighting", "tags", "mx", "parser", "StreamLanguage", "define", "startState", "count", "token", "stream", "state", "eatSpace", "match", "next", "styles", "HighlightStyle", "tag", "tags", "tagName", "class", "mx", "command", "syntaxHighlighting", "EditorView", "React", "forwardRef", "useCallback", "useEffect", "useRef", "useState", "Surface", "Ref", "PublicKey", "useIdentity", "IconButton", "useOnTransition", "useThemeContext", "useTranslation", "createBasicExtensions", "createThemeExtensions", "useTextEditor", "hoverableControlItem", "hoverableControls", "hoverableFocusedWithinControls", "mx", "MessageHeading", "MessageRoot", "React", "useCallback", "useMemo", "useRef", "useState", "Ref", "Relation", "fullyQualifiedId", "getSpace", "useMembers", "useIdentity", "IconButton", "Tag", "Tooltip", "useThemeContext", "useTranslation", "createBasicExtensions", "createThemeExtensions", "listener", "hoverableControlItem", "hoverableControls", "hoverableFocusedWithinControls", "mx", "MessageTextbox", "Thread", "isNonNullable", "commentControlClassNames", "CommentsThreadContainer", "anchor", "current", "onAttend", "onComment", "onResolve", "onMessageDelete", "onThreadDelete", "t", "useTranslation", "meta", "id", "identity", "useIdentity", "space", "getSpace", "members", "useMembers", "key", "detached", "thread", "Relation", "getSource", "activity", "useStatus", "fullyQualifiedId", "threadScrollRef", "useRef", "themeMode", "useThemeContext", "textboxMetadata", "getMessageMetadata", "_count", "_setCount", "useState", "rerenderEditor", "count", "messageRef", "extensions", "useMemo", "createBasicExtensions", "placeholder", "createThemeExtensions", "listener", "onChange", "text", "command", "scrollToEnd", "behavior", "setTimeout", "scrollIntoView", "block", "handleAttend", "useCallback", "handleResolve", "handleMessageDelete", "handleThreadDelete", "handleComment", "Thread", "Root", "classNames", "onClickCapture", "onFocusCapture", "div", "role", "className", "mx", "hoverableControls", "hoverableFocusedWithinControls", "Tooltip", "Trigger", "asChild", "content", "side", "Header", "name", "status", "Tag", "palette", "IconButton", "data-testid", "variant", "icon", "iconOnly", "label", "hoverableControlItem", "onClick", "Ref", "Array", "targets", "messages", "filter", "isNonNullable", "map", "message", "MessageContainer", "editable", "onDelete", "MessageTextbox", "onSend", "Status", "ref", "MessageContainer", "message", "members", "editable", "onDelete", "t", "useTranslation", "meta", "id", "senderIdentity", "find", "member", "sender", "identityDid", "identity", "did", "identityKey", "PublicKey", "equals", "messageMetadata", "getMessageMetadata", "userIsAuthor", "useIdentity", "authorId", "editing", "setEditing", "useState", "handleDelete", "useCallback", "textBlock", "blocks", "block", "_tag", "references", "filter", "map", "reference", "useOnEditAnalytics", "React", "MessageRoot", "classNames", "hoverableControls", "hoverableFocusedWithinControls", "MessageHeading", "authorName", "timestamp", "div", "className", "IconButton", "data-testid", "variant", "icon", "iconOnly", "label", "commentControlClassNames", "hoverableControlItem", "onClick", "TextboxBlock", "isAuthor", "Ref", "Array", "targets", "index", "MessagePart", "key", "part", "MessageBlockObjectTile", "subject", "themeMode", "useThemeContext", "inMemoryContentRef", "useRef", "text", "handleDocumentChange", "newState", "current", "saveDocumentChange", "useOnTransition", "parentRef", "focusAttributes", "view", "useTextEditor", "initialValue", "extensions", "createBasicExtensions", "readOnly", "createThemeExtensions", "command", "EditorView", "updateListener", "of", "update", "docChanged", "state", "doc", "toString", "useEffect", "focus", "role", "ref", "forwardRef", "forwardedRef", "title", "name", "type", "content", "mx", "Surface", "limit", "data", "fallback", "ChatHeading", "attendableId", "t", "useTranslation", "meta", "id", "React", "div", "role", "className", "StackItem", "SigilButton", "Icon", "icon", "size", "HeadingLabel", "ChatContainer", "space", "thread", "context", "current", "autoFocusTextbox", "fullyQualifiedId", "identity", "useIdentity", "members", "useMembers", "key", "activity", "useStatus", "_count", "_setCount", "useState", "rerenderEditor", "count", "autoFocus", "setAutoFocus", "threadScrollRef", "useRef", "themeMode", "useThemeContext", "textboxMetadata", "getMessageMetadata", "messageRef", "extensions", "useMemo", "createBasicExtensions", "placeholder", "createThemeExtensions", "listener", "onChange", "text", "command", "scrollToEnd", "behavior", "setTimeout", "scrollIntoView", "block", "useLayoutEffect", "handleCreate", "length", "messages", "push", "Ref", "make", "Obj", "DataType", "Message", "created", "Date", "toISOString", "sender", "identityDid", "did", "blocks", "_tag", "properties", "undefined", "Thread", "Root", "classNames", "ScrollArea", "Viewport", "mx", "threadLayout", "map", "message", "target", "filter", "isNonNullable", "MessageContainer", "ref", "Scrollbar", "Thumb", "MessageTextbox", "onSend", "Status"]
|
|
7
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/calls/util/stub-media-streams.ts
|
|
2
|
-
import {
|
|
2
|
+
import { scheduleTaskInterval, waitForCondition } from "@dxos/async";
|
|
3
3
|
import { cancelWithContext } from "@dxos/context";
|
|
4
4
|
import { invariant } from "@dxos/invariant";
|
|
5
5
|
var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-thread/src/calls/util/stub-media-streams.ts";
|
|
@@ -53,4 +53,4 @@ export {
|
|
|
53
53
|
createBlackCanvasStreamTrack,
|
|
54
54
|
createInaudibleAudioStreamTrack
|
|
55
55
|
};
|
|
56
|
-
//# sourceMappingURL=chunk-
|
|
56
|
+
//# sourceMappingURL=chunk-JGKMMI65.mjs.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/calls/util/stub-media-streams.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n//\n\nimport {
|
|
5
|
-
"mappings": ";AAKA,SAASA,
|
|
6
|
-
"names": ["
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n//\n\nimport { scheduleTaskInterval, waitForCondition } from '@dxos/async';\nimport { type Context, cancelWithContext } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\n\n/**\n * Creates a black canvas stream track.\n * We need this to to have black rectangle video that is live (have frames) when video feed is disabled.\n */\nexport const createBlackCanvasStreamTrack = async ({\n ctx,\n width,\n height,\n}: {\n ctx: Context;\n width: number;\n height: number;\n}): Promise<MediaStreamTrack> => {\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n\n const canvasCtx = canvas.getContext('2d');\n invariant(canvasCtx);\n const drawFrame = () => {\n canvasCtx.fillStyle = 'black';\n canvasCtx.fillRect(0, 0, canvas.width, canvas.height);\n };\n scheduleTaskInterval(ctx, async () => drawFrame(), 1_000);\n\n const track = canvas.captureStream().getVideoTracks()[0];\n drawFrame();\n\n await cancelWithContext(ctx, waitForCondition({ condition: () => track.readyState === 'live', timeout: 1_000 }));\n\n return track;\n};\n\n/**\n * Creates an inaudible audio stream track.\n * We need this to have audio track available when audio is disabled.\n */\nexport const createInaudibleAudioStreamTrack = async ({ ctx }: { ctx: Context }): Promise<MediaStreamTrack> => {\n const audioContext = new window.AudioContext();\n const oscillator = audioContext.createOscillator();\n oscillator.type = 'triangle';\n // roughly sounds like a box fan\n oscillator.frequency.setValueAtTime(20, audioContext.currentTime);\n\n const gainNode = audioContext.createGain();\n // even w/ gain at 0 some packets are sent\n gainNode.gain.setValueAtTime(0.02, audioContext.currentTime);\n oscillator.connect(gainNode);\n\n const destination = audioContext.createMediaStreamDestination();\n gainNode.connect(destination);\n oscillator.start();\n\n ctx.onDispose(async () => {\n oscillator.disconnect();\n oscillator.stop();\n await audioContext.close();\n });\n\n return destination.stream.getAudioTracks()[0];\n};\n"],
|
|
5
|
+
"mappings": ";AAKA,SAASA,sBAAsBC,wBAAwB;AACvD,SAAuBC,yBAAyB;AAChD,SAASC,iBAAiB;;AAMnB,IAAMC,+BAA+B,OAAO,EACjDC,KACAC,OACAC,OAAM,MAKP;AACC,QAAMC,SAASC,SAASC,cAAc,QAAA;AACtCF,SAAOF,QAAQA;AACfE,SAAOD,SAASA;AAEhB,QAAMI,YAAYH,OAAOI,WAAW,IAAA;AACpCT,YAAUQ,WAAAA,QAAAA;;;;;;;;;AACV,QAAME,YAAY,MAAA;AAChBF,cAAUG,YAAY;AACtBH,cAAUI,SAAS,GAAG,GAAGP,OAAOF,OAAOE,OAAOD,MAAM;EACtD;AACAP,uBAAqBK,KAAK,YAAYQ,UAAAA,GAAa,GAAA;AAEnD,QAAMG,QAAQR,OAAOS,cAAa,EAAGC,eAAc,EAAG,CAAA;AACtDL,YAAAA;AAEA,QAAMX,kBAAkBG,KAAKJ,iBAAiB;IAAEkB,WAAW,MAAMH,MAAMI,eAAe;IAAQC,SAAS;EAAM,CAAA,CAAA;AAE7G,SAAOL;AACT;AAMO,IAAMM,kCAAkC,OAAO,EAAEjB,IAAG,MAAoB;AAC7E,QAAMkB,eAAe,IAAIC,OAAOC,aAAY;AAC5C,QAAMC,aAAaH,aAAaI,iBAAgB;AAChDD,aAAWE,OAAO;AAElBF,aAAWG,UAAUC,eAAe,IAAIP,aAAaQ,WAAW;AAEhE,QAAMC,WAAWT,aAAaU,WAAU;AAExCD,WAASE,KAAKJ,eAAe,MAAMP,aAAaQ,WAAW;AAC3DL,aAAWS,QAAQH,QAAAA;AAEnB,QAAMI,cAAcb,aAAac,6BAA4B;AAC7DL,WAASG,QAAQC,WAAAA;AACjBV,aAAWY,MAAK;AAEhBjC,MAAIkC,UAAU,YAAA;AACZb,eAAWc,WAAU;AACrBd,eAAWe,KAAI;AACf,UAAMlB,aAAamB,MAAK;EAC1B,CAAA;AAEA,SAAON,YAAYO,OAAOC,eAAc,EAAG,CAAA;AAC7C;",
|
|
6
|
+
"names": ["scheduleTaskInterval", "waitForCondition", "cancelWithContext", "invariant", "createBlackCanvasStreamTrack", "ctx", "width", "height", "canvas", "document", "createElement", "canvasCtx", "getContext", "drawFrame", "fillStyle", "fillRect", "track", "captureStream", "getVideoTracks", "condition", "readyState", "timeout", "createInaudibleAudioStreamTrack", "audioContext", "window", "AudioContext", "oscillator", "createOscillator", "type", "frequency", "setValueAtTime", "currentTime", "gainNode", "createGain", "gain", "connect", "destination", "createMediaStreamDestination", "start", "onDispose", "disconnect", "stop", "close", "stream", "getAudioTracks"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createBlackCanvasStreamTrack,
|
|
3
3
|
createInaudibleAudioStreamTrack
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-JGKMMI65.mjs";
|
|
5
5
|
|
|
6
6
|
// src/calls/types.ts
|
|
7
7
|
import { buf } from "@dxos/protocols/buf";
|
|
@@ -50,19 +50,20 @@ function _ts_decorate(decorators, target, key, desc) {
|
|
|
50
50
|
var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-thread/src/calls/call-swarm-synchronizer.ts";
|
|
51
51
|
var DISCONNECTED_ABRUPT_TIMEOUT = 1e4;
|
|
52
52
|
var CallSwarmSynchronizer = class extends Resource {
|
|
53
|
+
stateUpdated = new Event();
|
|
54
|
+
_state = {
|
|
55
|
+
activities: {}
|
|
56
|
+
};
|
|
57
|
+
_networkService;
|
|
58
|
+
_lastSwarmEvent = void 0;
|
|
59
|
+
_reconcileSwarmStateTask = void 0;
|
|
60
|
+
_identityKey = void 0;
|
|
61
|
+
_deviceKey = void 0;
|
|
62
|
+
_displayName = void 0;
|
|
63
|
+
_swarmCtx = void 0;
|
|
64
|
+
_sendStateTask = void 0;
|
|
53
65
|
constructor({ networkService }) {
|
|
54
66
|
super();
|
|
55
|
-
this.stateUpdated = new Event();
|
|
56
|
-
this._state = {
|
|
57
|
-
activities: {}
|
|
58
|
-
};
|
|
59
|
-
this._lastSwarmEvent = void 0;
|
|
60
|
-
this._reconcileSwarmStateTask = void 0;
|
|
61
|
-
this._identityKey = void 0;
|
|
62
|
-
this._deviceKey = void 0;
|
|
63
|
-
this._displayName = void 0;
|
|
64
|
-
this._swarmCtx = void 0;
|
|
65
|
-
this._sendStateTask = void 0;
|
|
66
67
|
this._networkService = networkService;
|
|
67
68
|
}
|
|
68
69
|
/**
|
|
@@ -410,6 +411,8 @@ import { log as log2 } from "@dxos/log";
|
|
|
410
411
|
|
|
411
412
|
// src/calls/util/history-cache.ts
|
|
412
413
|
var HistoryCache = class {
|
|
414
|
+
_limit;
|
|
415
|
+
_messages;
|
|
413
416
|
constructor(limit = 100) {
|
|
414
417
|
this._limit = limit;
|
|
415
418
|
this._messages = [];
|
|
@@ -486,17 +489,18 @@ var BulkRequestDispatcher = class {
|
|
|
486
489
|
var __dxlog_file2 = "/__w/dxos/dxos/packages/plugins/plugin-thread/src/calls/util/calls-service.ts";
|
|
487
490
|
var NETWORK_TIMEOUT = 5e3;
|
|
488
491
|
var CallsServicePeer = class extends Resource2 {
|
|
492
|
+
history = new HistoryCache(100);
|
|
493
|
+
_persistentLifecycle = new PersistentLifecycle({
|
|
494
|
+
start: () => this._startSession(),
|
|
495
|
+
stop: (session) => this._stopSession(session)
|
|
496
|
+
});
|
|
497
|
+
_config;
|
|
498
|
+
taskScheduler = new FIFOScheduler();
|
|
499
|
+
pushTrackDispatcher = new BulkRequestDispatcher(32);
|
|
500
|
+
pullTrackDispatcher = new BulkRequestDispatcher(32);
|
|
501
|
+
closeTrackDispatcher = new BulkRequestDispatcher(32);
|
|
489
502
|
constructor(config) {
|
|
490
503
|
super();
|
|
491
|
-
this.history = new HistoryCache(100);
|
|
492
|
-
this._persistentLifecycle = new PersistentLifecycle({
|
|
493
|
-
start: () => this._startSession(),
|
|
494
|
-
stop: (session) => this._stopSession(session)
|
|
495
|
-
});
|
|
496
|
-
this.taskScheduler = new FIFOScheduler();
|
|
497
|
-
this.pushTrackDispatcher = new BulkRequestDispatcher(32);
|
|
498
|
-
this.pullTrackDispatcher = new BulkRequestDispatcher(32);
|
|
499
|
-
this.closeTrackDispatcher = new BulkRequestDispatcher(32);
|
|
500
504
|
this._config = config;
|
|
501
505
|
}
|
|
502
506
|
async _open(ctx) {
|
|
@@ -530,7 +534,7 @@ var CallsServicePeer = class extends Resource2 {
|
|
|
530
534
|
state: peerConnection.connectionState
|
|
531
535
|
}, {
|
|
532
536
|
F: __dxlog_file2,
|
|
533
|
-
L:
|
|
537
|
+
L: 119,
|
|
534
538
|
S: this,
|
|
535
539
|
C: (f, a) => f(...a)
|
|
536
540
|
});
|
|
@@ -545,7 +549,7 @@ var CallsServicePeer = class extends Resource2 {
|
|
|
545
549
|
state: peerConnection.iceConnectionState
|
|
546
550
|
}, {
|
|
547
551
|
F: __dxlog_file2,
|
|
548
|
-
L:
|
|
552
|
+
L: 128,
|
|
549
553
|
S: this,
|
|
550
554
|
C: (f, a) => f(...a)
|
|
551
555
|
});
|
|
@@ -556,7 +560,7 @@ var CallsServicePeer = class extends Resource2 {
|
|
|
556
560
|
if (peerConnection.iceConnectionState === "connected") {
|
|
557
561
|
log2.info("calls iceConnectionState is connected", void 0, {
|
|
558
562
|
F: __dxlog_file2,
|
|
559
|
-
L:
|
|
563
|
+
L: 137,
|
|
560
564
|
S: this,
|
|
561
565
|
C: (f, a) => f(...a)
|
|
562
566
|
});
|
|
@@ -567,7 +571,7 @@ var CallsServicePeer = class extends Resource2 {
|
|
|
567
571
|
timeoutSeconds
|
|
568
572
|
}, {
|
|
569
573
|
F: __dxlog_file2,
|
|
570
|
-
L:
|
|
574
|
+
L: 141,
|
|
571
575
|
S: this,
|
|
572
576
|
C: (f, a) => f(...a)
|
|
573
577
|
});
|
|
@@ -580,7 +584,7 @@ var CallsServicePeer = class extends Resource2 {
|
|
|
580
584
|
async _initiateCallSession() {
|
|
581
585
|
log2("creating new session", void 0, {
|
|
582
586
|
F: __dxlog_file2,
|
|
583
|
-
L:
|
|
587
|
+
L: 151,
|
|
584
588
|
S: this,
|
|
585
589
|
C: (f, a) => f(...a)
|
|
586
590
|
});
|
|
@@ -606,7 +610,7 @@ var CallsServicePeer = class extends Resource2 {
|
|
|
606
610
|
text: await response.text()
|
|
607
611
|
}, {
|
|
608
612
|
F: __dxlog_file2,
|
|
609
|
-
L:
|
|
613
|
+
L: 166,
|
|
610
614
|
S: this,
|
|
611
615
|
C: (f, a) => f(...a)
|
|
612
616
|
});
|
|
@@ -638,7 +642,7 @@ var CallsServicePeer = class extends Resource2 {
|
|
|
638
642
|
status: response.status
|
|
639
643
|
}, {
|
|
640
644
|
F: __dxlog_file2,
|
|
641
|
-
L:
|
|
645
|
+
L: 191,
|
|
642
646
|
S: this,
|
|
643
647
|
C: (f, a) => f(...a)
|
|
644
648
|
});
|
|
@@ -648,7 +652,7 @@ var CallsServicePeer = class extends Resource2 {
|
|
|
648
652
|
async _pushTrackInBulk({ ctx, peerConnection, transceiver, sessionId, trackName }) {
|
|
649
653
|
log2.verbose("pushing track ", trackName, {
|
|
650
654
|
F: __dxlog_file2,
|
|
651
|
-
L:
|
|
655
|
+
L: 213,
|
|
652
656
|
S: this,
|
|
653
657
|
C: (f, a) => f(...a)
|
|
654
658
|
});
|
|
@@ -675,7 +679,7 @@ var CallsServicePeer = class extends Resource2 {
|
|
|
675
679
|
});
|
|
676
680
|
invariant2(response.tracks !== void 0, void 0, {
|
|
677
681
|
F: __dxlog_file2,
|
|
678
|
-
L:
|
|
682
|
+
L: 238,
|
|
679
683
|
S: this,
|
|
680
684
|
A: [
|
|
681
685
|
"response.tracks !== undefined",
|
|
@@ -700,7 +704,7 @@ var CallsServicePeer = class extends Resource2 {
|
|
|
700
704
|
} else {
|
|
701
705
|
log2.error("missing track data", void 0, {
|
|
702
706
|
F: __dxlog_file2,
|
|
703
|
-
L:
|
|
707
|
+
L: 258,
|
|
704
708
|
S: this,
|
|
705
709
|
C: (f, a) => f(...a)
|
|
706
710
|
});
|
|
@@ -708,7 +712,7 @@ var CallsServicePeer = class extends Resource2 {
|
|
|
708
712
|
}).catch((err) => {
|
|
709
713
|
log2.catch(err, void 0, {
|
|
710
714
|
F: __dxlog_file2,
|
|
711
|
-
L:
|
|
715
|
+
L: 262,
|
|
712
716
|
S: this,
|
|
713
717
|
C: (f, a) => f(...a)
|
|
714
718
|
});
|
|
@@ -726,7 +730,7 @@ var CallsServicePeer = class extends Resource2 {
|
|
|
726
730
|
await this.waitUntilOpen();
|
|
727
731
|
invariant2(this.session, void 0, {
|
|
728
732
|
F: __dxlog_file2,
|
|
729
|
-
L:
|
|
733
|
+
L: 289,
|
|
730
734
|
S: this,
|
|
731
735
|
A: [
|
|
732
736
|
"this.session",
|
|
@@ -739,7 +743,7 @@ var CallsServicePeer = class extends Resource2 {
|
|
|
739
743
|
encodings
|
|
740
744
|
}, {
|
|
741
745
|
F: __dxlog_file2,
|
|
742
|
-
L:
|
|
746
|
+
L: 290,
|
|
743
747
|
S: this,
|
|
744
748
|
C: (f, a) => f(...a)
|
|
745
749
|
});
|
|
@@ -752,7 +756,7 @@ var CallsServicePeer = class extends Resource2 {
|
|
|
752
756
|
transceiver: transceiver2
|
|
753
757
|
}, {
|
|
754
758
|
F: __dxlog_file2,
|
|
755
|
-
L:
|
|
759
|
+
L: 294,
|
|
756
760
|
S: this,
|
|
757
761
|
C: (f, a) => f(...a)
|
|
758
762
|
});
|
|
@@ -764,13 +768,13 @@ var CallsServicePeer = class extends Resource2 {
|
|
|
764
768
|
transceiver: transceiver2
|
|
765
769
|
}, {
|
|
766
770
|
F: __dxlog_file2,
|
|
767
|
-
L:
|
|
771
|
+
L: 297,
|
|
768
772
|
S: this,
|
|
769
773
|
C: (f, a) => f(...a)
|
|
770
774
|
});
|
|
771
775
|
transceiver2.sender.replaceTrack(track).catch((err) => log2.catch(err, void 0, {
|
|
772
776
|
F: __dxlog_file2,
|
|
773
|
-
L:
|
|
777
|
+
L: 298,
|
|
774
778
|
S: this,
|
|
775
779
|
C: (f, a) => f(...a)
|
|
776
780
|
}));
|
|
@@ -779,7 +783,7 @@ var CallsServicePeer = class extends Resource2 {
|
|
|
779
783
|
}
|
|
780
784
|
invariant2(track, void 0, {
|
|
781
785
|
F: __dxlog_file2,
|
|
782
|
-
L:
|
|
786
|
+
L: 302,
|
|
783
787
|
S: this,
|
|
784
788
|
A: [
|
|
785
789
|
"track",
|
|
@@ -792,7 +796,7 @@ var CallsServicePeer = class extends Resource2 {
|
|
|
792
796
|
});
|
|
793
797
|
log2.verbose("creating transceiver", void 0, {
|
|
794
798
|
F: __dxlog_file2,
|
|
795
|
-
L:
|
|
799
|
+
L: 307,
|
|
796
800
|
S: this,
|
|
797
801
|
C: (f, a) => f(...a)
|
|
798
802
|
});
|
|
@@ -805,7 +809,7 @@ var CallsServicePeer = class extends Resource2 {
|
|
|
805
809
|
});
|
|
806
810
|
invariant2(pushedTrackData, void 0, {
|
|
807
811
|
F: __dxlog_file2,
|
|
808
|
-
L:
|
|
812
|
+
L: 316,
|
|
809
813
|
S: this,
|
|
810
814
|
A: [
|
|
811
815
|
"pushedTrackData",
|
|
@@ -822,7 +826,7 @@ var CallsServicePeer = class extends Resource2 {
|
|
|
822
826
|
});
|
|
823
827
|
transceiver.sender.setParameters(parameters).catch((err) => log2.catch(err, void 0, {
|
|
824
828
|
F: __dxlog_file2,
|
|
825
|
-
L:
|
|
829
|
+
L: 323,
|
|
826
830
|
S: this,
|
|
827
831
|
C: (f, a) => f(...a)
|
|
828
832
|
}));
|
|
@@ -835,7 +839,7 @@ var CallsServicePeer = class extends Resource2 {
|
|
|
835
839
|
trackName: trackData.trackName
|
|
836
840
|
}, {
|
|
837
841
|
F: __dxlog_file2,
|
|
838
|
-
L:
|
|
842
|
+
L: 341,
|
|
839
843
|
S: this,
|
|
840
844
|
C: (f, a) => f(...a)
|
|
841
845
|
});
|
|
@@ -851,7 +855,7 @@ var CallsServicePeer = class extends Resource2 {
|
|
|
851
855
|
}
|
|
852
856
|
invariant2(newTrackResponse.tracks, void 0, {
|
|
853
857
|
F: __dxlog_file2,
|
|
854
|
-
L:
|
|
858
|
+
L: 354,
|
|
855
859
|
S: this,
|
|
856
860
|
A: [
|
|
857
861
|
"newTrackResponse.tracks",
|
|
@@ -898,7 +902,7 @@ var CallsServicePeer = class extends Resource2 {
|
|
|
898
902
|
return track;
|
|
899
903
|
}).catch((err) => log2.catch(err, void 0, {
|
|
900
904
|
F: __dxlog_file2,
|
|
901
|
-
L:
|
|
905
|
+
L: 406,
|
|
902
906
|
S: this,
|
|
903
907
|
C: (f, a) => f(...a)
|
|
904
908
|
}));
|
|
@@ -908,7 +912,7 @@ var CallsServicePeer = class extends Resource2 {
|
|
|
908
912
|
availableTracks: Array.from(trackMap.keys())
|
|
909
913
|
}, {
|
|
910
914
|
F: __dxlog_file2,
|
|
911
|
-
L:
|
|
915
|
+
L: 408,
|
|
912
916
|
S: this,
|
|
913
917
|
C: (f, a) => f(...a)
|
|
914
918
|
});
|
|
@@ -918,7 +922,7 @@ var CallsServicePeer = class extends Resource2 {
|
|
|
918
922
|
if (mid) {
|
|
919
923
|
log2("closing pulled track ", trackData.trackName, {
|
|
920
924
|
F: __dxlog_file2,
|
|
921
|
-
L:
|
|
925
|
+
L: 414,
|
|
922
926
|
S: this,
|
|
923
927
|
C: (f, a) => f(...a)
|
|
924
928
|
});
|
|
@@ -934,7 +938,7 @@ var CallsServicePeer = class extends Resource2 {
|
|
|
934
938
|
await this.waitUntilOpen();
|
|
935
939
|
invariant2(this.session, void 0, {
|
|
936
940
|
F: __dxlog_file2,
|
|
937
|
-
L:
|
|
941
|
+
L: 435,
|
|
938
942
|
S: this,
|
|
939
943
|
A: [
|
|
940
944
|
"this.session",
|
|
@@ -1082,6 +1086,18 @@ var START_SPEAKING_THRESHOLD = 0.05;
|
|
|
1082
1086
|
var CONTINUE_SPEAKING_THRESHOLD = 0.02;
|
|
1083
1087
|
var MIN_EVENT_INTERVAL = 100;
|
|
1084
1088
|
var SpeakingMonitor = class extends Resource3 {
|
|
1089
|
+
_mediaStreamTrack;
|
|
1090
|
+
/**
|
|
1091
|
+
* Event that is emitted when the user starts or stops speaking.
|
|
1092
|
+
* It is debounced to prevent rapid state changes.
|
|
1093
|
+
*/
|
|
1094
|
+
speakingChanged;
|
|
1095
|
+
/**
|
|
1096
|
+
* Real state of the user speaking.
|
|
1097
|
+
*/
|
|
1098
|
+
_isSpeaking;
|
|
1099
|
+
_lastEventTime;
|
|
1100
|
+
_deferredUpdate;
|
|
1085
1101
|
constructor(_mediaStreamTrack) {
|
|
1086
1102
|
super(), this._mediaStreamTrack = _mediaStreamTrack, this.speakingChanged = new Event2(), this._isSpeaking = false, this._lastEventTime = 0;
|
|
1087
1103
|
}
|
|
@@ -1132,7 +1148,7 @@ var SpeakingMonitor = class extends Resource3 {
|
|
|
1132
1148
|
|
|
1133
1149
|
// src/calls/media-manager.ts
|
|
1134
1150
|
import { DeferredTask as DeferredTask3, Event as Event3, sleep as sleep2, synchronized as synchronized2 } from "@dxos/async";
|
|
1135
|
-
import {
|
|
1151
|
+
import { Resource as Resource4, cancelWithContext } from "@dxos/context";
|
|
1136
1152
|
import { log as log4 } from "@dxos/log";
|
|
1137
1153
|
function _ts_decorate2(decorators, target, key, desc) {
|
|
1138
1154
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
@@ -1148,20 +1164,17 @@ var MAX_WEB_CAM_BITRATE = 12e5;
|
|
|
1148
1164
|
var RETRY_INTERVAL = 500;
|
|
1149
1165
|
var USE_INAUDIBLE_AUDIO = false;
|
|
1150
1166
|
var MediaManager = class extends Resource4 {
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
this._pushTracksTask = void 0;
|
|
1163
|
-
this._pullTracksTask = void 0;
|
|
1164
|
-
}
|
|
1167
|
+
stateUpdated = new Event3();
|
|
1168
|
+
_state = {
|
|
1169
|
+
pulledVideoStreams: {},
|
|
1170
|
+
pulledAudioTracks: {}
|
|
1171
|
+
};
|
|
1172
|
+
_speakingMonitor = void 0;
|
|
1173
|
+
_trackToReconcile = [];
|
|
1174
|
+
_blackCanvasStreamTrack = void 0;
|
|
1175
|
+
_inaudibleAudioStreamTrack = void 0;
|
|
1176
|
+
_pushTracksTask = void 0;
|
|
1177
|
+
_pullTracksTask = void 0;
|
|
1165
1178
|
get isSpeaking() {
|
|
1166
1179
|
return this._speakingMonitor?.isSpeaking;
|
|
1167
1180
|
}
|
|
@@ -1468,6 +1481,22 @@ function _ts_decorate3(decorators, target, key, desc) {
|
|
|
1468
1481
|
}
|
|
1469
1482
|
var __dxlog_file5 = "/__w/dxos/dxos/packages/plugins/plugin-thread/src/calls/call-manager.ts";
|
|
1470
1483
|
var CallManager = class extends Resource5 {
|
|
1484
|
+
_client;
|
|
1485
|
+
callStateUpdated;
|
|
1486
|
+
// TODO(wittjosiah): Consolidate isSpeaking into the MediaState type.
|
|
1487
|
+
mediaStateUpdated;
|
|
1488
|
+
left;
|
|
1489
|
+
/**
|
|
1490
|
+
* Live object state. Is changed on internal events.
|
|
1491
|
+
* CAUTION: Do not change directly.
|
|
1492
|
+
*/
|
|
1493
|
+
_state;
|
|
1494
|
+
// TODO(wittjosiah): This shouldn't be necessary, live-object's signals should be granular.
|
|
1495
|
+
_raisedHandSignal;
|
|
1496
|
+
_speakingSignal;
|
|
1497
|
+
_joinedSignal;
|
|
1498
|
+
_swarmSynchronizer;
|
|
1499
|
+
_mediaManager;
|
|
1471
1500
|
/** @reactive */
|
|
1472
1501
|
get roomId() {
|
|
1473
1502
|
return this._state.call.roomId;
|
|
@@ -1666,4 +1695,4 @@ export {
|
|
|
1666
1695
|
MediaManager,
|
|
1667
1696
|
CallManager
|
|
1668
1697
|
};
|
|
1669
|
-
//# sourceMappingURL=chunk-
|
|
1698
|
+
//# sourceMappingURL=chunk-TUFWPOVS.mjs.map
|