text:
[docs] Demo SearchIcons crashes

[ ] I have searched for similar issues in this repository and believe that this is not a duplicate.

Steps to Reproduce

Visit https://mui.com/components/material-icons/?query=play
Search for "play" icons
Select the "PlayCircle" icon
demo SearchIcons crashes

Your Environment

Tech
Version

MUI
v5.5.0

netlify deploy
https://622bf492b027b5000960dea3--material-ui-docs.netlify.app

Browser
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36

It worked after the third try.

same problem for me even after several tries and on several Icons

Duplicate of #31562


text:
[IconButton] focusVisible bug when transitioning

Duplicates

[X] I have searched the existing issues

Latest version

[X] I have tested the latest version

Steps to reproduce 🕹
Link to live example: https://codesandbox.io/s/mui-icon-button-bug-28epxe?file=/demo.tsx
Steps:

Reload the Page frame using the code sandbox browser!
The focusVisible animation is badly offset
This is likely because positioning is calulated while still in transition
.

Current behavior 😯
The IconButton focusVisible animation is badly offset.
Expected behavior 🤔
focusVisible animation is centered around the IconButton.
Context 🔦
No response
Your environment 🌎
No response

@tlthiem Well you are using Grow  and it is responsible of changing the initial scale of your button icon.
It depends about your needs but if you really need to use Grow just put your inital style with scale equal 1 like this example below:
<Grow in style={{ transform: "scale(1)" }}>
  <IconButton ref={refbt} autoFocus>
    <DeleteIcon />
  </IconButton>
</Grow>

@SaidMarar Thanks. It works well for me. Here is the CodeSandbox: https://codesandbox.io/s/mui-icon-button-bug-forked-dn5p4z?file=/demo.tsx.
@tlthiem Does it help? I am closing this issue. If you still face the issue with this, we can re-open it.

@ZeeshanTamboli Yes, this helps. However I would still expect this to be a bug worth fixing entirely. Especially because the fix alters the Grow transitions look and feel.
This occurs in every Dropdown menu with a (pre) focused item for example. A pretty broad use case imo.
I have not looked into it, but I'd think it has to be possible to design the button touch ripple in a way that is consistent regardless of scale, transforms, etc.

source: gharchive/issue

authors: SaidMarar ZeeshanTamboli tlthiem

repo: mui/material-ui

license: MIT

license_type: permissive

license_source: github-api


text:
MUI X Date Pickers Pro not working with Joy UI

Duplicates

[X] I have searched the existing issues

Latest version

[X] I have tested the latest version

Steps to reproduce 🕹
Link to live example:
https://codesandbox.io/s/mui-joy-mui-x-date-pickers-pro-not-working-vmzlvy?file=/src/App.tsx
Steps:

Install latest versions of Joy UI and Date Pickers Pro X
Insert LocalizationProvider as a child of CssVarsProvider
Insert DateRangePicker as a child of LocalizationProvider

Versions:

"@emotion/react": "11.10.6",
"@emotion/styled": "11.10.6",
"@mui/joy": "5.0.0-alpha.70",
"@mui/material": "5.11.12",
"@mui/x-date-pickers-pro": "6.0.1",

Current behavior 😯
Undefined property errors:

TypeError Cannot read properties of undefined (reading 'create')
TypeError Cannot read properties of undefined (reading 'borderRadius')

Expected behavior 🤔
DatePicker should appear and no errors should be shown.
Context 🔦
Trying to use a Date Picker Pro X in a Joy UI project. This worked before with other versions, but I cannot for the life of me reproduce a working version.
Your environment 🌎
No response

Problem was because of breaking changes in #35739. Had to merge mui theme like is done here: Joy UI feat. Material UI sandbox


text:
[Pickers] Fix onDismiss handler Mobile && Desktop

Closes: https://github.com/mui/material-ui/issues/31278

[x] I have followed (at least) the PR section of the contributing guide.

Demo: https://deploy-preview-31793--material-ui.netlify.app/components/date-picker/

Any news?

The date pickers are being moved in https://github.com/mui/mui-x. Would be great if you can re-open the PR there once they are established there. Thank you! cc @flaviendelangle

source: gharchive/pull-request

authors: BLRplex abhinav-22-tech mnajdova


text:
[Unstable_Gridv2] sorted responsize keys based on breakpoint value

Fixes : https://github.com/mui/material-ui/issues/34928
Proof: https://codesandbox.io/s/vigorous-morning-3d8wq4

[x] I have followed (at least) the PR section of the contributing guide.

hey thanks for approval, looking forward for more contribution

hey @siriwatknp any idea when this PR can be merged?


text:
API to create embeddable charts

Similar to the badges endpoint there should be a way to display a static SVG chart generated by Hakatime into another website.
This could be any of the existing charts already available on the dashboard interface.

Is there any progress?

authors: WankkoRee mujx

repo: mujx/hakatime

license: Unlicense


text:
Replace string ref usage with callback refs

Hi,
Setting element refs using "String Refs" is considered legacy API by React and is generally discouraged due to certain issues.
We personally ran into issues in our own setup, where the usage of string refs caused the following error to appear when ReactTelephoneInput was mounted in a our larger application, bundled with browserfiy:
removeComponentAsRefFrom(...): Only a ReactOwner can have refs. You might be removing a ref to a component that was not created inside a component's `render` method, or you have multiple copies of React loaded (details: https://fb.me/react-refs-must-have-owner).

