@react-x11/components 0.1.0 → 0.2.0
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/README.md +979 -21
- package/dist/ansi/cast.d.ts +48 -0
- package/dist/ansi/cast.d.ts.map +1 -0
- package/dist/ansi/cast.js +135 -0
- package/dist/ansi/cast.js.map +1 -0
- package/dist/ansi/index.d.ts +10 -0
- package/dist/ansi/index.d.ts.map +1 -0
- package/dist/ansi/index.js +27 -0
- package/dist/ansi/index.js.map +1 -0
- package/dist/ansi/palette.d.ts +79 -0
- package/dist/ansi/palette.d.ts.map +1 -0
- package/dist/ansi/palette.js +155 -0
- package/dist/ansi/palette.js.map +1 -0
- package/dist/ansi/parse.d.ts +114 -0
- package/dist/ansi/parse.d.ts.map +1 -0
- package/dist/ansi/parse.js +687 -0
- package/dist/ansi/parse.js.map +1 -0
- package/dist/ansi/sgr.d.ts +87 -0
- package/dist/ansi/sgr.d.ts.map +1 -0
- package/dist/ansi/sgr.js +302 -0
- package/dist/ansi/sgr.js.map +1 -0
- package/dist/ansi/utf8.d.ts +15 -0
- package/dist/ansi/utf8.d.ts.map +1 -0
- package/dist/ansi/utf8.js +82 -0
- package/dist/ansi/utf8.js.map +1 -0
- package/dist/calendar/Calendar.d.ts +136 -0
- package/dist/calendar/Calendar.d.ts.map +1 -0
- package/dist/calendar/Calendar.js +460 -0
- package/dist/calendar/Calendar.js.map +1 -0
- package/dist/calendar/DatePicker.d.ts +52 -0
- package/dist/calendar/DatePicker.d.ts.map +1 -0
- package/dist/calendar/DatePicker.js +257 -0
- package/dist/calendar/DatePicker.js.map +1 -0
- package/dist/calendar/dates.d.ts +90 -0
- package/dist/calendar/dates.d.ts.map +1 -0
- package/dist/calendar/dates.js +236 -0
- package/dist/calendar/dates.js.map +1 -0
- package/dist/calendar/index.d.ts +8 -0
- package/dist/calendar/index.d.ts.map +1 -0
- package/dist/calendar/index.js +15 -0
- package/dist/calendar/index.js.map +1 -0
- package/dist/charts/components.d.ts +141 -0
- package/dist/charts/components.d.ts.map +1 -0
- package/dist/charts/components.js +580 -0
- package/dist/charts/components.js.map +1 -0
- package/dist/charts/data.d.ts +198 -0
- package/dist/charts/data.d.ts.map +1 -0
- package/dist/charts/data.js +616 -0
- package/dist/charts/data.js.map +1 -0
- package/dist/charts/hx.d.ts +21 -0
- package/dist/charts/hx.d.ts.map +1 -0
- package/dist/charts/hx.js +15 -0
- package/dist/charts/hx.js.map +1 -0
- package/dist/charts/index.d.ts +27 -0
- package/dist/charts/index.d.ts.map +1 -0
- package/dist/charts/index.js +38 -0
- package/dist/charts/index.js.map +1 -0
- package/dist/charts/node.d.ts +96 -0
- package/dist/charts/node.d.ts.map +1 -0
- package/dist/charts/node.js +720 -0
- package/dist/charts/node.js.map +1 -0
- package/dist/charts/render.d.ts +153 -0
- package/dist/charts/render.d.ts.map +1 -0
- package/dist/charts/render.js +762 -0
- package/dist/charts/render.js.map +1 -0
- package/dist/charts/scale.d.ts +42 -0
- package/dist/charts/scale.d.ts.map +1 -0
- package/dist/charts/scale.js +173 -0
- package/dist/charts/scale.js.map +1 -0
- package/dist/charts/spec.d.ts +91 -0
- package/dist/charts/spec.d.ts.map +1 -0
- package/dist/charts/spec.js +33 -0
- package/dist/charts/spec.js.map +1 -0
- package/dist/charts/timers.d.ts +6 -0
- package/dist/charts/timers.d.ts.map +1 -0
- package/dist/charts/timers.js +14 -0
- package/dist/charts/timers.js.map +1 -0
- package/dist/code/hx.d.ts +24 -0
- package/dist/code/hx.d.ts.map +1 -0
- package/dist/code/hx.js +25 -0
- package/dist/code/hx.js.map +1 -0
- package/dist/code/index.d.ts +45 -0
- package/dist/code/index.d.ts.map +1 -0
- package/dist/code/index.js +93 -0
- package/dist/code/index.js.map +1 -0
- package/dist/code-editor/completion.d.ts +26 -0
- package/dist/code-editor/completion.d.ts.map +1 -0
- package/dist/code-editor/completion.js +129 -0
- package/dist/code-editor/completion.js.map +1 -0
- package/dist/code-editor/doc.d.ts +35 -0
- package/dist/code-editor/doc.d.ts.map +1 -0
- package/dist/code-editor/doc.js +162 -0
- package/dist/code-editor/doc.js.map +1 -0
- package/dist/code-editor/hx.d.ts +13 -0
- package/dist/code-editor/hx.d.ts.map +1 -0
- package/dist/code-editor/hx.js +10 -0
- package/dist/code-editor/hx.js.map +1 -0
- package/dist/code-editor/index.d.ts +88 -0
- package/dist/code-editor/index.d.ts.map +1 -0
- package/dist/code-editor/index.js +401 -0
- package/dist/code-editor/index.js.map +1 -0
- package/dist/code-editor/node.d.ts +343 -0
- package/dist/code-editor/node.d.ts.map +1 -0
- package/dist/code-editor/node.js +1521 -0
- package/dist/code-editor/node.js.map +1 -0
- package/dist/code-language/hljs.d.ts +47 -0
- package/dist/code-language/hljs.d.ts.map +1 -0
- package/dist/code-language/hljs.js +211 -0
- package/dist/code-language/hljs.js.map +1 -0
- package/dist/code-language/index.d.ts +22 -0
- package/dist/code-language/index.d.ts.map +1 -0
- package/dist/code-language/index.js +20 -0
- package/dist/code-language/index.js.map +1 -0
- package/dist/code-language/languages/glsl.d.ts +4 -0
- package/dist/code-language/languages/glsl.d.ts.map +1 -0
- package/dist/code-language/languages/glsl.js +99 -0
- package/dist/code-language/languages/glsl.js.map +1 -0
- package/dist/code-language/languages/javascript.d.ts +10 -0
- package/dist/code-language/languages/javascript.d.ts.map +1 -0
- package/dist/code-language/languages/javascript.js +360 -0
- package/dist/code-language/languages/javascript.js.map +1 -0
- package/dist/code-language/languages/json.d.ts +4 -0
- package/dist/code-language/languages/json.d.ts.map +1 -0
- package/dist/code-language/languages/json.js +68 -0
- package/dist/code-language/languages/json.js.map +1 -0
- package/dist/code-language/languages/shell.d.ts +4 -0
- package/dist/code-language/languages/shell.d.ts.map +1 -0
- package/dist/code-language/languages/shell.js +189 -0
- package/dist/code-language/languages/shell.js.map +1 -0
- package/dist/code-language/languages/sql.d.ts +11 -0
- package/dist/code-language/languages/sql.d.ts.map +1 -0
- package/dist/code-language/languages/sql.js +133 -0
- package/dist/code-language/languages/sql.js.map +1 -0
- package/dist/code-language/lezer.d.ts +24 -0
- package/dist/code-language/lezer.d.ts.map +1 -0
- package/dist/code-language/lezer.js +148 -0
- package/dist/code-language/lezer.js.map +1 -0
- package/dist/code-language/registry.d.ts +19 -0
- package/dist/code-language/registry.d.ts.map +1 -0
- package/dist/code-language/registry.js +56 -0
- package/dist/code-language/registry.js.map +1 -0
- package/dist/code-language/runs.d.ts +35 -0
- package/dist/code-language/runs.d.ts.map +1 -0
- package/dist/code-language/runs.js +88 -0
- package/dist/code-language/runs.js.map +1 -0
- package/dist/code-language/stream.d.ts +70 -0
- package/dist/code-language/stream.d.ts.map +1 -0
- package/dist/code-language/stream.js +243 -0
- package/dist/code-language/stream.js.map +1 -0
- package/dist/code-language/textmate.d.ts +27 -0
- package/dist/code-language/textmate.d.ts.map +1 -0
- package/dist/code-language/textmate.js +86 -0
- package/dist/code-language/textmate.js.map +1 -0
- package/dist/code-language/theme.d.ts +26 -0
- package/dist/code-language/theme.d.ts.map +1 -0
- package/dist/code-language/theme.js +108 -0
- package/dist/code-language/theme.js.map +1 -0
- package/dist/code-language/timers.d.ts +7 -0
- package/dist/code-language/timers.d.ts.map +1 -0
- package/dist/code-language/timers.js +22 -0
- package/dist/code-language/timers.js.map +1 -0
- package/dist/code-language/types.d.ts +173 -0
- package/dist/code-language/types.d.ts.map +1 -0
- package/dist/code-language/types.js +41 -0
- package/dist/code-language/types.js.map +1 -0
- package/dist/codeblock/index.d.ts +69 -0
- package/dist/codeblock/index.d.ts.map +1 -0
- package/dist/codeblock/index.js +85 -0
- package/dist/codeblock/index.js.map +1 -0
- package/dist/color-picker/ColorField.d.ts +39 -0
- package/dist/color-picker/ColorField.d.ts.map +1 -0
- package/dist/color-picker/ColorField.js +239 -0
- package/dist/color-picker/ColorField.js.map +1 -0
- package/dist/color-picker/ColorPicker.d.ts +109 -0
- package/dist/color-picker/ColorPicker.d.ts.map +1 -0
- package/dist/color-picker/ColorPicker.js +757 -0
- package/dist/color-picker/ColorPicker.js.map +1 -0
- package/dist/color-picker/color.d.ts +105 -0
- package/dist/color-picker/color.d.ts.map +1 -0
- package/dist/color-picker/color.js +313 -0
- package/dist/color-picker/color.js.map +1 -0
- package/dist/color-picker/index.d.ts +8 -0
- package/dist/color-picker/index.d.ts.map +1 -0
- package/dist/color-picker/index.js +19 -0
- package/dist/color-picker/index.js.map +1 -0
- package/dist/desktop-calendar/eds.d.ts +102 -0
- package/dist/desktop-calendar/eds.d.ts.map +1 -0
- package/dist/desktop-calendar/eds.js +356 -0
- package/dist/desktop-calendar/eds.js.map +1 -0
- package/dist/desktop-calendar/ical.d.ts +63 -0
- package/dist/desktop-calendar/ical.d.ts.map +1 -0
- package/dist/desktop-calendar/ical.js +57 -0
- package/dist/desktop-calendar/ical.js.map +1 -0
- package/dist/desktop-calendar/index.d.ts +72 -0
- package/dist/desktop-calendar/index.d.ts.map +1 -0
- package/dist/desktop-calendar/index.js +213 -0
- package/dist/desktop-calendar/index.js.map +1 -0
- package/dist/embed/client.d.ts +121 -0
- package/dist/embed/client.d.ts.map +1 -0
- package/dist/embed/client.js +203 -0
- package/dist/embed/client.js.map +1 -0
- package/dist/embed/host.d.ts +96 -0
- package/dist/embed/host.d.ts.map +1 -0
- package/dist/embed/host.js +266 -0
- package/dist/embed/host.js.map +1 -0
- package/dist/embed/index.d.ts +5 -0
- package/dist/embed/index.d.ts.map +1 -0
- package/dist/embed/index.js +13 -0
- package/dist/embed/index.js.map +1 -0
- package/dist/embed/timers.d.ts +6 -0
- package/dist/embed/timers.d.ts.map +1 -0
- package/dist/embed/timers.js +16 -0
- package/dist/embed/timers.js.map +1 -0
- package/dist/flow/draw.d.ts +45 -0
- package/dist/flow/draw.d.ts.map +1 -0
- package/dist/flow/draw.js +295 -0
- package/dist/flow/draw.js.map +1 -0
- package/dist/flow/index.d.ts +64 -0
- package/dist/flow/index.d.ts.map +1 -0
- package/dist/flow/index.js +306 -0
- package/dist/flow/index.js.map +1 -0
- package/dist/flow/model.d.ts +158 -0
- package/dist/flow/model.d.ts.map +1 -0
- package/dist/flow/model.js +566 -0
- package/dist/flow/model.js.map +1 -0
- package/dist/flow/node.d.ts +429 -0
- package/dist/flow/node.d.ts.map +1 -0
- package/dist/flow/node.js +3025 -0
- package/dist/flow/node.js.map +1 -0
- package/dist/flow/paths.d.ts +43 -0
- package/dist/flow/paths.d.ts.map +1 -0
- package/dist/flow/paths.js +327 -0
- package/dist/flow/paths.js.map +1 -0
- package/dist/flow/types.d.ts +561 -0
- package/dist/flow/types.d.ts.map +1 -0
- package/dist/flow/types.js +2 -0
- package/dist/flow/types.js.map +1 -0
- package/dist/formula/hx.d.ts +24 -0
- package/dist/formula/hx.d.ts.map +1 -0
- package/dist/formula/hx.js +25 -0
- package/dist/formula/hx.js.map +1 -0
- package/dist/formula/index.d.ts +74 -0
- package/dist/formula/index.d.ts.map +1 -0
- package/dist/formula/index.js +155 -0
- package/dist/formula/index.js.map +1 -0
- package/dist/formula/katex.d.ts +78 -0
- package/dist/formula/katex.d.ts.map +1 -0
- package/dist/formula/katex.js +130 -0
- package/dist/formula/katex.js.map +1 -0
- package/dist/formula/layout.d.ts +103 -0
- package/dist/formula/layout.d.ts.map +1 -0
- package/dist/formula/layout.js +716 -0
- package/dist/formula/layout.js.map +1 -0
- package/dist/formula/node.d.ts +50 -0
- package/dist/formula/node.d.ts.map +1 -0
- package/dist/formula/node.js +351 -0
- package/dist/formula/node.js.map +1 -0
- package/dist/html/controls.d.ts +48 -0
- package/dist/html/controls.d.ts.map +1 -0
- package/dist/html/controls.js +195 -0
- package/dist/html/controls.js.map +1 -0
- package/dist/html/css/cascade.d.ts +51 -0
- package/dist/html/css/cascade.d.ts.map +1 -0
- package/dist/html/css/cascade.js +552 -0
- package/dist/html/css/cascade.js.map +1 -0
- package/dist/html/css/parse.d.ts +74 -0
- package/dist/html/css/parse.d.ts.map +1 -0
- package/dist/html/css/parse.js +464 -0
- package/dist/html/css/parse.js.map +1 -0
- package/dist/html/css/style.d.ts +142 -0
- package/dist/html/css/style.d.ts.map +1 -0
- package/dist/html/css/style.js +1145 -0
- package/dist/html/css/style.js.map +1 -0
- package/dist/html/css/ua.d.ts +5 -0
- package/dist/html/css/ua.d.ts.map +1 -0
- package/dist/html/css/ua.js +171 -0
- package/dist/html/css/ua.js.map +1 -0
- package/dist/html/css/values.d.ts +78 -0
- package/dist/html/css/values.d.ts.map +1 -0
- package/dist/html/css/values.js +330 -0
- package/dist/html/css/values.js.map +1 -0
- package/dist/html/dom.d.ts +112 -0
- package/dist/html/dom.d.ts.map +1 -0
- package/dist/html/dom.js +374 -0
- package/dist/html/dom.js.map +1 -0
- package/dist/html/hx.d.ts +24 -0
- package/dist/html/hx.d.ts.map +1 -0
- package/dist/html/hx.js +29 -0
- package/dist/html/hx.js.map +1 -0
- package/dist/html/index.d.ts +137 -0
- package/dist/html/index.d.ts.map +1 -0
- package/dist/html/index.js +339 -0
- package/dist/html/index.js.map +1 -0
- package/dist/html/layout/block.d.ts +58 -0
- package/dist/html/layout/block.d.ts.map +1 -0
- package/dist/html/layout/block.js +724 -0
- package/dist/html/layout/block.js.map +1 -0
- package/dist/html/layout/boxes.d.ts +261 -0
- package/dist/html/layout/boxes.d.ts.map +1 -0
- package/dist/html/layout/boxes.js +725 -0
- package/dist/html/layout/boxes.js.map +1 -0
- package/dist/html/layout/flex.d.ts +16 -0
- package/dist/html/layout/flex.d.ts.map +1 -0
- package/dist/html/layout/flex.js +242 -0
- package/dist/html/layout/flex.js.map +1 -0
- package/dist/html/layout/floats.d.ts +50 -0
- package/dist/html/layout/floats.d.ts.map +1 -0
- package/dist/html/layout/floats.js +110 -0
- package/dist/html/layout/floats.js.map +1 -0
- package/dist/html/layout/inline.d.ts +44 -0
- package/dist/html/layout/inline.d.ts.map +1 -0
- package/dist/html/layout/inline.js +700 -0
- package/dist/html/layout/inline.js.map +1 -0
- package/dist/html/layout/table.d.ts +5 -0
- package/dist/html/layout/table.d.ts.map +1 -0
- package/dist/html/layout/table.js +340 -0
- package/dist/html/layout/table.js.map +1 -0
- package/dist/html/node.d.ts +149 -0
- package/dist/html/node.d.ts.map +1 -0
- package/dist/html/node.js +861 -0
- package/dist/html/node.js.map +1 -0
- package/dist/html/paint.d.ts +48 -0
- package/dist/html/paint.d.ts.map +1 -0
- package/dist/html/paint.js +495 -0
- package/dist/html/paint.js.map +1 -0
- package/dist/html/resources.d.ts +48 -0
- package/dist/html/resources.d.ts.map +1 -0
- package/dist/html/resources.js +156 -0
- package/dist/html/resources.js.map +1 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +92 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/heights.d.ts +81 -0
- package/dist/internal/heights.d.ts.map +1 -0
- package/dist/internal/heights.js +193 -0
- package/dist/internal/heights.js.map +1 -0
- package/dist/internal/hx.d.ts +24 -0
- package/dist/internal/hx.d.ts.map +1 -0
- package/dist/internal/hx.js +27 -0
- package/dist/internal/hx.js.map +1 -0
- package/dist/internal/text.d.ts +6 -0
- package/dist/internal/text.d.ts.map +1 -0
- package/dist/internal/text.js +44 -0
- package/dist/internal/text.js.map +1 -0
- package/dist/internal/timers.d.ts +8 -0
- package/dist/internal/timers.d.ts.map +1 -0
- package/dist/internal/timers.js +22 -0
- package/dist/internal/timers.js.map +1 -0
- package/dist/internal/widget.d.ts +40 -0
- package/dist/internal/widget.d.ts.map +1 -0
- package/dist/internal/widget.js +44 -0
- package/dist/internal/widget.js.map +1 -0
- package/dist/markdown/ast.d.ts +126 -0
- package/dist/markdown/ast.d.ts.map +1 -0
- package/dist/markdown/ast.js +8 -0
- package/dist/markdown/ast.js.map +1 -0
- package/dist/markdown/hx.d.ts +24 -0
- package/dist/markdown/hx.d.ts.map +1 -0
- package/dist/markdown/hx.js +25 -0
- package/dist/markdown/hx.js.map +1 -0
- package/dist/markdown/index.d.ts +90 -0
- package/dist/markdown/index.d.ts.map +1 -0
- package/dist/markdown/index.js +413 -0
- package/dist/markdown/index.js.map +1 -0
- package/dist/markdown/parse.d.ts +8 -0
- package/dist/markdown/parse.d.ts.map +1 -0
- package/dist/markdown/parse.js +911 -0
- package/dist/markdown/parse.js.map +1 -0
- package/dist/markdown/spans.d.ts +20 -0
- package/dist/markdown/spans.d.ts.map +1 -0
- package/dist/markdown/spans.js +96 -0
- package/dist/markdown/spans.js.map +1 -0
- package/dist/media-player/backends.d.ts +64 -0
- package/dist/media-player/backends.d.ts.map +1 -0
- package/dist/media-player/backends.js +110 -0
- package/dist/media-player/backends.js.map +1 -0
- package/dist/media-player/control.d.ts +40 -0
- package/dist/media-player/control.d.ts.map +1 -0
- package/dist/media-player/control.js +44 -0
- package/dist/media-player/control.js.map +1 -0
- package/dist/media-player/hx.d.ts +24 -0
- package/dist/media-player/hx.d.ts.map +1 -0
- package/dist/media-player/hx.js +25 -0
- package/dist/media-player/hx.js.map +1 -0
- package/dist/media-player/index.d.ts +107 -0
- package/dist/media-player/index.d.ts.map +1 -0
- package/dist/media-player/index.js +219 -0
- package/dist/media-player/index.js.map +1 -0
- package/dist/media-player/mpv.d.ts +4 -0
- package/dist/media-player/mpv.d.ts.map +1 -0
- package/dist/media-player/mpv.js +120 -0
- package/dist/media-player/mpv.js.map +1 -0
- package/dist/media-player/vlc.d.ts +8 -0
- package/dist/media-player/vlc.d.ts.map +1 -0
- package/dist/media-player/vlc.js +83 -0
- package/dist/media-player/vlc.js.map +1 -0
- package/dist/richtext/index.d.ts +19 -0
- package/dist/richtext/index.d.ts.map +1 -0
- package/dist/richtext/index.js +4 -0
- package/dist/richtext/index.js.map +1 -0
- package/dist/richtext/links.d.ts +12 -0
- package/dist/richtext/links.d.ts.map +1 -0
- package/dist/richtext/links.js +64 -0
- package/dist/richtext/links.js.map +1 -0
- package/dist/richtext/menu.d.ts +11 -0
- package/dist/richtext/menu.d.ts.map +1 -0
- package/dist/richtext/menu.js +43 -0
- package/dist/richtext/menu.js.map +1 -0
- package/dist/richtext/node.d.ts +151 -0
- package/dist/richtext/node.d.ts.map +1 -0
- package/dist/richtext/node.js +255 -0
- package/dist/richtext/node.js.map +1 -0
- package/dist/richtext/runs.d.ts +92 -0
- package/dist/richtext/runs.d.ts.map +1 -0
- package/dist/richtext/runs.js +158 -0
- package/dist/richtext/runs.js.map +1 -0
- package/dist/table/hx.d.ts +24 -0
- package/dist/table/hx.d.ts.map +1 -0
- package/dist/table/hx.js +25 -0
- package/dist/table/hx.js.map +1 -0
- package/dist/table/index.d.ts +169 -0
- package/dist/table/index.d.ts.map +1 -0
- package/dist/table/index.js +844 -0
- package/dist/table/index.js.map +1 -0
- package/dist/table/rows.d.ts +136 -0
- package/dist/table/rows.d.ts.map +1 -0
- package/dist/table/rows.js +146 -0
- package/dist/table/rows.js.map +1 -0
- package/dist/terminal/backends.d.ts +105 -0
- package/dist/terminal/backends.d.ts.map +1 -0
- package/dist/terminal/backends.js +185 -0
- package/dist/terminal/backends.js.map +1 -0
- package/dist/terminal/hx.d.ts +24 -0
- package/dist/terminal/hx.d.ts.map +1 -0
- package/dist/terminal/hx.js +25 -0
- package/dist/terminal/hx.js.map +1 -0
- package/dist/terminal/index.d.ts +160 -0
- package/dist/terminal/index.d.ts.map +1 -0
- package/dist/terminal/index.js +344 -0
- package/dist/terminal/index.js.map +1 -0
- package/dist/terminal/title.d.ts +24 -0
- package/dist/terminal/title.d.ts.map +1 -0
- package/dist/terminal/title.js +129 -0
- package/dist/terminal/title.js.map +1 -0
- package/dist/terminal/vt/colors.d.ts +63 -0
- package/dist/terminal/vt/colors.d.ts.map +1 -0
- package/dist/terminal/vt/colors.js +203 -0
- package/dist/terminal/vt/colors.js.map +1 -0
- package/dist/terminal/vt/diff.d.ts +117 -0
- package/dist/terminal/vt/diff.d.ts.map +1 -0
- package/dist/terminal/vt/diff.js +358 -0
- package/dist/terminal/vt/diff.js.map +1 -0
- package/dist/terminal/vt/fonts.d.ts +92 -0
- package/dist/terminal/vt/fonts.d.ts.map +1 -0
- package/dist/terminal/vt/fonts.js +178 -0
- package/dist/terminal/vt/fonts.js.map +1 -0
- package/dist/terminal/vt/index.d.ts +78 -0
- package/dist/terminal/vt/index.d.ts.map +1 -0
- package/dist/terminal/vt/index.js +312 -0
- package/dist/terminal/vt/index.js.map +1 -0
- package/dist/terminal/vt/keys.d.ts +74 -0
- package/dist/terminal/vt/keys.d.ts.map +1 -0
- package/dist/terminal/vt/keys.js +309 -0
- package/dist/terminal/vt/keys.js.map +1 -0
- package/dist/terminal/vt/mouse.d.ts +44 -0
- package/dist/terminal/vt/mouse.d.ts.map +1 -0
- package/dist/terminal/vt/mouse.js +106 -0
- package/dist/terminal/vt/mouse.js.map +1 -0
- package/dist/terminal/vt/node.d.ts +246 -0
- package/dist/terminal/vt/node.d.ts.map +1 -0
- package/dist/terminal/vt/node.js +1068 -0
- package/dist/terminal/vt/node.js.map +1 -0
- package/dist/terminal/vt/pty.d.ts +81 -0
- package/dist/terminal/vt/pty.d.ts.map +1 -0
- package/dist/terminal/vt/pty.js +201 -0
- package/dist/terminal/vt/pty.js.map +1 -0
- package/dist/terminal/vt/renderer.d.ts +179 -0
- package/dist/terminal/vt/renderer.d.ts.map +1 -0
- package/dist/terminal/vt/renderer.js +357 -0
- package/dist/terminal/vt/renderer.js.map +1 -0
- package/dist/terminal/vt/timers.d.ts +6 -0
- package/dist/terminal/vt/timers.d.ts.map +1 -0
- package/dist/terminal/vt/timers.js +16 -0
- package/dist/terminal/vt/timers.js.map +1 -0
- package/dist/terminal/vt/xterm.d.ts +142 -0
- package/dist/terminal/vt/xterm.d.ts.map +1 -0
- package/dist/terminal/vt/xterm.js +32 -0
- package/dist/terminal/vt/xterm.js.map +1 -0
- package/dist/terminal-output/hx.d.ts +24 -0
- package/dist/terminal-output/hx.d.ts.map +1 -0
- package/dist/terminal-output/hx.js +25 -0
- package/dist/terminal-output/hx.js.map +1 -0
- package/dist/terminal-output/index.d.ts +92 -0
- package/dist/terminal-output/index.d.ts.map +1 -0
- package/dist/terminal-output/index.js +179 -0
- package/dist/terminal-output/index.js.map +1 -0
- package/dist/terminal-output/runs.d.ts +27 -0
- package/dist/terminal-output/runs.d.ts.map +1 -0
- package/dist/terminal-output/runs.js +66 -0
- package/dist/terminal-output/runs.js.map +1 -0
- package/dist/three/canvas.d.ts +46 -0
- package/dist/three/canvas.d.ts.map +1 -0
- package/dist/three/canvas.js +305 -0
- package/dist/three/canvas.js.map +1 -0
- package/dist/three/events.d.ts +64 -0
- package/dist/three/events.d.ts.map +1 -0
- package/dist/three/events.js +146 -0
- package/dist/three/events.js.map +1 -0
- package/dist/three/geometries.d.ts +89 -0
- package/dist/three/geometries.d.ts.map +1 -0
- package/dist/three/geometries.js +345 -0
- package/dist/three/geometries.js.map +1 -0
- package/dist/three/globals.d.ts +7 -0
- package/dist/three/globals.d.ts.map +1 -0
- package/dist/three/globals.js +20 -0
- package/dist/three/globals.js.map +1 -0
- package/dist/three/hx.d.ts +9 -0
- package/dist/three/hx.d.ts.map +1 -0
- package/dist/three/hx.js +10 -0
- package/dist/three/hx.js.map +1 -0
- package/dist/three/index.d.ts +22 -0
- package/dist/three/index.d.ts.map +1 -0
- package/dist/three/index.js +24 -0
- package/dist/three/index.js.map +1 -0
- package/dist/three/jsx-dev-runtime.d.ts +19 -0
- package/dist/three/jsx-dev-runtime.d.ts.map +1 -0
- package/dist/three/jsx-dev-runtime.js +2 -0
- package/dist/three/jsx-dev-runtime.js.map +1 -0
- package/dist/three/jsx-runtime.d.ts +19 -0
- package/dist/three/jsx-runtime.d.ts.map +1 -0
- package/dist/three/jsx-runtime.js +2 -0
- package/dist/three/jsx-runtime.js.map +1 -0
- package/dist/three/jsx.d.ts +198 -0
- package/dist/three/jsx.d.ts.map +1 -0
- package/dist/three/jsx.js +2 -0
- package/dist/three/jsx.js.map +1 -0
- package/dist/three/materials.d.ts +125 -0
- package/dist/three/materials.d.ts.map +1 -0
- package/dist/three/materials.js +229 -0
- package/dist/three/materials.js.map +1 -0
- package/dist/three/math.d.ts +146 -0
- package/dist/three/math.d.ts.map +1 -0
- package/dist/three/math.js +464 -0
- package/dist/three/math.js.map +1 -0
- package/dist/three/objects.d.ts +185 -0
- package/dist/three/objects.d.ts.map +1 -0
- package/dist/three/objects.js +309 -0
- package/dist/three/objects.js.map +1 -0
- package/dist/three/passes.d.ts +54 -0
- package/dist/three/passes.d.ts.map +1 -0
- package/dist/three/passes.js +78 -0
- package/dist/three/passes.js.map +1 -0
- package/dist/three/postprocess.d.ts +85 -0
- package/dist/three/postprocess.d.ts.map +1 -0
- package/dist/three/postprocess.js +503 -0
- package/dist/three/postprocess.js.map +1 -0
- package/dist/three/raycast.d.ts +24 -0
- package/dist/three/raycast.d.ts.map +1 -0
- package/dist/three/raycast.js +138 -0
- package/dist/three/raycast.js.map +1 -0
- package/dist/three/reconciler.d.ts +48 -0
- package/dist/three/reconciler.d.ts.map +1 -0
- package/dist/three/reconciler.js +416 -0
- package/dist/three/reconciler.js.map +1 -0
- package/dist/three/renderer-direct.d.ts +102 -0
- package/dist/three/renderer-direct.d.ts.map +1 -0
- package/dist/three/renderer-direct.js +782 -0
- package/dist/three/renderer-direct.js.map +1 -0
- package/dist/three/renderer-indirect.d.ts +68 -0
- package/dist/three/renderer-indirect.d.ts.map +1 -0
- package/dist/three/renderer-indirect.js +438 -0
- package/dist/three/renderer-indirect.js.map +1 -0
- package/dist/three/store.d.ts +81 -0
- package/dist/three/store.d.ts.map +1 -0
- package/dist/three/store.js +110 -0
- package/dist/three/store.js.map +1 -0
- package/dist/timeline/hx.d.ts +18 -0
- package/dist/timeline/hx.d.ts.map +1 -0
- package/dist/timeline/hx.js +10 -0
- package/dist/timeline/hx.js.map +1 -0
- package/dist/timeline/index.d.ts +152 -0
- package/dist/timeline/index.d.ts.map +1 -0
- package/dist/timeline/index.js +383 -0
- package/dist/timeline/index.js.map +1 -0
- package/dist/tray-host/hx.d.ts +24 -0
- package/dist/tray-host/hx.d.ts.map +1 -0
- package/dist/tray-host/hx.js +25 -0
- package/dist/tray-host/hx.js.map +1 -0
- package/dist/tray-host/index.d.ts +110 -0
- package/dist/tray-host/index.d.ts.map +1 -0
- package/dist/tray-host/index.js +191 -0
- package/dist/tray-host/index.js.map +1 -0
- package/dist/tray-host/manager.d.ts +137 -0
- package/dist/tray-host/manager.d.ts.map +1 -0
- package/dist/tray-host/manager.js +462 -0
- package/dist/tray-host/manager.js.map +1 -0
- package/dist/tray-host/notify.d.ts +22 -0
- package/dist/tray-host/notify.d.ts.map +1 -0
- package/dist/tray-host/notify.js +74 -0
- package/dist/tray-host/notify.js.map +1 -0
- package/dist/tray-host/protocol.d.ts +106 -0
- package/dist/tray-host/protocol.d.ts.map +1 -0
- package/dist/tray-host/protocol.js +191 -0
- package/dist/tray-host/protocol.js.map +1 -0
- package/dist/tree/hx.d.ts +24 -0
- package/dist/tree/hx.d.ts.map +1 -0
- package/dist/tree/hx.js +25 -0
- package/dist/tree/hx.js.map +1 -0
- package/dist/tree/index.d.ts +221 -0
- package/dist/tree/index.d.ts.map +1 -0
- package/dist/tree/index.js +716 -0
- package/dist/tree/index.js.map +1 -0
- package/dist/tree/internal.d.ts +18 -0
- package/dist/tree/internal.d.ts.map +1 -0
- package/dist/tree/internal.js +66 -0
- package/dist/tree/internal.js.map +1 -0
- package/dist/tree/rows.d.ts +177 -0
- package/dist/tree/rows.d.ts.map +1 -0
- package/dist/tree/rows.js +179 -0
- package/dist/tree/rows.js.map +1 -0
- package/package.json +166 -12
- package/src/ansi/cast.ts +159 -0
- package/src/ansi/index.ts +53 -0
- package/src/ansi/palette.ts +226 -0
- package/src/ansi/parse.ts +780 -0
- package/src/ansi/sgr.ts +380 -0
- package/src/ansi/utf8.ts +84 -0
- package/src/calendar/Calendar.ts +744 -0
- package/src/calendar/DatePicker.ts +368 -0
- package/src/calendar/dates.ts +307 -0
- package/src/calendar/index.ts +51 -0
- package/src/charts/components.ts +864 -0
- package/src/charts/data.ts +776 -0
- package/src/charts/hx.ts +39 -0
- package/src/charts/index.ts +99 -0
- package/src/charts/node.ts +932 -0
- package/src/charts/render.ts +982 -0
- package/src/charts/scale.ts +214 -0
- package/src/charts/spec.ts +122 -0
- package/src/charts/timers.ts +24 -0
- package/src/code/hx.ts +51 -0
- package/src/code/index.ts +174 -0
- package/src/code-editor/completion.ts +161 -0
- package/src/code-editor/doc.ts +198 -0
- package/src/code-editor/hx.ts +26 -0
- package/src/code-editor/index.ts +615 -0
- package/src/code-editor/node.ts +1926 -0
- package/src/code-language/hljs.ts +302 -0
- package/src/code-language/index.ts +51 -0
- package/src/code-language/languages/glsl.ts +120 -0
- package/src/code-language/languages/javascript.ts +419 -0
- package/src/code-language/languages/json.ts +72 -0
- package/src/code-language/languages/shell.ts +221 -0
- package/src/code-language/languages/sql.ts +165 -0
- package/src/code-language/lezer.ts +190 -0
- package/src/code-language/registry.ts +66 -0
- package/src/code-language/runs.ts +128 -0
- package/src/code-language/stream.ts +306 -0
- package/src/code-language/textmate.ts +134 -0
- package/src/code-language/theme.ts +124 -0
- package/src/code-language/timers.ts +36 -0
- package/src/code-language/types.ts +252 -0
- package/src/codeblock/index.ts +146 -0
- package/src/color-picker/ColorField.ts +333 -0
- package/src/color-picker/ColorPicker.ts +1069 -0
- package/src/color-picker/color.ts +399 -0
- package/src/color-picker/index.ts +50 -0
- package/src/desktop-calendar/eds.ts +484 -0
- package/src/desktop-calendar/ical.ts +119 -0
- package/src/desktop-calendar/index.ts +287 -0
- package/src/embed/client.ts +311 -0
- package/src/embed/host.ts +432 -0
- package/src/embed/index.ts +33 -0
- package/src/embed/timers.ts +32 -0
- package/src/flow/draw.ts +418 -0
- package/src/flow/index.ts +473 -0
- package/src/flow/model.ts +687 -0
- package/src/flow/node.ts +3694 -0
- package/src/flow/paths.ts +403 -0
- package/src/flow/types.ts +634 -0
- package/src/formula/hx.ts +51 -0
- package/src/formula/index.ts +243 -0
- package/src/formula/katex.ts +209 -0
- package/src/formula/layout.ts +876 -0
- package/src/formula/node.ts +467 -0
- package/src/html/controls.ts +244 -0
- package/src/html/css/cascade.ts +606 -0
- package/src/html/css/parse.ts +500 -0
- package/src/html/css/style.ts +1371 -0
- package/src/html/css/ua.ts +174 -0
- package/src/html/css/values.ts +358 -0
- package/src/html/dom.ts +410 -0
- package/src/html/hx.ts +55 -0
- package/src/html/index.ts +545 -0
- package/src/html/layout/block.ts +876 -0
- package/src/html/layout/boxes.ts +981 -0
- package/src/html/layout/flex.ts +297 -0
- package/src/html/layout/floats.ts +125 -0
- package/src/html/layout/inline.ts +870 -0
- package/src/html/layout/table.ts +380 -0
- package/src/html/node.ts +967 -0
- package/src/html/paint.ts +605 -0
- package/src/html/resources.ts +214 -0
- package/src/index.ts +638 -0
- package/src/internal/heights.ts +211 -0
- package/src/internal/hx.ts +53 -0
- package/src/internal/text.ts +44 -0
- package/src/internal/timers.ts +44 -0
- package/src/internal/widget.ts +92 -0
- package/src/markdown/ast.ts +163 -0
- package/src/markdown/hx.ts +51 -0
- package/src/markdown/index.ts +686 -0
- package/src/markdown/parse.ts +1037 -0
- package/src/markdown/spans.ts +143 -0
- package/src/media-player/backends.ts +155 -0
- package/src/media-player/control.ts +70 -0
- package/src/media-player/hx.ts +51 -0
- package/src/media-player/index.ts +378 -0
- package/src/media-player/mpv.ts +146 -0
- package/src/media-player/vlc.ts +97 -0
- package/src/richtext/index.ts +42 -0
- package/src/richtext/links.ts +78 -0
- package/src/richtext/menu.ts +49 -0
- package/src/richtext/node.ts +406 -0
- package/src/richtext/runs.ts +253 -0
- package/src/table/hx.ts +51 -0
- package/src/table/index.ts +1219 -0
- package/src/table/rows.ts +275 -0
- package/src/terminal/backends.ts +242 -0
- package/src/terminal/hx.ts +51 -0
- package/src/terminal/index.ts +574 -0
- package/src/terminal/title.ts +172 -0
- package/src/terminal/vt/colors.ts +247 -0
- package/src/terminal/vt/diff.ts +467 -0
- package/src/terminal/vt/fonts.ts +233 -0
- package/src/terminal/vt/index.ts +443 -0
- package/src/terminal/vt/keys.ts +369 -0
- package/src/terminal/vt/mouse.ts +144 -0
- package/src/terminal/vt/node.ts +1242 -0
- package/src/terminal/vt/pty.ts +334 -0
- package/src/terminal/vt/renderer.ts +555 -0
- package/src/terminal/vt/timers.ts +31 -0
- package/src/terminal/vt/xterm.ts +193 -0
- package/src/terminal-output/hx.ts +51 -0
- package/src/terminal-output/index.ts +340 -0
- package/src/terminal-output/runs.ts +79 -0
- package/src/three/canvas.ts +451 -0
- package/src/three/events.ts +197 -0
- package/src/three/geometries.ts +429 -0
- package/src/three/globals.ts +34 -0
- package/src/three/hx.ts +22 -0
- package/src/three/index.ts +98 -0
- package/src/three/jsx-dev-runtime.ts +27 -0
- package/src/three/jsx-runtime.ts +38 -0
- package/src/three/jsx.ts +275 -0
- package/src/three/materials.ts +270 -0
- package/src/three/math.ts +585 -0
- package/src/three/objects.ts +397 -0
- package/src/three/passes.ts +90 -0
- package/src/three/postprocess.ts +677 -0
- package/src/three/raycast.ts +189 -0
- package/src/three/react-reconciler.d.ts +50 -0
- package/src/three/reconciler.ts +624 -0
- package/src/three/renderer-direct.ts +1055 -0
- package/src/three/renderer-indirect.ts +570 -0
- package/src/three/store.ts +207 -0
- package/src/timeline/hx.ts +31 -0
- package/src/timeline/index.ts +603 -0
- package/src/tray-host/hx.ts +51 -0
- package/src/tray-host/index.ts +331 -0
- package/src/tray-host/manager.ts +639 -0
- package/src/tray-host/notify.ts +102 -0
- package/src/tray-host/protocol.ts +235 -0
- package/src/tree/hx.ts +51 -0
- package/src/tree/index.ts +1087 -0
- package/src/tree/internal.ts +87 -0
- package/src/tree/rows.ts +334 -0
- package/src/index.d.ts +0 -2
- package/src/index.js +0 -9
- package/src/sparkline/index.d.ts +0 -29
- package/src/sparkline/index.js +0 -50
- package/src/sparkline/node.js +0 -72
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
// Read the calendars the user's desktop already has, and hand them to a
|
|
2
|
+
// `<Calendar dayContent>`.
|
|
3
|
+
//
|
|
4
|
+
// The point of this module is that an app gets the user's real events —
|
|
5
|
+
// Google, Microsoft, CalDAV, local — without asking for a single credential
|
|
6
|
+
// and without an OAuth flow, because the desktop already did all of that. See
|
|
7
|
+
// `./eds.js` for how, and `../calendar/` for what to draw them on.
|
|
8
|
+
//
|
|
9
|
+
// Nothing here opens a D-Bus connection. `useSessionBus()` (or `sessionBus()`
|
|
10
|
+
// for the imperative path) hands over react-x11's shared one, so an app is one
|
|
11
|
+
// name on the bus however many features it turns on.
|
|
12
|
+
import { useCallback, useEffect, useMemo, useState } from 'react';
|
|
13
|
+
import { useSessionBus } from 'react-x11';
|
|
14
|
+
import { DesktopCalendar } from './eds.js';
|
|
15
|
+
export { DesktopCalendar, parseKeyFile } from './eds.js';
|
|
16
|
+
export { IcalUnavailableError } from './ical.js';
|
|
17
|
+
const pad = (n) => String(n).padStart(2, '0');
|
|
18
|
+
/**
|
|
19
|
+
* The local calendar day a `Date` falls on, as `'YYYY-MM-DD'`.
|
|
20
|
+
*
|
|
21
|
+
* Deliberately a local three-liner rather than an import from `../calendar/`:
|
|
22
|
+
* no component in this package imports another, because a lateral import
|
|
23
|
+
* makes the two one unit in a bundler's eyes and an app that wanted only the
|
|
24
|
+
* events would start paying for the grid. The **format** is the contract they
|
|
25
|
+
* share, not the function — these keys index straight into a `<Calendar>`'s
|
|
26
|
+
* `dayContent`.
|
|
27
|
+
*/
|
|
28
|
+
function dayKeyOf(date) {
|
|
29
|
+
return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Occurrences grouped by the local day they appear on — which is what a
|
|
33
|
+
* calendar grid actually renders.
|
|
34
|
+
*
|
|
35
|
+
* An all-day event spans `[start, end)` across possibly several days, and a
|
|
36
|
+
* timed one can cross midnight, so an event lands under **every** day it
|
|
37
|
+
* touches rather than only under its start.
|
|
38
|
+
*/
|
|
39
|
+
export function byDay(events) {
|
|
40
|
+
const days = new Map();
|
|
41
|
+
for (const event of events) {
|
|
42
|
+
// `end` is exclusive, so a one-day all-day event ending at the next
|
|
43
|
+
// midnight must not also mark the next day.
|
|
44
|
+
const lastMs = Math.max(event.start.getTime(), event.end.getTime() - 1);
|
|
45
|
+
const last = new Date(lastMs);
|
|
46
|
+
const cursor = new Date(event.start.getFullYear(), event.start.getMonth(), event.start.getDate());
|
|
47
|
+
while (cursor <= last) {
|
|
48
|
+
const key = dayKeyOf(cursor);
|
|
49
|
+
const list = days.get(key);
|
|
50
|
+
if (list)
|
|
51
|
+
list.push(event);
|
|
52
|
+
else
|
|
53
|
+
days.set(key, [event]);
|
|
54
|
+
cursor.setDate(cursor.getDate() + 1);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return days;
|
|
58
|
+
}
|
|
59
|
+
const NO_EVENTS = [];
|
|
60
|
+
const NO_CALENDARS = [];
|
|
61
|
+
const NO_ERRORS = [];
|
|
62
|
+
/** The calendars a caller asked for by uid, or every enabled one. `onlyKey`
|
|
63
|
+
* is the comma-joined list, because an array prop is a new identity every
|
|
64
|
+
* render and these two effects are keyed on it. */
|
|
65
|
+
function pickCalendars(all, onlyKey) {
|
|
66
|
+
if (!onlyKey)
|
|
67
|
+
return all.filter((c) => c.enabled);
|
|
68
|
+
const wanted = new Set(onlyKey.split(','));
|
|
69
|
+
return all.filter((c) => wanted.has(c.uid));
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* The user's desktop calendar events, as rendering state.
|
|
73
|
+
*
|
|
74
|
+
* ```tsx
|
|
75
|
+
* const { byDay } = useDesktopCalendarEvents({ from, to });
|
|
76
|
+
*
|
|
77
|
+
* <Calendar
|
|
78
|
+
* dayContent={(day, state) =>
|
|
79
|
+
* byDay.get(day)?.slice(0, 3).map((ev) => (
|
|
80
|
+
* <box key={ev.uid} style={{ width: 4, height: 4, borderRadius: 2,
|
|
81
|
+
* backgroundColor: state.selected
|
|
82
|
+
* ? state.color
|
|
83
|
+
* : (ev.calendar.color ?? '$accent') }} />
|
|
84
|
+
* ))
|
|
85
|
+
* }
|
|
86
|
+
* />
|
|
87
|
+
* ```
|
|
88
|
+
*
|
|
89
|
+
* **`from` and `to` are read by their timestamps, not their identity**, so
|
|
90
|
+
* `new Date(...)` inline in the render is fine and will not re-query on every
|
|
91
|
+
* paint. That is the mistake this hook would otherwise invite, and it costs a
|
|
92
|
+
* D-Bus round trip per frame.
|
|
93
|
+
*
|
|
94
|
+
* `status` is `'unavailable'` when there is no session bus or `ical.js` is not
|
|
95
|
+
* installed — both are ordinary on a machine that simply does not have them,
|
|
96
|
+
* so neither throws, and `error` says which it was. Treat it as "no calendar
|
|
97
|
+
* integration here", not as a failure to report.
|
|
98
|
+
*/
|
|
99
|
+
export function useDesktopCalendarEvents(options) {
|
|
100
|
+
const { from, to, calendars: only, watch = false, enabled = true } = options;
|
|
101
|
+
const { bus } = useSessionBus();
|
|
102
|
+
const [events, setEvents] = useState(NO_EVENTS);
|
|
103
|
+
const [found, setFound] = useState(NO_CALENDARS);
|
|
104
|
+
const [errors, setErrors] = useState(NO_ERRORS);
|
|
105
|
+
const [status, setStatus] = useState('idle');
|
|
106
|
+
const [error, setError] = useState(null);
|
|
107
|
+
const [nonce, setNonce] = useState(0);
|
|
108
|
+
const refresh = useCallback(() => setNonce((n) => n + 1), []);
|
|
109
|
+
// Timestamps, not the Date objects: a caller writing `from={new Date(y, m, 1)}`
|
|
110
|
+
// in the render body hands us a new identity every paint, and an effect keyed
|
|
111
|
+
// on that would re-query the bus on every frame.
|
|
112
|
+
const fromMs = from.getTime();
|
|
113
|
+
const toMs = to.getTime();
|
|
114
|
+
const onlyKey = only ? only.join(',') : '';
|
|
115
|
+
useEffect(() => {
|
|
116
|
+
if (!enabled) {
|
|
117
|
+
setStatus('idle');
|
|
118
|
+
return undefined;
|
|
119
|
+
}
|
|
120
|
+
if (!bus) {
|
|
121
|
+
// `useSessionBus` is still connecting, or there is no bus at all. Its
|
|
122
|
+
// own `status` distinguishes them; from here both mean "nothing yet".
|
|
123
|
+
setStatus('unavailable');
|
|
124
|
+
setEvents(NO_EVENTS);
|
|
125
|
+
return undefined;
|
|
126
|
+
}
|
|
127
|
+
let live = true;
|
|
128
|
+
const desktop = new DesktopCalendar(bus);
|
|
129
|
+
const run = async () => {
|
|
130
|
+
setStatus('loading');
|
|
131
|
+
setError(null);
|
|
132
|
+
try {
|
|
133
|
+
const all = await desktop.listCalendars();
|
|
134
|
+
if (!live)
|
|
135
|
+
return;
|
|
136
|
+
setFound(all);
|
|
137
|
+
const result = await desktop.eventsBetween(new Date(fromMs), new Date(toMs), { calendars: pickCalendars(all, onlyKey) });
|
|
138
|
+
if (!live)
|
|
139
|
+
return;
|
|
140
|
+
setEvents(result.events);
|
|
141
|
+
setErrors(result.errors);
|
|
142
|
+
setStatus('ready');
|
|
143
|
+
}
|
|
144
|
+
catch (err) {
|
|
145
|
+
if (!live)
|
|
146
|
+
return;
|
|
147
|
+
// No bus, no ical.js, no EDS on this desktop — all ordinary.
|
|
148
|
+
setError(err instanceof Error ? err : new Error(String(err)));
|
|
149
|
+
setEvents(NO_EVENTS);
|
|
150
|
+
setStatus('unavailable');
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
void run();
|
|
154
|
+
return () => {
|
|
155
|
+
live = false;
|
|
156
|
+
void desktop.dispose();
|
|
157
|
+
};
|
|
158
|
+
// `refresh` is stable; `nonce` is what a manual refresh moves.
|
|
159
|
+
}, [bus, enabled, fromMs, toMs, onlyKey, nonce, refresh]);
|
|
160
|
+
// The subscription is a **separate** effect, and deliberately not keyed on
|
|
161
|
+
// `nonce`: a change has to re-run the query, and only the query. Watching
|
|
162
|
+
// from inside the effect the change re-runs means every notification tears
|
|
163
|
+
// the views down and starts new ones — which is a loop as soon as anything
|
|
164
|
+
// is delivered while a view is starting, and was one for as long as
|
|
165
|
+
// `Start()` reported the range's existing contents as a change.
|
|
166
|
+
//
|
|
167
|
+
// The cost is one extra `listCalendars()` per range, not per refresh.
|
|
168
|
+
useEffect(() => {
|
|
169
|
+
if (!enabled || !watch || !bus)
|
|
170
|
+
return undefined;
|
|
171
|
+
let live = true;
|
|
172
|
+
let stopWatching = null;
|
|
173
|
+
const desktop = new DesktopCalendar(bus);
|
|
174
|
+
void (async () => {
|
|
175
|
+
try {
|
|
176
|
+
const all = await desktop.listCalendars();
|
|
177
|
+
if (!live)
|
|
178
|
+
return;
|
|
179
|
+
stopWatching = await desktop.watch(new Date(fromMs), new Date(toMs), () => {
|
|
180
|
+
// Re-query rather than patch: a recurrence master edited months
|
|
181
|
+
// away changes what this range looks like.
|
|
182
|
+
if (live)
|
|
183
|
+
refresh();
|
|
184
|
+
}, { calendars: pickCalendars(all, onlyKey) });
|
|
185
|
+
if (!live)
|
|
186
|
+
await stopWatching();
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
// No bus, no EDS, nothing to watch. The query effect above is what
|
|
190
|
+
// reports that to the caller; a second copy of it would only race.
|
|
191
|
+
}
|
|
192
|
+
})();
|
|
193
|
+
return () => {
|
|
194
|
+
live = false;
|
|
195
|
+
void (async () => {
|
|
196
|
+
if (stopWatching)
|
|
197
|
+
await stopWatching();
|
|
198
|
+
await desktop.dispose();
|
|
199
|
+
})();
|
|
200
|
+
};
|
|
201
|
+
}, [bus, enabled, watch, fromMs, toMs, onlyKey, refresh]);
|
|
202
|
+
const grouped = useMemo(() => byDay(events), [events]);
|
|
203
|
+
return {
|
|
204
|
+
events,
|
|
205
|
+
byDay: grouped,
|
|
206
|
+
calendars: found,
|
|
207
|
+
errors,
|
|
208
|
+
status,
|
|
209
|
+
error,
|
|
210
|
+
refresh,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/desktop-calendar/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import type { ExitInfo, ProcessHost, SpawnedProcess } from './host.js';
|
|
2
|
+
/**
|
|
3
|
+
* Where the child is in its life.
|
|
4
|
+
*
|
|
5
|
+
* `'unavailable'` is not an error state to report as a failure: a machine
|
|
6
|
+
* with no terminal emulator installed, or no mpv, is an ordinary machine.
|
|
7
|
+
* Both components render their `fallback` on it, the way
|
|
8
|
+
* `useDesktopCalendarEvents` reports "no bus, no ical.js" rather than
|
|
9
|
+
* throwing.
|
|
10
|
+
*/
|
|
11
|
+
export type EmbedStatus = 'idle' | 'starting' | 'running' | 'exited' | 'unavailable';
|
|
12
|
+
/**
|
|
13
|
+
* No backend for this component is installed.
|
|
14
|
+
*
|
|
15
|
+
* Thrown by a `PlanFactory`, caught by the hook, and turned into
|
|
16
|
+
* `status: 'unavailable'`. `tried` is what was looked for, so the message an
|
|
17
|
+
* app shows can name the install line rather than saying "not found".
|
|
18
|
+
*/
|
|
19
|
+
export declare class BackendUnavailableError extends Error {
|
|
20
|
+
readonly tried: readonly string[];
|
|
21
|
+
constructor(what: string, tried: readonly string[]);
|
|
22
|
+
}
|
|
23
|
+
/** What to run, and what to do with it once it is running. */
|
|
24
|
+
export interface LaunchPlan {
|
|
25
|
+
/** Absolute path or a name on `PATH`. */
|
|
26
|
+
command: string;
|
|
27
|
+
args: readonly string[];
|
|
28
|
+
cwd?: string;
|
|
29
|
+
env?: Record<string, string | undefined>;
|
|
30
|
+
/** Which backend this plan chose, for `onBackend` and the handle. */
|
|
31
|
+
backend?: string;
|
|
32
|
+
/**
|
|
33
|
+
* Attach a control channel now that the process exists. Its return value is
|
|
34
|
+
* called at teardown, before the process is signalled.
|
|
35
|
+
*/
|
|
36
|
+
attach?(process: SpawnedProcess): void | (() => void) | Promise<void | (() => void)>;
|
|
37
|
+
/** Always run at teardown — temporary directories, sockets. */
|
|
38
|
+
dispose?(): void | Promise<void>;
|
|
39
|
+
}
|
|
40
|
+
export interface PlanContext {
|
|
41
|
+
/** The `<foreign>` container the program must draw into. */
|
|
42
|
+
windowId: number;
|
|
43
|
+
host: ProcessHost;
|
|
44
|
+
}
|
|
45
|
+
/** Builds the command line, once the window to draw into exists. */
|
|
46
|
+
export type PlanFactory = (context: PlanContext) => Promise<LaunchPlan>;
|
|
47
|
+
export interface UseEmbeddedClientOptions {
|
|
48
|
+
/**
|
|
49
|
+
* **Must be referentially stable for as long as the child should keep
|
|
50
|
+
* running.** A new identity is the restart signal — that is how "the
|
|
51
|
+
* command changed" reaches a program that cannot be reconfigured in place —
|
|
52
|
+
* so a factory rebuilt every render restarts the child every render.
|
|
53
|
+
*
|
|
54
|
+
* Both components build theirs with `useMemo` over a *string* key rather
|
|
55
|
+
* than over the props themselves, because `command={['bash']}` is a new
|
|
56
|
+
* array on every paint and an effect keyed on that never settles. Same
|
|
57
|
+
* reason `useDesktopCalendarEvents` keys on `from.getTime()`.
|
|
58
|
+
*/
|
|
59
|
+
plan: PlanFactory;
|
|
60
|
+
/** Defaults to `nodeProcessHost()`. */
|
|
61
|
+
host?: ProcessHost;
|
|
62
|
+
/** False holds off entirely — a pane that is not visible yet. */
|
|
63
|
+
enabled?: boolean;
|
|
64
|
+
/** Sent on unmount and on restart. Default `SIGTERM`. */
|
|
65
|
+
stopSignal?: string;
|
|
66
|
+
onStart?: (info: {
|
|
67
|
+
process: SpawnedProcess;
|
|
68
|
+
backend?: string;
|
|
69
|
+
}) => void;
|
|
70
|
+
onExit?: (info: ExitInfo) => void;
|
|
71
|
+
/** Spawn failures and missing backends alike. */
|
|
72
|
+
onError?: (err: Error) => void;
|
|
73
|
+
}
|
|
74
|
+
export interface EmbeddedClient {
|
|
75
|
+
status: EmbedStatus;
|
|
76
|
+
/** The last failure, including a `BackendUnavailableError`. */
|
|
77
|
+
error: Error | null;
|
|
78
|
+
pid: number | null;
|
|
79
|
+
/** The container window, once `<foreign>` has one. */
|
|
80
|
+
windowId: number | null;
|
|
81
|
+
/** Which backend the plan picked. */
|
|
82
|
+
backend: string | null;
|
|
83
|
+
/** Wire straight to `<foreign onReady>`. */
|
|
84
|
+
handleReady: (info: {
|
|
85
|
+
windowId: number;
|
|
86
|
+
}) => void;
|
|
87
|
+
/** Stop the child and start it again with a freshly built plan. */
|
|
88
|
+
restart: () => void;
|
|
89
|
+
/** Signal the child. `false` if there is not one. */
|
|
90
|
+
signal: (signal?: string) => boolean;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Run a program inside a `<foreign>`.
|
|
94
|
+
*
|
|
95
|
+
* ```jsx
|
|
96
|
+
* const client = useEmbeddedClient({ plan });
|
|
97
|
+
* return <foreign onReady={client.handleReady} style={{ flexGrow: 1 }} />;
|
|
98
|
+
* ```
|
|
99
|
+
*
|
|
100
|
+
* The `<foreign>` is rendered by the caller rather than here, because the
|
|
101
|
+
* element's props — style, focus, the `onEmbedded`/`onClientGone` handlers a
|
|
102
|
+
* component may want to compose with — belong to the component, not to the
|
|
103
|
+
* lifecycle.
|
|
104
|
+
*/
|
|
105
|
+
export declare function useEmbeddedClient(options: UseEmbeddedClientOptions): EmbeddedClient;
|
|
106
|
+
/**
|
|
107
|
+
* The first of `candidates` that is installed, or a `BackendUnavailableError`
|
|
108
|
+
* naming all of them.
|
|
109
|
+
*
|
|
110
|
+
* Auto-detection rather than a hard dependency is the whole reason both
|
|
111
|
+
* components take a `backend` prop that defaults to `'auto'`: this package
|
|
112
|
+
* cannot depend on a binary, and most machines have exactly one of the ones
|
|
113
|
+
* it can drive.
|
|
114
|
+
*/
|
|
115
|
+
export declare function resolveBackend<T extends {
|
|
116
|
+
binaries: readonly string[];
|
|
117
|
+
}>(host: ProcessHost, what: string, candidates: readonly T[]): Promise<{
|
|
118
|
+
backend: T;
|
|
119
|
+
path: string;
|
|
120
|
+
}>;
|
|
121
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/embed/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
// The lifecycle both XEmbed wrappers have, with none of the vocabulary
|
|
2
|
+
// either of them has.
|
|
3
|
+
//
|
|
4
|
+
// `<Terminal>` and `<MediaPlayer>` are the same component twice: render a
|
|
5
|
+
// `<foreign>` with no `windowId` so it *adopts* whatever turns up inside it,
|
|
6
|
+
// take the container id `onReady` hands over, spawn a program that draws into
|
|
7
|
+
// that id, and hand the program back when the tree changes. Only the argv and
|
|
8
|
+
// the control channel differ, and those are what the two `backends.ts` files
|
|
9
|
+
// are for.
|
|
10
|
+
//
|
|
11
|
+
// Everything here is ordinary React state. The X part is one prop —
|
|
12
|
+
// `onReady` — because core's `<foreign>` already owns the protocol
|
|
13
|
+
// (react-x11#269, ntk#246): the reparent, the save set, `_XEMBED_INFO`, the
|
|
14
|
+
// synthetic ConfigureNotify, and handing the client back on unmount without
|
|
15
|
+
// ever destroying it.
|
|
16
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
17
|
+
import { nodeProcessHost } from './host.js';
|
|
18
|
+
/**
|
|
19
|
+
* No backend for this component is installed.
|
|
20
|
+
*
|
|
21
|
+
* Thrown by a `PlanFactory`, caught by the hook, and turned into
|
|
22
|
+
* `status: 'unavailable'`. `tried` is what was looked for, so the message an
|
|
23
|
+
* app shows can name the install line rather than saying "not found".
|
|
24
|
+
*/
|
|
25
|
+
export class BackendUnavailableError extends Error {
|
|
26
|
+
tried;
|
|
27
|
+
constructor(what, tried) {
|
|
28
|
+
super(`@react-x11/components: no ${what} backend is installed — looked for ` +
|
|
29
|
+
`${tried.join(', ')}. Install one, or pass \`fallback\` to render ` +
|
|
30
|
+
'something else.');
|
|
31
|
+
this.name = 'BackendUnavailableError';
|
|
32
|
+
this.tried = tried;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Run a program inside a `<foreign>`.
|
|
37
|
+
*
|
|
38
|
+
* ```jsx
|
|
39
|
+
* const client = useEmbeddedClient({ plan });
|
|
40
|
+
* return <foreign onReady={client.handleReady} style={{ flexGrow: 1 }} />;
|
|
41
|
+
* ```
|
|
42
|
+
*
|
|
43
|
+
* The `<foreign>` is rendered by the caller rather than here, because the
|
|
44
|
+
* element's props — style, focus, the `onEmbedded`/`onClientGone` handlers a
|
|
45
|
+
* component may want to compose with — belong to the component, not to the
|
|
46
|
+
* lifecycle.
|
|
47
|
+
*/
|
|
48
|
+
export function useEmbeddedClient(options) {
|
|
49
|
+
const { plan, enabled = true, stopSignal = 'SIGTERM' } = options;
|
|
50
|
+
const host = useMemo(() => options.host ?? nodeProcessHost(), [options.host]);
|
|
51
|
+
const [windowId, setWindowId] = useState(null);
|
|
52
|
+
const [status, setStatus] = useState('idle');
|
|
53
|
+
const [error, setError] = useState(null);
|
|
54
|
+
const [pid, setPid] = useState(null);
|
|
55
|
+
const [backend, setBackend] = useState(null);
|
|
56
|
+
const [generation, setGeneration] = useState(0);
|
|
57
|
+
// The live child, for `signal()`. A ref rather than state because a caller
|
|
58
|
+
// reaching for it through a handle is not rendering, and re-rendering the
|
|
59
|
+
// tree because a pid arrived would be work for nothing.
|
|
60
|
+
const processRef = useRef(null);
|
|
61
|
+
// Handlers are read at the moment they fire, so a component that passes a
|
|
62
|
+
// fresh arrow function every render does not restart its child.
|
|
63
|
+
const handlers = useRef(options);
|
|
64
|
+
handlers.current = options;
|
|
65
|
+
const handleReady = useCallback((info) => {
|
|
66
|
+
setWindowId(info.windowId);
|
|
67
|
+
}, []);
|
|
68
|
+
const restart = useCallback(() => setGeneration((n) => n + 1), []);
|
|
69
|
+
const signal = useCallback((sig = 'SIGTERM') => {
|
|
70
|
+
const child = processRef.current;
|
|
71
|
+
return child ? child.kill(sig) : false;
|
|
72
|
+
}, []);
|
|
73
|
+
useEffect(() => {
|
|
74
|
+
if (!enabled || windowId === null) {
|
|
75
|
+
setStatus('idle');
|
|
76
|
+
return undefined;
|
|
77
|
+
}
|
|
78
|
+
let live = true;
|
|
79
|
+
let child = null;
|
|
80
|
+
let detach;
|
|
81
|
+
let planned = null;
|
|
82
|
+
const fail = (err, next) => {
|
|
83
|
+
const wrapped = err instanceof Error ? err : new Error(String(err));
|
|
84
|
+
if (!live)
|
|
85
|
+
return;
|
|
86
|
+
setError(wrapped);
|
|
87
|
+
setStatus(next);
|
|
88
|
+
handlers.current.onError?.(wrapped);
|
|
89
|
+
};
|
|
90
|
+
void (async () => {
|
|
91
|
+
setStatus('starting');
|
|
92
|
+
setError(null);
|
|
93
|
+
try {
|
|
94
|
+
planned = await plan({ windowId, host });
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
// "no xterm on this machine" is not the same kind of news as "spawn
|
|
98
|
+
// failed", and only one of the two is worth a fallback.
|
|
99
|
+
fail(err, err instanceof BackendUnavailableError ? 'unavailable' : 'exited');
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
if (!live) {
|
|
103
|
+
await planned.dispose?.();
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
try {
|
|
107
|
+
child = await host.spawn(planned.command, planned.args, {
|
|
108
|
+
cwd: planned.cwd,
|
|
109
|
+
env: planned.env,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
await planned.dispose?.();
|
|
114
|
+
fail(err, 'exited');
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
// Unmounted while `spawn` was in flight: nothing rendered it, so
|
|
118
|
+
// nothing should outlive it.
|
|
119
|
+
if (!live) {
|
|
120
|
+
child.kill(stopSignal);
|
|
121
|
+
await planned.dispose?.();
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
processRef.current = child;
|
|
125
|
+
setPid(child.pid);
|
|
126
|
+
setBackend(planned.backend ?? null);
|
|
127
|
+
setStatus('running');
|
|
128
|
+
child.onExit((info) => {
|
|
129
|
+
if (!live)
|
|
130
|
+
return;
|
|
131
|
+
processRef.current = null;
|
|
132
|
+
setStatus('exited');
|
|
133
|
+
setPid(null);
|
|
134
|
+
handlers.current.onExit?.(info);
|
|
135
|
+
});
|
|
136
|
+
child.onError((err) => fail(err, 'exited'));
|
|
137
|
+
handlers.current.onStart?.({ process: child, backend: planned.backend });
|
|
138
|
+
try {
|
|
139
|
+
const opened = await planned.attach?.(child);
|
|
140
|
+
// Opening a control channel can take seconds — the socket does not
|
|
141
|
+
// exist until the player creates it — so the teardown below may
|
|
142
|
+
// already have run with nothing to tear down. Closing it here is the
|
|
143
|
+
// only chance there will be.
|
|
144
|
+
if (live)
|
|
145
|
+
detach = opened;
|
|
146
|
+
else
|
|
147
|
+
opened?.();
|
|
148
|
+
}
|
|
149
|
+
catch (err) {
|
|
150
|
+
// A control channel that would not open is a degraded player, not a
|
|
151
|
+
// dead one: the video is already on screen.
|
|
152
|
+
fail(err, 'running');
|
|
153
|
+
}
|
|
154
|
+
})();
|
|
155
|
+
return () => {
|
|
156
|
+
live = false;
|
|
157
|
+
processRef.current = null;
|
|
158
|
+
// Order matters: drop the control channel first, so a socket close
|
|
159
|
+
// triggered by the signal is not reported as the player failing.
|
|
160
|
+
try {
|
|
161
|
+
detach?.();
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
// a channel that is already gone
|
|
165
|
+
}
|
|
166
|
+
child?.kill(stopSignal);
|
|
167
|
+
void planned?.dispose?.();
|
|
168
|
+
};
|
|
169
|
+
// `plan` is the restart signal — see the note on the option.
|
|
170
|
+
}, [enabled, windowId, plan, host, stopSignal, generation]);
|
|
171
|
+
return {
|
|
172
|
+
status,
|
|
173
|
+
error,
|
|
174
|
+
pid,
|
|
175
|
+
windowId,
|
|
176
|
+
backend,
|
|
177
|
+
handleReady,
|
|
178
|
+
restart,
|
|
179
|
+
signal,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* The first of `candidates` that is installed, or a `BackendUnavailableError`
|
|
184
|
+
* naming all of them.
|
|
185
|
+
*
|
|
186
|
+
* Auto-detection rather than a hard dependency is the whole reason both
|
|
187
|
+
* components take a `backend` prop that defaults to `'auto'`: this package
|
|
188
|
+
* cannot depend on a binary, and most machines have exactly one of the ones
|
|
189
|
+
* it can drive.
|
|
190
|
+
*/
|
|
191
|
+
export async function resolveBackend(host, what, candidates) {
|
|
192
|
+
const tried = [];
|
|
193
|
+
for (const backend of candidates) {
|
|
194
|
+
for (const binary of backend.binaries) {
|
|
195
|
+
tried.push(binary);
|
|
196
|
+
const path = await host.which(binary);
|
|
197
|
+
if (path)
|
|
198
|
+
return { backend, path };
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
throw new BackendUnavailableError(what, tried);
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/embed/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/** How a spawned child ended. */
|
|
2
|
+
export interface ExitInfo {
|
|
3
|
+
/** Exit status, or `null` when a signal ended it. */
|
|
4
|
+
code: number | null;
|
|
5
|
+
/** The signal that ended it, or `null`. */
|
|
6
|
+
signal: string | null;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* A running child, reduced to what an embedded client needs: its pid, a way
|
|
10
|
+
* to signal it, and the two things that can happen to it.
|
|
11
|
+
*
|
|
12
|
+
* Deliberately not node's `ChildProcess`. Listener registration is a method
|
|
13
|
+
* per event rather than an `EventEmitter`, so a fake is a dozen lines and
|
|
14
|
+
* cannot accidentally rely on emitter behaviour (`once`, `removeAllListeners`,
|
|
15
|
+
* the `error`-with-no-listener throw) that the real one has and a fake would
|
|
16
|
+
* have to reimplement.
|
|
17
|
+
*/
|
|
18
|
+
export interface SpawnedProcess {
|
|
19
|
+
readonly pid: number | null;
|
|
20
|
+
/** POSIX signal name. Returns whether it was delivered. */
|
|
21
|
+
kill(signal?: string): boolean;
|
|
22
|
+
onExit(listener: (info: ExitInfo) => void): void;
|
|
23
|
+
onError(listener: (err: Error) => void): void;
|
|
24
|
+
}
|
|
25
|
+
export interface SpawnOptions {
|
|
26
|
+
cwd?: string;
|
|
27
|
+
/**
|
|
28
|
+
* Added to the ambient environment rather than replacing it: a terminal
|
|
29
|
+
* with no `PATH` and no `HOME` is not a terminal. An explicit `undefined`
|
|
30
|
+
* removes a variable.
|
|
31
|
+
*/
|
|
32
|
+
env?: Record<string, string | undefined>;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* A line-oriented control channel to a player process — mpv's JSON IPC, VLC's
|
|
36
|
+
* rc interface. Text in, text out, and no framing: the protocols disagree
|
|
37
|
+
* about what a message is, so splitting is the caller's.
|
|
38
|
+
*/
|
|
39
|
+
export interface IpcSocket {
|
|
40
|
+
write(data: string): void;
|
|
41
|
+
onData(listener: (chunk: string) => void): void;
|
|
42
|
+
onClose(listener: () => void): void;
|
|
43
|
+
close(): void;
|
|
44
|
+
}
|
|
45
|
+
/** A private directory to put a control socket in, and how to remove it. */
|
|
46
|
+
export interface ScratchSocket {
|
|
47
|
+
path: string;
|
|
48
|
+
dispose(): Promise<void>;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Everything the embedded-client components do outside their own process.
|
|
52
|
+
*
|
|
53
|
+
* Every method is async, including the ones whose node counterparts are not:
|
|
54
|
+
* the node modules behind them are loaded lazily (see the file comment), so
|
|
55
|
+
* the first call is a dynamic `import()` however synchronous `spawn` itself
|
|
56
|
+
* is. Nothing here runs during render, so the cost is invisible.
|
|
57
|
+
*/
|
|
58
|
+
export interface ProcessHost {
|
|
59
|
+
/**
|
|
60
|
+
* The absolute path `command` resolves to on `PATH`, or `null` when it is
|
|
61
|
+
* not installed. A command containing a slash is tested as-is.
|
|
62
|
+
*/
|
|
63
|
+
which(command: string): Promise<string | null>;
|
|
64
|
+
spawn(command: string, args: readonly string[], options?: SpawnOptions): Promise<SpawnedProcess>;
|
|
65
|
+
/** A path in a fresh private directory, for a child to create a socket at. */
|
|
66
|
+
socketPath(prefix: string): Promise<ScratchSocket>;
|
|
67
|
+
/** Connect to a unix socket a child created. Rejects if it is not there. */
|
|
68
|
+
connect(path: string): Promise<IpcSocket>;
|
|
69
|
+
/** The ambient environment, for defaults and for `PATH`. */
|
|
70
|
+
environment(): Record<string, string | undefined>;
|
|
71
|
+
}
|
|
72
|
+
/** Thrown when a control socket does not appear. */
|
|
73
|
+
export declare class IpcConnectError extends Error {
|
|
74
|
+
constructor(path: string, cause?: unknown);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* The real one: node's `child_process`, `fs`, `net` and `os`.
|
|
78
|
+
*
|
|
79
|
+
* Cached, because it holds nothing per-caller and the module loads it does are
|
|
80
|
+
* worth doing once. An app that wants a *different* host (a container, a
|
|
81
|
+
* remote shell) passes it as the `processes` prop instead of replacing this.
|
|
82
|
+
*/
|
|
83
|
+
export declare function nodeProcessHost(): ProcessHost;
|
|
84
|
+
/**
|
|
85
|
+
* Retry `connect` until the child has created its socket.
|
|
86
|
+
*
|
|
87
|
+
* Every player here is given a socket path and creates it *itself*, some
|
|
88
|
+
* milliseconds after it starts — so the first connect always loses the race,
|
|
89
|
+
* and "the socket is not there yet" and "the player failed to start" look
|
|
90
|
+
* identical for that window. Polling with a deadline is what separates them.
|
|
91
|
+
*/
|
|
92
|
+
export declare function connectWhenReady(host: ProcessHost, path: string, options?: {
|
|
93
|
+
timeoutMs?: number;
|
|
94
|
+
intervalMs?: number;
|
|
95
|
+
}): Promise<IpcSocket>;
|
|
96
|
+
//# sourceMappingURL=host.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/embed/host.ts"],"names":[],"mappings":"AAwBA,iCAAiC;AACjC,MAAM,WAAW,QAAQ;IACvB,qDAAqD;IACrD,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,2CAA2C;IAC3C,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,2DAA2D;IAC3D,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC/B,MAAM,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,GAAG,IAAI,CAAC;IACjD,OAAO,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAAC;CAC/C;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CAC1C;AAED;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAChD,OAAO,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IACpC,KAAK,IAAI,IAAI,CAAC;CACf;AAED,4EAA4E;AAC5E,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC/C,KAAK,CACH,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,cAAc,CAAC,CAAC;IAC3B,8EAA8E;IAC9E,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACnD,4EAA4E;IAC5E,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAC1C,4DAA4D;IAC5D,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CACnD;AAsGD,oDAAoD;AACpD,qBAAa,eAAgB,SAAQ,KAAK;IACxC,YAAY,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,EAGxC;CACF;AA+ED;;;;;;GAMG;AACH,wBAAgB,eAAe,IAAI,WAAW,CA0G7C;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GACxD,OAAO,CAAC,SAAS,CAAC,CAcpB"}
|