I did not dig any deeper into the exact root cause of this, and perhaps this has something to do with the structure of our project. However, using callback refs in telephone input has solved the issue for us and it seems to be a reasonable solution, considering the currently used API will be deprecated at some point.
Thanks

@ablamunits I have completely removed the dependency on react-dom and also removed all the refs on all the list items. Have switched to using react-tiny-virtual-list, which implements windowing on the list and hence is much more performant. Win-win.

authors: ablamunits mukeshsoni

repo: mukeshsoni/react-telephone-input

license: mit

license_source: bigquery


text:
mull-cxx: Address Sanitizer crashes at the start in libEBC related code

I am using the fmt example from the README page. Here is the stacktrace:
./fmt.sh
++ /tmp/build.mull.clion.dir/tools/driver-cxx/mull-cxx -test-framework=GoogleTest -mutators=default -compdb-path compile_commands.json '-compilation-flags=    -isystem /opt/llvm/7.0.0/include/c++/v1     -isystem /opt/llvm-7.0.0/lib/clang/7.0.0/include/     -isystem /opt/llvm-7.0.0/include/c++/v1     -isystem /usr/include' ./bin/core-test
Extracting bitcode from executable (threads: 1): 0/1=================================================================
==82599==ERROR: AddressSanitizer: container-overflow on address 0x608000001a68 at pc 0x0001061a56df bp 0x7ffeedd97f70 sp 0x7ffeedd97720
READ of size 24 at 0x608000001a68 thread T0
    #0 0x1061a56de in __asan_memcpy (libclang_rt.asan_osx_dynamic.dylib:x86_64h+0x596de)
    #1 0x101e84656 in std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::basic_string(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&&) string:1854
    #2 0x101e845cc in std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::basic_string(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&&) string:1855
    #3 0x101e9a0e0 in void std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::construct<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&&) memory:1825
    #4 0x101e9a08f in void std::__1::allocator_traits<std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >::__construct<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::integral_constant<bool, true>, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&&) memory:1717
    #5 0x101e99fb9 in void std::__1::allocator_traits<std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >::construct<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&&) memory:1560
    #6 0x101e99aa8 in void std::__1::allocator_traits<std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >::__construct_backward<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*>(std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*&) memory:1679
    #7 0x101e98dea in std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >::__swap_out_circular_buffer(std::__1::__split_buffer<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >&>&) vector:931
    #8 0x101ef23fb in void std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >::__push_back_slow_path<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&&) vector:1615
    #9 0x101f03d58 in std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >::push_back(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&&) vector:1652
    #10 0x101f03beb in ebc::util::xml::GetTextFromNodesWithName(_xmlNode*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) Xml.cpp:56
    #11 0x101ee7c18 in ebc::BitcodeMetadata::GetCommands(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) const BitcodeMetadata.cpp:82
    #12 0x101ee7d17 in ebc::BitcodeMetadata::GetClangCommands(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) const BitcodeMetadata.cpp:89
    #13 0x101edc1c6 in ebc::BitcodeArchive::GetRawEmbeddedFiles() const BitcodeArchive.cpp:127
    #14 0x101ea2b88 in main::$_0::operator()() const driver-cxx.cpp:229
    #15 0x101ea275c in decltype(std::__1::forward<main::$_0&>(fp)()) std::__1::__invoke<main::$_0&>(main::$_0&&&) type_traits:4339
    #16 0x101ea270c in void std::__1::__invoke_void_return_wrapper<void>::__call<main::$_0&>(main::$_0&&&) __functional_base:349
    #17 0x101e9f690 in std::__1::__function::__func<main::$_0, std::__1::allocator<main::$_0>, void ()>::operator()() functional:1562
    #18 0x101e84add in std::__1::function<void ()>::operator()() const functional:1913
    #19 0x101e6c2d5 in mull::TaskExecutor<mull::SingleTaskTag>::execute() TaskExecutor.h:115
    #20 0x101e6a831 in main driver-cxx.cpp:237
    #21 0x7fff61c64ed8 in start (libdyld.dylib:x86_64+0x16ed8)

0x608000001a68 is located 72 bytes inside of 96-byte region [0x608000001a20,0x608000001a80)
allocated by thread T0 here:
    #0 0x1061b4b92 in wrap__Znwm (libclang_rt.asan_osx_dynamic.dylib:x86_64h+0x68b92)
    #1 0x101e75d28 in std::__1::__libcpp_allocate(unsigned long, unsigned long) new:252
    #2 0x101e998b3 in std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::allocate(unsigned long, void const*) memory:1813
    #3 0x101e99740 in std::__1::allocator_traits<std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >::allocate(std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >&, unsigned long) memory:1546
    #4 0x101e994fb in std::__1::__split_buffer<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >&>::__split_buffer(unsigned long, unsigned long, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >&) __split_buffer:311
    #5 0x101e98d1c in std::__1::__split_buffer<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >&>::__split_buffer(unsigned long, unsigned long, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >&) __split_buffer:310
    #6 0x101ef23ac in void std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >::__push_back_slow_path<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&&) vector:1611
    #7 0x101f03d58 in std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >::push_back(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&&) vector:1652
    #8 0x101f03beb in ebc::util::xml::GetTextFromNodesWithName(_xmlNode*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) Xml.cpp:56
    #9 0x101ee7c18 in ebc::BitcodeMetadata::GetCommands(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) const BitcodeMetadata.cpp:82
    #10 0x101ee7d17 in ebc::BitcodeMetadata::GetClangCommands(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) const BitcodeMetadata.cpp:89
    #11 0x101edc1c6 in ebc::BitcodeArchive::GetRawEmbeddedFiles() const BitcodeArchive.cpp:127
    #12 0x101ea2b88 in main::$_0::operator()() const driver-cxx.cpp:229
    #13 0x101ea275c in decltype(std::__1::forward<main::$_0&>(fp)()) std::__1::__invoke<main::$_0&>(main::$_0&&&) type_traits:4339
    #14 0x101ea270c in void std::__1::__invoke_void_return_wrapper<void>::__call<main::$_0&>(main::$_0&&&) __functional_base:349
    #15 0x101e9f690 in std::__1::__function::__func<main::$_0, std::__1::allocator<main::$_0>, void ()>::operator()() functional:1562
    #16 0x101e84add in std::__1::function<void ()>::operator()() const functional:1913
    #17 0x101e6c2d5 in mull::TaskExecutor<mull::SingleTaskTag>::execute() TaskExecutor.h:115
    #18 0x101e6a831 in main driver-cxx.cpp:237
    #19 0x7fff61c64ed8 in start (libdyld.dylib:x86_64+0x16ed8)

HINT: if you don't care about these errors you may set ASAN_OPTIONS=detect_container_overflow=0.
If you suspect a false positive see also: https://github.com/google/sanitizers/wiki/AddressSanitizerContainerOverflow.
SUMMARY: AddressSanitizer: container-overflow (libclang_rt.asan_osx_dynamic.dylib:x86_64h+0x596de) in __asan_memcpy
Shadow bytes around the buggy address:
  0x1c10000002f0: fa fa fa fa fd fd fd fd fd fd fd fd fd fd fd fa
  0x1c1000000300: fa fa fa fa fd fd fd fd fd fd fd fd fd fd fd fa
  0x1c1000000310: fa fa fa fa fd fd fd fd fd fd fd fd fd fd fd fa
  0x1c1000000320: fa fa fa fa fd fd fd fd fd fd fd fd fd fd fd fa
  0x1c1000000330: fa fa fa fa 00 00 00 00 00 00 00 00 00 00 00 fa
=>0x1c1000000340: fa fa fa fa 00 00 00 00 00 00 00 00 00[fc]fc fc
  0x1c1000000350: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x1c1000000360: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x1c1000000370: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x1c1000000380: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x1c1000000390: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07
  Heap left redzone:       fa
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe
  Left alloca redzone:     ca
  Right alloca redzone:    cb
  Shadow gap:              cc
==82599==ABORTING
./fmt.sh: line 11: 82599 Abort trap: 6           /tmp/build.mull.clion.dir/tools/driver-cxx/mull-cxx -test-framework=GoogleTest -mutators=default -compdb-path compile_commands.json -compilation-flags="    -isystem /opt/llvm/7.0.0/include/c++/v1     -isystem /opt/llvm-7.0.0/lib/clang/7.0.0/include/     -isystem /opt/llvm-7.0.0/include/c++/v1     -isystem /usr/include" ./bin/core-test
++ false

This is how I enabled Address Sanitizer:
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8efdbb3..6b3ae44 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -140,7 +140,7 @@ endif()

 set(MULL_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})

-set (MULL_CXX_FLAGS "-std=c++11 -fPIC -fvisibility-inlines-hidden -fno-exceptions")
+set (MULL_CXX_FLAGS "-std=c++11 -fPIC -fvisibility-inlines-hidden -fno-exceptions -fsanitize=address")
 if (NOT LLVM_ENABLE_RTTI)
   set(MULL_CXX_FLAGS "${MULL_CXX_FLAGS} -fno-rtti")
 endif()
@@ -148,7 +148,7 @@ if (MULL_BUILD_32_BITS)
   set(MULL_CXX_FLAGS "${MULL_CXX_FLAGS} -m32")
 endif()

-set (MULL_LINK_FLAGS "-rdynamic")
+set (MULL_LINK_FLAGS "-rdynamic -fsanitize=address")
 if (MULL_BUILD_32_BITS)
   set(MULL_LINK_FLAGS "${MULL_LINK_FLAGS} -m32")
 endif()

This seems to be a duplicate of #614.

This seems to be a duplicate of #614.

repo: mull-project/mull


text:
mulle-sde test init does not use PREFERRED_STARTUP_LIBRARY

Should have used MulleObjC-startup but used Foundation-startup.

Fixed

authors: mulle-kybernetik-tv mulle-nat

repo: mulle-sde/mulle-test


text:
Messages being broadcast to consumers in same group

I have two consumers in the same group and both are receiving each message that I push up into the queue. I am consuming the message on consumer 1 and committing the consumption to Kafka, then checking pending messages and verifying that it is at 0. Consumer 2 is constantly checking pending messages, and never goes down after a message has been pushed, despite appropriate message consumption from consumer 1.
Restarting consumer 2 resets pending message counter back to 0, which validates that the commit logic is working appropriately.
Kafka v 0.8.1.1
kafka-python release 0.9.x

Can confirm, I'm seeing the same thing on the same server version. Auto-commiting or commiting each message after print(), makes no difference. Both consumers get all messages.

This is expected -- consumer coordination is not natively supported by kafka-python. See #455 and #38 .

authors: bgdnlp dpkp nursejason

repo: mumrah/kafka-python


text:
Error on evaluating expressions on console

Example:
ム X = 4.
ERROR: writeBinding/1: Undefined procedure: compound_name_arguments/3
Exception: (8) compound_name_arguments('X'=4, =, [_G1004, _G1007]) ? EOF: exit

This happens always, regardless of the final dot presence.

Could we fix this and add an integration test?

BTW, this may see a SWI prolog version issue. In which SWI prolog version was compound_name_arguments introduced?

Yes, you are right it was introduced in the 7.XX version acording to this link: http://www.swi-prolog.org/pldoc/doc_for?object=compound_name_arguments/3 (it's tagged SWI7), can we update prolog production version?, and put it in a git module so we can update it easier next time?.

Hmm, it is not that easy because we need to recompile prolog within Heroku. I is a time consuming, manual task.
If there is no other option I will do that, but could we try to use another predicate?

This looks like a winner: http://www.swi-prolog.org/pldoc/man?predicate=%3D../2
I will research more this afternoon, and try to use it

Awesome!

Yeah, @PalumboN loves =..

authors: flbulgarelli gcrespi

repo: mumuki/mumuki-plunit-server


text:
yt-dlp - Prefetch next tracks sooner to preclude long silence when skipping tracks

What version of Music Assistant has the issue?
2.1.0b8
What version of the Home Assistant Integration have you got installed?
2024.6.2
Have you tried everything in the Troubleshooting FAQ and reviewed the Open and Closed Issues and Discussions to resolve this yourself?

[X] Yes

The problem
With the new yt-dlp, the track prefetch is very slow (VM with ample resources and a gigabit internet connection). This, on it's own, is fine, but causes headache when skipping tracks.
Is it possible to:

Set next track prefetch to start immediately after the current track is fetched and starts playing - so it is ready in case we skip the currently playing track as soon as it starts

Provide an option that specifies how many tracks beyond the currently playing track we want prefetched - assuming this is consuming either disk or RAM for the prefetch, those of us with more generous builds can prefetch, say, up to 5 tracks in the upcoming queue, so if we skip more than one, playback of the next track is still quick

How to reproduce
Play YT music
Await track to start
Skip
wait again for multiple seconds, sometimes 10+ before next track begins playback because it was not prefetched early enough
Music Providers
YTM
Player Providers
Google Cast
Full log output
No response
Additional information
No response
What version of Home Assistant Core are your running
2024.6.4
What type of installation are you running?
Home Assistant OS
On what type of hardware are you running?
Linux

Quick questions before I am gonna try reproducing this , since I noticed slowdown during development when running in a debug environment.

Do you have debug logging enabled? Either globally or in YT Music provider?
You say you're running on a VM. Are you running MA on a VM or are you running it as an addon within MA? If the first, do you experience the same slowdown if you run MA in the addon?

Do you have debug logging enabled? Either globally or in YT Music provider?

I experienced this with debug off across the board. I turned on debug to check for errors, which had no effect on the delay, which existed before I turned debug on.

You say you're running on a VM. Are you running MA on a VM or are you running it as an addon within MA? If the first, do you experience the same slowdown if you run MA in the addon?

My apologies. I always jumble the terms around. I am running HAOS within a virtualbox VM on a linux host and MA is running as add-on container within HAOS. Nothing special.
I had nearly zero delays with the previous yt library. It was only upon switching to the latest version with yt-dlp do I see the long delays on fetching tracks.

@tronikos Ouch, seems there are some delays with the new setup. Strange thing is that is working within 2-3 on my NUC + Proxmox + HAOS.
@TheWebMachine what hardware are you running your VM on? Also, when you enable debug logging, can you include a log after you are trying to play a track?

@TheWebMachine what hardware are you running your VM on? Also, when you enable debug logging, can you include a log after you are trying to play a track?

Oh, the VM is running on a beasty AMD R9 5900 host system and has the following assigned to it: 4 CPU cores, 8GiB RAM, direct bridged network adapter with static IP on the LAN
HA routinely pulls a CPU load of less than 10% with RAM usage around 20%. The MA add-on is pulling the following:
While fetching - about 20-40% CPU
After fetching while playing a track - less than 1% CPU
(RAM remains pretty constant)
This log begins from the time I click to skip to the next track and ends a few seconds after playback begins:
MA-Debug-log-2.1.0b8.txt

In the VS code debugger I was seeing a delay of 30s. Running it directly on my dev machine I was seeing a delay of 2-5s. I just updated beta on my prod machine (i7 1.8 GHz, 4GB) that runs bare metal HAOS and I'm seeing a delay of 8-10s.

8-10s is in line with what I'm experiencing most of the time. I don't think it's a resource bottleneck on the part of the hardware, though. Again, during normal playback, it isn't an issue, as prefetch is happening early enough. But, when trying to skip tracks, the delay is annoying. Especially since the current track continues to play after you click next...then 8-10s later the next track randomly starts playing.
If you click next a few times rapidly (like I did before I knew what was happening), then you experience a super long delay, as it prefetches before realizing you hit more than one skip, then just starts prefetching the next one, and the next, and the next, until it exhausts the skips...while keeping you in silence the whole time.

This is why I propose proactively prefetching as many tracks ahead as we reasonably can (3-5 would be nice) while the current track is playing. Then, you'd have to hit next the 3-5x before you exhausted the prefetch cache and experienced a delay (at least beyond the first track you start playing, as that will always have a prefech silence before sound is heard).
What is our limiting factor in prefetching multiple tracks in succession? RAM? Storage?

Just to be super clear here, the delay is caused by resolving a stream url for a track, not playing back the actual audio from a given stream url. There's a lot of decryption and cipher magic happening in the background that involves downloading youtube source code to figure out decryption keys. This is CPU intensive and might explain why we are seeing higher delays on other systems. Once the url is resolved, the stream url itself starts instantly.
We could pre-fetch a couple of stream urls that are in the active queue, but this requires a change in the logic of handling the queue and only has a positive effect on YT Music, since it is not required for any other music providers. @marcelveldt any thoughts on this?

In the meantime shall we add back the support for using the pytube library and default to it?

In the meantime shall we add back the support for using the pytube library and default to it?

I was having no issues with pytube. Perhaps add an advanced option in YTM provider to switch between libraries and/or default to pytube. This way we can quickly switch if pytube quits working in the future.

In the meantime shall we add back the support for using the pytube library and default to it?

Yeah sounds like a plan. Won't be later this week until I have time to add that back in.

@tronikos Do you think we can speed up yt dlp by providing some clever options? I came across quite some stuff we can try:

https://github.com/yt-dlp/yt-dlp/issues/4274
https://stackoverflow.com/questions/77209653/how-yt-dlp-provides-faster-search-results

This file can be used to translate the cli flags/options to python options: https://github.com/yt-dlp/yt-dlp/blob/f3411af12e209bc5624e1ac31271b8aabe2d3c90/yt_dlp/options.py#L355

Okay I figured something out. I am now forcing the ios client to obtain stream urls and I get 2 secs in the debugger and somewhere between 1-2sec on a  prd like environment
@TheWebMachine are you comfortable with installing the dev addon to give this a go on your setup? If you go to the addon configuration page you can use fix/ytdlp_delays as the branch name.

Installed and waiting for it to build out and start...
I simply stopped the main add-on while testing dev; hopefully this doesn't cause any issues.
Will report back shortly...

Yep that should work fine. It's a separate addon / environment so you'll
have to setup YT Music again.
Op di 25 jun 2024 om 19:43 schreef TheWebMachine @.***>

Installed and waiting for it to build out and start...
I simply stopped the main add-on while testing dev; hopefully this doesn't
cause any issues.
Will report back shortly...
—
Reply to this email directly, view it on GitHub
https://github.com/music-assistant/hass-music-assistant/issues/2536#issuecomment-2189595497,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AEG2MJZCUUGL6BLCK5CR25LZJGT4FAVCNFSM6AAAAABJ2WPH3CVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDCOBZGU4TKNBZG4
.
You are receiving this because you were assigned.Message ID:
@.***>

Yeah, immediately ran into issues:
First setup of YTM provider went fine, but loaded no playlists. Restarting dev add-on resulted in this error:
2024-06-25 12:47:58.813 ERROR (MainThread) [music_assistant] Error loading provider(instance) YouTube Music: Provider ytmusic did not load within 30 seconds
Attempted to rebuild add-on and started getting this error:
2024-06-25 12:50:57.668 ERROR (MainThread) [music_assistant] Error doing task: Task exception was never retrieved Traceback (most recent call last):   File "/usr/local/lib/python3.12/site-packages/aiorun.py", line 219, in new_coro     await coro   File "/usr/local/lib/python3.12/site-packages/music_assistant/__main__.py", line 212, in start_mass     await mass.start()   File "/usr/local/lib/python3.12/site-packages/music_assistant/server/server.py", line 160, in start     await self._load_providers()   File "/usr/local/lib/python3.12/site-packages/music_assistant/server/server.py", line 510, in _load_providers     await self.config.create_builtin_provider_config(prov_manifest.domain)   File "/usr/local/lib/python3.12/site-packages/music_assistant/server/controllers/config.py", line 488, in create_builtin_provider_config     for _ in await self.get_provider_configs(provider_domain=provider_domain):              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^   File "/usr/local/lib/python3.12/site-packages/music_assistant/server/controllers/config.py", line 171, in get_provider_configs     and (provider_domain is None or prov_conf["domain"] == provider_domain)                                     ~~~~~~~~~^^^^^^^^^^ KeyError: 'domain'
Blowing out the whole dev container and starting again...

Actually, just noticed I get the second error on first install of Dev, even before changing branch. 🧐

Yeah we are still tracing that weird "domain" error. A full reinstall of
the addon sometimes fixes it 😁. Should be unrelated to YT Music though, so
if you manage to get pass that you should be able to give it a go
Op di 25 jun 2024 om 19:53 schreef TheWebMachine @.***>

Yeah, immediately ran into issues:
First setup of YTM provider went fine, but loaded no playlists. Restarting
dev add-on resulted in this error:
2024-06-25 12:47:58.813 ERROR (MainThread) [music_assistant] Error loading
provider(instance) YouTube Music: Provider ytmusic did not load within 30
seconds
Attempted to rebuild add-on and started getting this error:
2024-06-25 12:50:57.668 ERROR (MainThread) [music_assistant] Error doing
task: Task exception was never retrieved Traceback (most recent call last):
File "/usr/local/lib/python3.12/site-packages/aiorun.py", line 219, in
new_coro await coro File
"/usr/local/lib/python3.12/site-packages/music_assistant/main.py", line
212, in start_mass await mass.start() File
"/usr/local/lib/python3.12/site-packages/music_assistant/server/server.py",
line 160, in start await self._load_providers() File
"/usr/local/lib/python3.12/site-packages/music_assistant/server/server.py",
line 510, in _load_providers await
self.config.create_builtin_provider_config(prov_manifest.domain) File
"/usr/local/lib/python3.12/site-packages/music_assistant/server/controllers/config.py",
line 488, in create_builtin_provider_config for _ in await
self.get_provider_configs(provider_domain=provider_domain):
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File
"/usr/local/lib/python3.12/site-packages/music_assistant/server/controllers/config.py",
line 171, in get_provider_configs and (provider_domain is None or
prov_conf["domain"] == provider_domain) ~~~~~~~~~^^^^^^^^^^ KeyError:
'domain'
Blowing out the whole dev container and starting again...
—
Reply to this email directly, view it on GitHub
https://github.com/music-assistant/hass-music-assistant/issues/2536#issuecomment-2189617621,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AEG2MJ7HJXQ25JS7TQZRHM3ZJGVDFAVCNFSM6AAAAABJ2WPH3CVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDCOBZGYYTONRSGE
.
You are receiving this because you were assigned.Message ID:
@.***>

2024-06-25 13:01:15.035 WARNING (MainThread) [music_assistant.music] Sync task for YouTube Music completed with errors
Traceback (most recent call last):
  File "/usr/local/lib/python3.12/site-packages/music_assistant/server/controllers/music.py", line 700, in run_sync
    await provider.sync_library(media_types)
  File "/usr/local/lib/python3.12/site-packages/music_assistant/server/models/music_provider.py", line 413, in sync_library
    library_item = await controller.add_item_to_library(
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/music_assistant/server/controllers/media/base.py", line 128, in add_item_to_library
    library_id = await self._add_library_item(item)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/music_assistant/server/controllers/media/tracks.py", line 345, in _add_library_item
    await self._set_track_album(
  File "/usr/local/lib/python3.12/site-packages/music_assistant/server/controllers/media/tracks.py", line 427, in _set_track_album
    album = await self.mass.music.albums.get_provider_item(
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/music_assistant/server/controllers/media/base.py", line 558, in get_provider_item
    if item := await provider.get_item(self.media_type, item_id):
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/music_assistant/server/models/music_provider.py", line 278, in get_item
    return await self.get_album(prov_item_id)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/music_assistant/server/providers/ytmusic/__init__.py", line 298, in get_album
    return self._parse_album(album_obj=album_obj, album_id=prov_album_id)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/music_assistant/server/providers/ytmusic/__init__.py", line 625, in _parse_album
    album.metadata.description = unquote(album_obj["description"])
                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/urllib/parse.py", line 684, in unquote
    if '%' not in string:
       ^^^^^^^^^^^^^^^^^
TypeError: argument of type 'NoneType' is not iterable

This fix is being worked on. The only relevant thing to test is the time it takes to start a track. Can you pick a random track to test? Or use the search to find something if nothing gets synced

Yeah, I can't do anything with the Dev version and YTM. Nothing syncs, search doesn't work. There's nothing here for me to play. Restarting the add-on, I see YTM provider has failed to load again and I'm seeing this in logs:
[youtube+oauth2] oauth2: Initializing OAuth2 Authorization Flow
[youtube+oauth2] To give yt-dlp access to your account, go to  https://www.google.com/device  and enter code  GFP-QKH-XWC
2024-06-25 13:18:33.847 ERROR (MainThread) [music_assistant] Error loading provider(instance) YouTube Music: Provider ytmusic did not load within 30 seconds

As an aside, been meaning to submit a request for this:
Can a re- authenticate button be added to YTM? If the token gets invalidated for any reason, you have to delete and setup the entire Provider again to obtain a new token, which means awaiting a new sync.
At any rate, restarting the Dev add-on loses the token and crashes the provider, but even from initial setup, I am unable to test YTM at all because nothing is accessible or visible from YTM, even in search. Tried setting up about 6 times in succession now and same results every time. Aside from the errors already shared here, I see nothing else in the debug log of interest.

Tokens should be revalidated automatically. Can you try completely removing
the addon and reinstall it from the store and then fill in my branch to
sync? I feel stuff is interfering with a possible previous dev instance,
since you mentions that you got the domain error before you even put the
branch name in?
Op di 25 jun 2024 om 20:25 schreef TheWebMachine @.***>

Yeah, I can't do anything with the Dev version and YTM. Nothing syncs,
search doesn't work. There's nothing here for me to play. Restarting the
add-on, I see YTM provider has failed to load again and I'm seeing this in
logs:
[youtube+oauth2] oauth2: Initializing OAuth2 Authorization Flow
[youtube+oauth2] To give yt-dlp access to your account, go to  https://www.google.com/device  and enter code  GFP-QKH-XWC
2024-06-25 13:18:33.847 ERROR (MainThread) [music_assistant] Error loading provider(instance) YouTube Music: Provider ytmusic did not load within 30 seconds
Screenshot_20240625_124844_Home.Assistant.jpg (view on web)
https://github.com/music-assistant/hass-music-assistant/assets/1045052/a5800d72-231e-4525-9329-7faf0ee0be36
As an aside, been meaning to submit a request for this:
Can a re- authenticate button be added to YTM? If the token gets
invalidated for any reason, you have to delete and setup the entire
Provider again to obtain a new token, which means awaiting a new sync.
At any rate, restarting the Dev add-on loses the token and crashes the
provider, but even from initial setup, I am unable to test YTM at all
because nothing is accessible or visible from YTM, even in search. Tried
setting up about 6 times in succession now and same results every time.
Aside from the errors already shared here, I see nothing else in the debug
log of interest.
—
Reply to this email directly, view it on GitHub
https://github.com/music-assistant/hass-music-assistant/issues/2536#issuecomment-2189681386,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AEG2MJ47NLYUPRMXDCF4SKDZJGYX7AVCNFSM6AAAAABJ2WPH3CVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDCOBZGY4DCMZYGY
.
You are receiving this because you were assigned.Message ID:
@.***>

since you mentions that you got the domain error before you even put the
branch name in?

Disregard that comment: HA keeps add-on logs even after deleting and reinstalling, so I was seeing an old log message and thought it was from fresh install.
I fully removed the add-on, reinstalled it, set the branch, started it, and attempted YTM setup...7 times in total. Same results every time.
THEN...on the 8th attempt, MA somehow loaded a total of three random albums (not playlists) on the Home tab. Totally random and the first time it has happened. Anyway, I did start playback on one of them and the delay is now down to about 3-4s for me on first track play, about 2s on track skips.
So, this is much more acceptable and in line with the old library!

Awesome, love the perseverance. That's all I wanted to confirm. Really glad
it's working because this means we can go ahead with ytdlp and will greatly
improve the stability of the YT Music provider 💪. Will let you know when
this hits beta.
Op di 25 jun 2024 om 20:45 schreef TheWebMachine @.***>

since you mentions that you got the domain error before you even put the
branch name in?
Disregard that comment: HA keeps add-on logs even after deleting and
reinstalling, so I was seeing an old log message and thought it was from
fresh install.
I fully removed the add-on, reinstalled it, set the branch, started it,
and attempted YTM setup...7 times in total. Same results every time.
THEN...on the 8th attempt, MA somehow loaded a total of three random
albums (not playlists) on the Home tab. Totally random and the first time
it has happened. Anyway, I did start playback on one of them and the delay
is now down to about 3-4s for me on first track play, about 2s on track
skips.
So, this is much more acceptable and in line with the old library!
—
Reply to this email directly, view it on GitHub
https://github.com/music-assistant/hass-music-assistant/issues/2536#issuecomment-2189722087,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AEG2MJ2XQOQZ4N2J6HGJNBLZJG3FLAVCNFSM6AAAAABJ2WPH3CVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDCOBZG4ZDEMBYG4
.
You are receiving this because you were assigned.Message ID:
@.***>

Update on the DOMAIN error. This is triggered by removing a provider. A fix is being worked on. The workaround is to reinstall and then do not remove any provider after having added it.

Please confirm if this is still an issue with beta 9

Please confirm if this is still an issue with beta 9

So far, this seems to have fixed the issue. I am seeing an average of about 2.8s to skip tracks and about 3.6s to load up a new queue from scratch and begin playback. This conforms with what I would expect (even YTM native app has similar delays) and with pre b8 versions.
Thanks for squashing this!

authors: MarvinSchenkel OzGav TheWebMachine tronikos

repo: music-assistant/hass-music-assistant


text:
Subsonic: Check for transcodeOffset support on startup

If this support is present, then we can seek using the stream endpoint timeOffset argument. If not we need to fall back to having the player provider do it.

Sorry for the PR noise, I was wondering why I could catch IOError and then I realized it was the linter.

repo: music-assistant/server


text:
Test tasks are missing

The documentation mentions gulp karma and gulp protractor should work, but in generator 1.2.2 no test tasks are generated?

Hey, the documentation refers to the current master. The 1.2.2, which is the latest release did not have this feature: https://github.com/mwaylabs/generator-m/tree/1.2.2
We will release a new version with test integration soon.
So we are sorry for the confusion, but you will have to wait a little bit more.
Or check our the master and do npm link inside the directory. In this case you can use the newest features. But be careful, they are probably not fully tested.

Alright @MathiasTim, makes sense, didn't know it was a new feature in the generator. Keep up the good work though!

@gruppjo maybe we should stop putting features into master, when they are not released? What do you think? I kinda understand @drissamri, it is confusing, if you go to a repo and it tells you It has this feature, you do an npm install and it don't.

That, and also the fact the sample app also has the new features.

@MathiasTim, @drissamri. You are right, this is confusing. I've been thinking about this issue as well recently... Maybe it's time to build up a master/dev branch on both repositories after the next release!
Thanks for your feedback!

Will do so as of today.

authors: MathiasTim drissamri gruppjo

repo: mwaylabs/generator-m


text:
Prototype message patterns: RecvSend, SendRecv and Send

Whilst thinking more about https://github.com/libp2p/rust-libp2p/issues/3130 and the PoC I made in https://github.com/thomaseizinger/rust-async-response-stream, I realized that this could actually be part of asynchronous-codec.
It could be implemented on top but it is also fairly intertwined with the idea of Framed. A good data point here is that we don't need any additional dependencies. All we are doing is defining a Stream utility on top of Framed that makes it easier to implement a request-response message pattern.
The design has slightly evolved from https://github.com/thomaseizinger/rust-async-response-stream. Instead of providing two Futures, we now just implement Stream. For the easy usecase where we close the stream after sending the response, we only ever output one Item: The incoming request and the placeholder for the response. Because it is a Stream, a SelectAll will continue to poll it until it returns None. This allows us to completely hide the message exchange and makes using this really easy:

Create an instance and push it into a SelectAll.
Process messages coming in from polling SelectAll.

I also removed the timeout, I think this should be implemented on top.

Sorry for the lack of documentation!
The asynchronuous-codec crate is useful to define encoding and decoding modules that compose well. Framed can then be used to turn an Async{Read,Write} into a Stream and Sink of messages. We use it extensively inside rust-libp2p to decode network messages from a byte stream.
What this PR adds are "message patterns" on top of a framed stream. So far only one is added but it is easy to envision more. I've started with RecvSend because it is the most interesting one.
Your pseudo-code is on point. My vision is that by implementing Stream, we can drive a RecvSend through a SelectAll as part of ConnectionHandler::poll.
The item returned from RecvSend are the incoming requests plus a "channel" to send the response back. This allows for the response to be provided out-of-bound from the stream. There are various patterns employed in rust-libp2p as to how the response makes it to the stream. I think a channel-design lives at the intersection of convenience (response can be sent from anywhere), minimal boilerplate (no message passing down the layers) and (type)safety (response can only be sent once).
The design goals for this were:

Minimal boilerplate upon usage. It is intended to be repeated in every ConnectionHandler to replace the current InboundUpgrade and OutboundUpgrade traits.
Good composition. For most use cases, we will want to add a timeout to the entire recv and send operation. By implementing Stream, we should be able to compose it with a generic wrapper that times out if the inner stream doesn't finish in time.
Flexible for different messages. Because we depend only on Encoder and Decoder, this can be used with probably any protocol.

Okay, that is really helpful, I think I have a much better understanding of it now, thanks!

Sent some tweaks for this branch in https://github.com/thomaseizinger/asynchronous-codec/pull/1

@mxinden I keep coming back to wanting this almost every time I touch any protocol code. Are you in favor of this?

@mxinden I keep coming back to wanting this almost every time I touch any protocol code. Are you in favor of this?

We would use it in combination with a TimedStreams abstraction that wraps a stream::SelectAll but races each stream against a timeout. Using it together with the RecvSend in here (and other "protocols" like SendRecv or just Recv or Send) gives us the same functionality as InboundUpgrade and OutboundUpgrade just without having to implement any traits but composing existing code together.

I am hesitant: I don't think the usage of Stream is intuitive here. I consider a Stream a consumer from a source, not both a consumer and a source sending data to a destination.
All that said, the abstraction might be worth the confusion that comes with it. It seems to me that you feel strongly about this new abstraction. Which of our rust-libp2p protocols would benefit the most of this pattern? Do you want to integrate this into one of them as a proof-of-concept?

I am hesitant: I don't think the usage of Stream is intuitive here. I consider a Stream a consumer from a source, not both a consumer and a source sending data to a destination.

I think of it as a source of events of a protocol.

All that said, the abstraction might be worth the confusion that comes with it. It seems to me that you feel strongly about this new abstraction. Which of our rust-libp2p protocols would benefit the most of this pattern? Do you want to integrate this into one of them as a proof-of-concept?

Every one that sends messages. The idea has the potential to replace every state machine for sending messages in rust-libp2p with a use of the appropriate "message pattern". Currently we only have RecvSend implemented here but it is easy enough to envision additional ones, SendRecv for example.

Do you want to integrate this into one of them as a proof-of-concept?

Here you go: https://github.com/libp2p/rust-libp2p/pull/3610

Code duplication in here is currently horrendous but that can be fixed later.

I am hesitant: I don't think the usage of Stream is intuitive here. I consider a Stream a consumer from a source, not both a consumer and a source sending data to a destination.
All that said, the abstraction might be worth the confusion that comes with it. It seems to me that you feel strongly about this new abstraction. Which of our rust-libp2p protocols would benefit the most of this pattern? Do you want to integrate this into one of them as a proof-of-concept?

I've written about this - to some extent - here: https://github.com/libp2p/rust-libp2p/discussions/3603
The usage of Stream is somewhat accidental actually. It happens to be the closest thing to a generator interface that we have on stable and has widespread use.
If we had generators, I'd use that!

I might have a go at re-writing these using async/await and see whether they turn out to be cleaner. Most likely they will at the cost of an allocation but I'd be surprised if we can even measure that in the context of network IO.

I might have a go at re-writing these using async/await and see whether they turn out to be cleaner. Most likely they will at the cost of an allocation but I'd be surprised if we can even measure that in the context of network IO.

It doesn't really work very well because Rust doesn't have native generators yet.

authors: mxinden nazar-pc thomaseizinger

repo: mxinden/asynchronous-codec


text:
🛑 Website Load Balancers is down

In f01e543, Website Load Balancers ($WEB_SERVER) was down:

HTTP code: 522
Response time: 15520 ms

Resolved: Website Load Balancers is back up in 0a2e550.

repo: myavsuper/upptime


text:
🛑 Website Load Balancers is down

In 21c9982, Website Load Balancers ($WEB_SERVER) was down:

HTTP code: 522
Response time: 15387 ms

Resolved: Website Load Balancers is back up in 2495954.


text:
🛑 Website Load Balancers is down

In b237f8f, Website Load Balancers ($WEB_SERVER) was down:

HTTP code: 526
Response time: 262 ms

Resolved: Website Load Balancers is back up in f25f874.


text:
build(misc): customise sonar.cloud via github vars

Description

replace mvn with mvnw
support customise sonar.cloud via the following github variables

SONAR_ORGANIZATION
SONAR_JAVA_PROJECT_KEY
SONAR_NODEJS_PROJECT_KEY
And I already added the above three variables into this repo

@jmoeser  this patch is ready for review.

repo: mycloudnexus/kraken


text:
Keep track of redirects?

Might be handy to keep track of redirects when follow_redirects is set to true.
I could see this as a list of "from" -> "to" pairs or something along those lines.
Thank you!

I'm not using httpotion anymore. If you implement this, I can merge of course, but I'm not going to add any features.

authors: davidw myfreeweb

repo: myfreeweb/httpotion

license: unlicense


text:
🛑 Wiki is down

In 6d868fe, Wiki (https://wiki.mygameplatform.com:1010) was down:

HTTP code: 0
Response time: 0 ms

Resolved: Wiki is back up in edfda52.

repo: mygameplatform/status