TypeError: NetworkError when attempting to fetch resource

Hello, been using this plugin on Firefox periodically for the last few weeks. In general it has worked great but I have ran into an error that I haven't seen mentioned on this forum or in the review section of the Firefox Add-on page. I thought I would reach out and see if anyone has had similar experiences
Essentially I am getting the error listed in the title. I have changed networks, deleted the add-on and re-downloaded, reset my computer, and reset and adding cards back to Libby manually.
The error looks like this on my end:
TypeError: NetworkError when attempting to fetch resource
Any help from the community or the developer would be great. I am just worried I am missing a simple setting or something like that. Thank you in advance.

Confirming I'm experiencing this exact issue and tried all common recommended troubleshooting steps.

Third person experiencing this error.  Nothing to add other than it also started happening today

I'm experiencing this error as well!

Likewise :(

Same here. Chrome extension is also experiencing a similar issue

Also experiencing the same thing. I don't really use Firefox much, but I tried it just now and got the network error.
I also tried the Chrome extension in Chrome and Edge on PC, and in the Lemur browser on my phone (which is what I normally use - a lot), and I get the same request to keep reloading the page,
I don't think that "synchronize position" message is indicative of anything at all. It's not new. I've gotten it almost every time I refresh the page in the Lemur browser on my phone.
Also note that the Telegram Libby Download Bot is working. I tried it just now and successfully downloaded the same book that wasn't working in Firefox or Chrome. The Telegram bot developer said he had done a lot of work fixing his bot in recent days. But it's working fine tonight.

I'm also having the same issue on Firefox and Chrome

Same here. I love this extension and wish I were able to help making this work again.

I am having this same issue. I had downloaded the OverdriveConsole just to see if it still works (which it does), and thought that it had somehow messed with my ability to use the firefox extention (which I like more becasue of the embedded chapters and single MP3). I looked at the the firefox under developer tools and there appears to be some issues with "Some cookies are misusing the recommended “SameSite“ attribute". I dont know anything about this stuff as I just literally made an account on here to post that I also am having this same issue as titled

Having the same issue as PurpleJonSnowden. I've also tried a different, previously working Chrome plugin as well and found it to no longer function.

Same problem here :( odmpy has also stopped working, so I wonder if something has changed with libby

Looks like this issue is caused by some changes at Libby side. I have it too

I am having this same issue. I had downloaded the OverdriveConsole just to see if it still works (which it does), and thought that it had somehow messed with my ability to use the firefox extention (which I like more becasue of the embedded chapters and single MP3). I looked at the the firefox under developer tools and there appears to be some issues with "Some cookies are misusing the recommended “SameSite“ attribute". I dont know if that has anything to do with this issue but just thought I would bring it up. I dont know anything about this stuff as I just literally made an account on here to post that I also am having this same issue as titled

Chapters ARE embedded in the mp3 files you get from the Overdrive app. They are in the mp3 files themselves in a proprietary format. They can be displayed by the most popular a d highly rated android players (Smart Audiobook Player and Listen Audiobook Player) and on iOS the Bound player can parse Overdrive chapters, maybe some others as well.
As to single vs multiple mp3s, I don't get the issue at all. The book is the same size in either case, plays the same. But in the case of the Firefox downloads, the chapter info is in the cue file, not really embedded in the mp3. Remove the cue file from the folder - no more chapters.

This is the first time I am trying this extension and it is broken. If anybody find a solution, please let us know.

I was able to use the ext on Firefox without problem as of three days ago.  But went to use it today and get this error as well.

Basically the same issue with the Chrome extension, where the developer posted on GitHub just a few minutes ago that he has been able to reproduce the error and concluded that the extension is not working anymore and that he doesn't think it can be fixed.
The developer of the Firefox extension has said previously that he no longer has time to work on this.
Bad news day. Two extensions may be permanently out of commission.
That would leave  the Overdrive app method and the Telegram Libby Audiobook Bot as the most viable options that still work. For now....until something else comes along 🤔

@mkgtu Can you point me to more info on those two other methods in case it really can't be fixed?

I can't speak to the Overdrive app method, but I was just able to successfully download an audiobook using the Telegram Libby Audiobook bot method.  You have to use your phone or pad device, because you need to download two apps:  the Telegram app and the Libby app.  The Libby app is what gives the Telegram app access to your library account.  Once you have downloaded them both, just follow the directions on the bot page:  https://github.com/joshuatly/libby_ab_bot

the developer posted on GitHub just a few minutes ago that he has been able to reproduce the error and concluded that the extension is not working anymore and that he doesn't think it can be fixed.

Where did he say this? I haven't been able to find it and I would like to "follow" his comments.

the developer posted on GitHub just a few minutes ago that he has been able to reproduce the error and concluded that the extension is not working anymore and that he doesn't think it can be fixed.

Where did he say this? I haven't been able to find it and I would like to "follow" his comments.

So as not to confuse things, I was referring to a post from Hou Tianze, the developer of the Chrome extension, not this Firefox extension. I think I misquoted him saying he didn't think his extension could be fixed. He actually said he didn't know HOW it could be fixed. The rest of his post refers to my comments about the Telegram bot for Libby, which does still work.
Here's the post:
https://github.com/houtianze/libby-audiobook-exporter-browser-extension/issues/17#issuecomment-2073202255

Anyway to run this locally on my computer? Really just need to be able to make the .cue file from the "part..." files and separate them according to the .cue file.

@mkgtu Can you point me to more info on those two other methods in case it really can't be fixed?

Here are a few links that should cover most bases. Also plenty of discussion on Reddit if you do a bit of searching.
https://www.reddit.com/r/audiobooks/s/haEsXo3IdX
https://github.com/houtianze/libby-audiobook-exporter-browser-extension/issues/17#issuecomment-2072897173
https://www.reddit.com/r/LibbyApp/s/ZHysatNzTv
If you need the Overdrive android app.
https://overdrive.en.uptodown.com/android
If you need the Overdrive app for Android:
https://overdrive.en.uptodown.com/android

Anyway to run this locally on my computer? Really just need to be able to make the .cue file from the "part..." files and separate them according to the .cue file.

Not sure "what" it is you want to run locally on computer. Do you mean run the extension as an "app" outside of a browser? Where would you get the mp3 files? Do you know how to create a cue file. I looked that up once, not as easy as you might think.
But it seems to me it would all be pointless. Just use the Overdrive app to get the files. They already have chapter tags embedded in them that can be parsed by Smart Audiobook, Listen, and Sirin on android, and Bound in iOS.
Or use the Telegram bot (search for libby_ab_bot in Telegram and follow the instructions). The resulting files also have the chapter tags embedded in the mp3 files and can be parsed by all the above mentioned players.
Long story, but from I see in the bot downloads and in the bot code, it looks to me like the Telegram bot may actually getting the Overdrive version of the book. They are not always the same as the Libby versions, especially in that Overdrive embeds the metadata in the mp3s, while Libby books have (up to recently anyway) needed an extra cue or json file for chapter metadata. There are no extra files with the Telegram bot downloads, just mp3s and a cover.jpg.

@mkgtu I can get the files from the Libby browser. But the files are in parts and not by chapters. I would manually go through and using ffprobe and ffmpeg to find the Overdrive markers and separating each file according to their chapter.
I liked how this extension made a cue file and then I have another program that will do the separating using said cue file.

Just chiming in here to confirm the error, and all other discussed workarounds (Chrome Extension, Telegram App, Overdrive) have not worked for me for one reason or another. Will continue to look for other possible resources but at the moment, sadly it seems like Libby has closed all doors to this for the time being.

@mkgtu I can get the files from the Libby browser. But the files are in parts and not by chapters. I would manually go through and use ffprobe and ffmpeg to find the Overdrive markers and separate each file according to their chapter.
I liked how this extension made a cue file and then I have another program that will do the separating using said cue file.

I don't get the rationale for any of that. I suppose it must be related to the audiobook player you intend to use, ie, you are using a player that can't parse the chapter tags as originally constituted in the Libby or Overdrive files.
I play all these kinds of books on my android phone where the LISTEN or SMART AUDIOBOOK players are capable of displaying chapters from the originals. No need to split and/or reconstruct anything. Going forward, there probably won't be any new Libby downloads to deal with anyway. But the files from the Overdrive app downloads or the Telegram bot can handled "as is" by those two android players (and also by the Sirin player) and by several iOS players (I use BOUND).
But, to each their own.

Just chiming in here to confirm the error, and all other discussed workarounds (Chrome Extension, Telegram App, Overdrive) have not worked for me for one reason or another. Will continue to look for other possible resources but at the moment, sadly it seems like Libby has closed all doors to this for the time being.

I got the Telegram method working yesterday in case you want to use that.

GOOD NEWS, I think.
With the Firefox and Chrome extensions no longer working, I think there are THREE ALTERNATIVES left.

The Overdrive app method, if available.

The Telegram Libby Audiobook Bot, libby_ab_bot, if you can get it to work. It can be glitchy and the servers sometimes slow.

And the VIDEO AND AUDIO DOWNLOADER extension, available both from the Chrome Webstore AND as a Firefox add-on

https://chrome.google.com/webstore/detail/video-audio-downloader/pchlfebelfohhojoomlngjbkcjponfha
https://addons.mozilla.org/en-US/firefox/addon/video-audio-downloader/
For those not familiar with it, this was the go-to and reliable option before the current Chrome and Firefox extensions were created. AND IT STILL WORKS. I just tried it and successfully downloaded a book  without a hitch. I've also had comments from Reddit users for whom it still works.
It's a bit more complicated than newer methods. But it has never failed to work after all this time.
Too long to explain it here, but I posted instructions on Reddit for using it on Libby long ago. (It was obviously not designed specifically for Libby. Here is a Google Docs version of those instructions:
https://docs.google.com/document/d/1GX41gdpotuYUmszhxb6RUbrPEHraGSS8MgCBMGSFsUQ/edit?usp=drivesdk

GOOD NEWS, I think. With the Firefox and Chrome extensions no longer working, I think there are THREE ALTERNATIVES left.
* The Overdrive app method, if available.

* The Telegram Libby Audiobook Bot, libby_ab_bot, if you can get it to work. It can be glitchy and the servers sometimes slow.

* And the VIDEO AND AUDIO DOWNLOADER extension, available both from the Chrome Webstore AND as a Firefox add-on

https://chrome.google.com/webstore/detail/video-audio-downloader/pchlfebelfohhojoomlngjbkcjponfha
https://addons.mozilla.org/en-US/firefox/addon/video-audio-downloader/
For those not familiar with it, this was the go-to and reliable option before the current Chrome and Firefox extensions were created. AND IT STILL WORKS. I just tried it and successfully downloaded a book without a hitch. I've also had comments from Reddit users for whom it still works.
It's a bit more complicated than newer methods. But it has never failed to work after all this time.
Too long to explain it here, but I posted instructions on Reddit for using it on Libby long ago. (It was obviously not designed specifically for Libby. Here is a Google Docs version of those instructions:
https://docs.google.com/document/d/1GX41gdpotuYUmszhxb6RUbrPEHraGSS8MgCBMGSFsUQ/edit?usp=drivesdk
Or the attached PDF Download Libby Audiobook files-Copy.pdf

Thanks for all the helpful resources! I definitely found them helpful. Hopefully other uses do as well.

odmpy still works.
https://github.com/ping/odmpy
I had to make this change to my local copy to get it to work.  If the maintainer doesn't fix the issue a fork might be necessary.
https://github.com/ping/odmpy/pull/59/files#diff-c7d73b1f7d310eeed5cb7195d5a5b9c451fbe0f675c23abaf642cf27a89a354fR250-R252

GOOD NEWS, I think. With the Firefox and Chrome extensions no longer working, I think there are THREE ALTERNATIVES left.
* The Overdrive app method, if available.

* The Telegram Libby Audiobook Bot, libby_ab_bot, if you can get it to work. It can be glitchy and the servers sometimes slow.

* And the VIDEO AND AUDIO DOWNLOADER extension, available both from the Chrome Webstore AND as a Firefox add-on

https://chrome.google.com/webstore/detail/video-audio-downloader/pchlfebelfohhojoomlngjbkcjponfha
https://addons.mozilla.org/en-US/firefox/addon/video-audio-downloader/
For those not familiar with it, this was the go-to and reliable option before the current Chrome and Firefox extensions were created. AND IT STILL WORKS. I just tried it and successfully downloaded a book without a hitch. I've also had comments from Reddit users for whom it still works.
It's a bit more complicated than newer methods. But it has never failed to work after all this time.
Too long to explain it here, but I posted instructions on Reddit for using it on Libby long ago. (It was obviously not designed specifically for Libby. Here is a Google Docs version of those instructions:
https://docs.google.com/document/d/1GX41gdpotuYUmszhxb6RUbrPEHraGSS8MgCBMGSFsUQ/edit?usp=drivesdk
Or the attached PDF Download Libby Audiobook files-Copy.pdf

The VIDEO AND AUDIO DOWNLOADER extension just keeps saying no audio or video detected

Agreed with @thejoester. This does not work for Firefox. The extension cannot detect any media files.

odmpy still works.
https://github.com/ping/odmpy
I had to make this change to my local copy to get it to work. If the maintainer doesn't fix the issue a fork might be necessary.  audiofile.tag.release_date = LibbyClient.parse_datetime( published_date ).strftime("%Y-%m-%d")
https://github.com/ping/odmpy/pull/59/files#diff-c7d73b1f7d310eeed5cb7195d5a5b9c451fbe0f675c23abaf642cf27a89a354fR250-R252

How did you get odmpy installed at all? I can't even install it. Surely it's user error or I am not understanding the steps. I'm no coder but attached are the steps and a screenshot of what I did. Perhaps you can advise so as to make it more clear the installation steps.
Steps

Error I Received

You need to install pip
https://pip.pypa.io/en/stable/installation/

odmpy still works.
https://github.com/ping/odmpy
I had to make this change to my local copy to get it to work. If the maintainer doesn't fix the issue a fork might be necessary.
https://github.com/ping/odmpy/pull/59/files#diff-c7d73b1f7d310eeed5cb7195d5a5b9c451fbe0f675c23abaf642cf27a89a354fR250-R252

any assistance on how to apply these fixes on a windows box? or would it be much better to run this on my pi?

VIDEO AND AUDIO DOWNLOADER worked for me on Chrome
https://chrome.google.com/webstore/detail/video-audio-downloader/pchlfebelfohhojoomlngjbkcjponfha

odmpy still works.
https://github.com/ping/odmpy
I had to make this change to my local copy to get it to work. If the maintainer doesn't fix the issue a fork might be necessary.
https://github.com/ping/odmpy/pull/59/files#diff-c7d73b1f7d310eeed5cb7195d5a5b9c451fbe0f675c23abaf642cf27a89a354fR250-R252

any assistance on how to apply these fixes on a windows box? or would it be much better to run this on my pi?

odmpy still works.
https://github.com/ping/odmpy
I had to make this change to my local copy to get it to work. If the maintainer doesn't fix the issue a fork might be necessary.
https://github.com/ping/odmpy/pull/59/files#diff-c7d73b1f7d310eeed5cb7195d5a5b9c451fbe0f675c23abaf642cf27a89a354fR250-R252

any assistance on how to apply these fixes on a windows box? or would it be much better to run this on my pi?

I created a fork with the date format fixed.  You can install it with the below command
python3 -m pip install<EMAIL_ADDRESS>--upgrade
https://github.com/ping/odmpy/compare/master...stenou:odmpy:master

Have seen comments that the Video Audio Downloader is not working in Firefox. Not working, not detecting audio in Chrome now either.
I got the same failure in Firefox.
I then tried it on Chrome and it also failed to detect audio. It also failed to detect audio for the same book on Overdive.com.
I sent an email to the developer.
I then tried another Chrome extension I've used before, Audio Downloader Prime. It gets the file links and does download the files from both Libby and Overdrive.
Try it if you want but it's work intensive. The files are all identically (and generically named). You have to rename them with a number in the filename to get an audiobook player to play them in the right order. As I recall when the links are are listed in the extension they are backwards. So the one in Row 1 is actually the last file in the book. You need to download each file one by one, starting with the last one in the list. Since they are all identical each file after the first will get a number in parentheses at the end of the filename. But to keep things in the right order you need to download that last file in the list TWICE. The first time it will not have a number. The second time it will have the number (1) in the filename, which is what you want since it is actually the first part. Later you will have to change those numbers to something a player will recognize. like 001 or Part. Most players I don't think can read the number in parentheses.  I'd used it on few books a long time ago. Got the books OK but also got a big fat headache every time.
For now I'll stick to the Overdrive app or the Telegram bot. For those following the conversation about odmpy, which is a command line program, it's worth noting that odmpy is the basis of the Telegram bot. You can get the same files, without the command line headaches.

As of this morning odmpy no longer works :(.  It looks like they have changed their auth method.

where to get the overdrive app or how to use the telegram bot?

where to get the overdrive app or how to use the telegram bot?

OD desktop can be downloaded from Softonic. The android app from APKMirror. I've posted links here in GitHub and in Reddit. You can easily find them via Google search.
As for Telegram, the bot no longer works - as announced here and via message on the bot from its owner.

where to get the overdrive app or how to use the telegram bot?

OD desktop can be downloaded from Softonic, at least for Windows, don't know about Mac. The android app from APKMirror. AFIK you can't install/sideload it on iPhone - unless you live in the EU. I've posted links here in GitHub and in Reddit. You can easily find them via Google search.
As for Telegram, the bot no longer works - as announced here and via message on the bot from its owner.

FYI: Overdrive can be installed on Android, but it doesn't work. Just tells you the app has been discontinued and go get Libby. Is there a particular Android version that you know if that still works?

ANOTHER EXTENSION.... AND THIS ONE STILL WORKS
AUDIO DOWNLOADER PRIME
Available for Chrome and Firefox. I tried it successfully this morning in both browsers.
FIEFOX ADD-ON
https://addons.mozilla.org/en-US/firefox/addon/audio-downloader-prime/
CHROME EXTENSION for any chromium browser)
https://chromewebstore.google.com/detail/audio-downloader-prime/flainkeonkoanoijnkojmiiihnfdhipd?hl=en-US

Open the audiobook as usual, but select the LAST CHAPTER and move the slider all the way to the end of the book.

Then open the extension and clear the list.
Now you will start scanning/playing the book BACKWARDS, just hold down SHIFT and keeping quickly tapping the LEFT arrow key to move from chapter to chapter all the way to the start of the book.

WHY BACKWARDS? I was frustrated using this long ago because this extension has the crazy habit of listing all the file links as they come in - in reverse order. What you see at the end is an spread sheet type grid with numbered rows that contain the file links. Unfortunately Row number ONE is actually the LAST file in the, and the last row is the first file. Crazy. My solution: scan the book BACKWARDS and row One is now the last file scanned - which is actually the first file in the book.

Now you just tap the download arrow for each file and save it (I have a pre-created folder for the book)

But note: delete any files in the list with a ? and no size info. They're useless. You may get such files at the end. But if you get them in the middle, there may have been an error. Best to clear the list and scan again. Ideally a scan won't create any ? at all.

TIP/TRICK: Download the first file TWICE. Why? Every file is identically named:
libby--open.mp3

Crazy. But the first file you download will be "libby--open.mp3", but the second time you download that first file to the same folder you'll get:
.....  libby--open (1).mp3.....
And each subsequent file download will be numbered in order. Just DELETE that non-numbered first file when you're all done.
You don't need to rename or change the numbering format. Any good audiobook player will use the numbers in parentheses to play files in order.
HOWEVER, you may have issues with books with more than 9 files. Without leading zeroes some systems will get (1) and (10) mixed up, and so on. If so, you might need to change to a leading zeroes format. There are file managers that can bulk renumber series items. Otherwise, manually.
NOW you won't get any chapter info with this method. Remember Libby doesn't put that info in its mp3s like Overdrive does. So you need an extra metadata file.
Sadly, the previously rekiable Video and Audio Downloader no longer works. But if you have the instructions I posted for that extension, there was info about using developer tools in your browser to create a libby.txt metadata file. You can still do that (it had nothing to do with the extension) and just put it in the folder with the other files.
LISTEN audiobook player can use the libby.txt file. I hope Smart Audiobook Player will soon. I sent the developer a sample book with that file and asked if he could get his app to use it. He said he'd think about it - with him that usually means he'll do it.
Also note that in Chrome you have the option to "save as" for that file, In Firefox the only option is save all the HAR data. Just save that and rename it libby. txt. It has much more info than necessary, but the chapter data is there.
Here's the info for libby.txt. Just ignore all the stuff about the no longer working extension.
https://docs.google.com/document/d/1HjtbkovaoRII3WQv_VVULmy3tTN8cwS8/edit?usp=drivesdk&ouid=101265913744387952078&rtpof=true&sd=true

where to get the overdrive app or how to use the telegram bot?

OD desktop can be downloaded from Softonic, at least for Windows, don't know about Mac. The android app from APKMirror. AFIK you can't install/sideload it on iPhone - unless you live in the EU. I've posted links here in GitHub and in Reddit. You can easily find them via Google search.
As for Telegram, the bot no longer works - as announced here and via message on the bot from its owner.

FYI: Overdrive can be installed on Android, but it doesn't work. Just tells you the app has been discontinued and go get Libby. Is there a particular Android version that you know if that still works?

Depends on what you mean by "work". Of course it doesn't work like it used to. But IT DOES WORK for downloading and listening to the audiobooks you borrow from Libby. And for transferring/exporting the book files to other players.
And that's what we're talking about here. I download one book today, and two yesterday.
Read:
https://docs.google.com/document/d/1tuK6Uq7vCztMZQM80CY8w01Ltaib9jn9hYFRa8y_kz4/edit?usp=drivesdk

The VIDEO AND AUDIO DOWNLOADER is working now in Chrome, but not in Firefox (still detects no audio)
The Chrome version worked yesterday morning, then stopped working the rest of the day and night. Got a message from someone saying they used it this morning, so I tried it a while ago and it worked perfectly.
For now anyway. "She loves me, she loves me not"

Just an update for you all, if you are trying to use the Libby Bot through telegram, it is currently down as Libby seems to be making some back end changes. The bot will still list what audiobooks you have have but you cannot currently download them. Hopefully that gets up and rolling as this seems to be the only method working for me. If you have any additional information that would be appreciated. Cheers.

Just an update for you all, if you are trying to use the Libby Bot through telegram, it is currently down as Libby seems to be making some back end changes. The bot will still list what audiobooks you have have but you cannot currently download them. Hopefully that gets up and rolling as this seems to be the only method working for me. If you have any additional information that would be appreciated. Cheers.

Yes the bot is downed because odmpy currently doesn't work.
But Overdrive works, the Audio Downloader Prime Extension currently works in both Firefox and Chrome, and in spite of problems yesterday the Video and Audio Downloader is now working again in Chrome (but fails in Firefox). Surely you can get one of these to work for you.

If you download the .odm file from OverDrive, you can then use that file with odmpy to get all those benefits as normal.  For example:
odmpy dl "title.odm" -m --mergeformat m4b --mergecodec aac

If you download the .odm file from OverDrive, you can then use that file with odmpy to get all those benefits as normal. For example:
odmpy dl "title.odm" -m --mergeformat m4b --mergecodec aac

@mitrian7 Can you please give more detail steps on how you are using odmpy?  I can't see to get it to work.  I'm using ubuntu.  How are you get the odm file?

The VIDEO AND AUDIO DOWNLOADER is working now in Chrome, but not in Firefox (still detects no audio)
The Chrome version worked yesterday morning, then stopped working the rest of the day and night. Got a message from someone saying they used it this morning, so I tried it a while ago and it worked perfectly.
For now anyway. "She loves me, she loves me not"

This worked for me on Chrome just now. Thanks, @mkgtu! Now I just have to figure out how to stitch the chapter-by-chapter MP3s back into one file. For a variety of reasons, I strongly prefer to have books as a single audio file. Please do let me know if you have any brilliant ideas.

Now I just have to figure out how to stitch the chapter-by-chapter MP3s back into one file. For a variety of reasons, I strongly prefer to have books as a single audio file. Please do let me know if you have any brilliant ideas.

Copy each one into a single file using Audacity?

OD desktop can be downloaded from Softonic, at least for Windows

Is this still true?  When I try to download it from there, it redirects to the Microsoft Store (as it explicitly says it does).  But at the Store, there is no 'Get' button available, like with actively available apps.  The space where the 'Get' button normally sits is blank.  Has MS disabled the download?  Is there any place else to get the OD windows app which does not rely upon the MS Store?

OD desktop can be downloaded from Softonic, at least for Windows

Is this still true? When I try to download it from there, it redirects to the Microsoft Store (as it explicitly says it does). But at the Store, there is no 'Get' button available, like with actively available apps. The space where the 'Get' button normally sits is blank. Has MS disabled the download? Is there any place else to get the OD windows app which does not rely upon the MS Store?

The Overdrive for Windows installer is hosted at the Internet Archive. Just download the torrent file and open it. It will then download the msi file.
https://archive.org/details/odmedia-console-setup
Or you can download my copy of the installer from Dropbox
https://www.dropbox.com/scl/fi/dq0sot38t85jakb96c7sv/ODMediaConsoleSetup-v-3-6.msi?rlkey=jl8pyearv5605ybg8cpqmov7g&st=ka0ywlo4&dl=0

Thanks for the links - especially your hosted one!  Grabbed that one (still trying to figure out how to make it download the audiobook files).
That said, a modification to the extension itself (mentioned above by ahxxm) solves the problem (and may be incorporated into the ext in the near future?).  In other words, if you are looking for a fully functioning version of the Firefox extension (I have tested it and it works perfectly as before), just follow this link.  File and instructions on how to install the ext are at the bottom of the page:
https://github.com/bookbonobo/libby-download-extension/pull/195

Honestly the only source I would trust is this one: http://app.overdrive.com/downloads/ODMediaConsoleSetup.msi (copy and paste into browser) direct from overdrive.com

No need tho now that the ext has essentially been fixed.  :)
On Fri, Apr 26, 2024 at 11:20 PM Joseph Thomas @.***>
wrote:

Honestly the only source I would trust is this one:
http://app.overdrive.com/downloads/ODMediaConsoleSetup.msi (copy and
paste into browser) direct from overdrive.com
—
Reply to this email directly, view it on GitHub
https://github.com/bookbonobo/libby-download-extension/issues/194#issuecomment-2080383883,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/BGQRW2NYSESDP34UZH326SDY7M7SLAVCNFSM6AAAAABGTITDN2VHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDAOBQGM4DGOBYGM
.
You are receiving this because you commented.Message ID:
@.***>

--
Sent from my mobile device

Still not working for me

Still not working for me

The new ext I linked to is not working for you?

Still not working for me

Did you install the fixed branch linked in this thread as a temporary extension or are you using the old one? I uninstalled that old one to avoid confusion between the two since they'd both look alike in the toolbar.

I double checked and I cannot figure out how to install the new branch.

I double checked and I cannot figure out how to install the new branch.

The vid included in my link is very short, simple, and easy to follow.  Had it installed in 60 seconds.

I double checked and I cannot figure out how to install the new branch.

To temporarily sideload extensions in Firefox, you can do the following:
Open Firefox
Enter about:debugging in the URL bar
Click This Firefox
Click Load Temporary Add-on
Open the extension's directory and select any file inside the extension
Select the packaged extension (.zip file)
And note, temporary is the best you're gonna get until somebody updates the main extension. These temporary installations disappear every time you close the browser.

I double checked and I cannot figure out how to install the new branch.

Now you don't need to.  The original ext has been updated with this fix and is now fully functional again!

Does it "just work" now or do you have to uninstall/reinstall?

Does it "just work" now or do you have to uninstall/reinstall?

If you don't have extensions set to autoupdate in the Manage section of the ext, then you have to use the manual update function to update it to version 0.6.0.   Either way, there is no need to uninstall/reinstall the original ext.

I double checked and I cannot figure out how to install the new branch.

Now you don't need to. The original ext has been updated with this fix and is now fully functional again!

THIS IS THE ABSOLUTELY BEST NEWS I COULD HAVE GOTTEN ON A FRIDAY. I am so delighted. YAY!!! Thank you so so much to whoever contributed to get this fixed and also to mktg for working so hard to help us find workarounds in the meantime. MVPs.

Seems to be down again?

Seems to be down again?

I can confirm experiencing this problem as well.  :(

_

Edit: I also tried the method using the "Video & Audio Downloader" extension and that didn't seem to work either. The audio remained empty ("no audio found!") as I scanned through the chapters.

_
I'm having the same issue on Firefox and Chrome, FWIW.


polish raven.d.ts

as discussed in #820

added missing public functions from raven.js
moved complex data types into helper interfaces
corrected wrong definitions
reordered things a bit

Please double-check that everything has the correct data types, according to the JS-Side.

cc @connor4312 – mind chiming in on this?

Looks mostly fine as far as the typings themselves go, I've not verified that all data types are correct against the Js implementation.

Okay, CI isn't running npm test (will fix), otherwise we'd see:
><EMAIL_ADDRESS>test-typescript /Users/benvinegar/Projects/raven-js
> node_modules/typescript/bin/tsc --noEmit --noImplicitAny typescript/raven-tests.ts

typescript/raven-tests.ts(1,21): error TS2307: Cannot find module 'raven-js'.

So, this is the problem I have every time I try to touch modules: I cannot come up with a consistent export that works wherever.
Can someone here help me? Am I invoking tsc incorrectly?

Also, why rename to RavenJS? I'd kind of prefer if it was just Raven.

If I remember it correctly, a tsconfig.json is needed in ./typescript to successfully run tsc; somehow the file got lost...
I will add it later.
As far as I can tell you are invoking tsc correctly nonetheless.
RavenJS is only a local name inside raven-tests.ts, so it should be possible to change it without a problem.

@LucaVazz – again, really appreciate your continued effort on this. I've re-enabled the tsc test in CI to help facilitate.

I took me a little longer then I expected to get around to doing this...
Now tsc works without errors and I made any wherever I could more specific.

Okay, so the blocker for me right now has little to do with this PR (sort of).
It's that if you try to do this in a SystemJS project:
import Raven from 'raven-js';

SystemJS will look for .default on the imported Raven instance, and none exists (because we're not building one that way in our Grunt build).
That's why, up until now, we've advocated doing:
var Raven = require('raven-js');

Which does not look for a default property and works. It looks like I can still use this require statement even with the export changes you've done in this definition file. Can anyone confirm?

Regarding SystemJS: On the one hand I don't see a reason why the way you outlined wouldn't work anymore.
On the other hand I'm unfortunately not really experienced with SystemJS so someone else should better verify it....

the last two commits integrated cahgnes sugested by @evilj0e in https://github.com/DefinitelyTyped/DefinitelyTyped/pull/14674

Haven't forgotten about this. I'll merge it for the next minor release (3.13.0).


Segfault caused by libgodot_android.so (0x60) when logging is enabled

Tested versions
v4.2.1.stable.mono.official [b09f793f5]
System information
Android ARM64 (Helio G88)
Issue description
The app crashes on start due to segmentation fault at address 0x60 if logging is enabled on Android
Steps to reproduce

enable logging in the project settings
start the application

Minimal reproduction project (MRP)
log_android_crash.zip

found the exact cause of the problem and updated the issue

reproduced: Godot Engine v4.2.1.stable.official.b09f793f5 on Samsung S7 (Android 13)
Android app need permissions (I think)
settings:
debug/file_logging/log_path = user://logs/godot.log
debug/file_logging/log_path.android = /storage/emulated/0/test_logs/
package/unique_name = amo.n.gus

OK if debug/file_logging/log_path.android = user://logs/godot.log
Android Studio - Device Explorer


neovide bug 1488 workaround

This fixes https://github.com/neovide/neovide/issues/1488 for me.
I wrote explanations there, from the comment https://github.com/neovide/neovide/issues/1488#issuecomment-1374612249 onwards.
Unfortunately I do not see the big picture with regards to upstream winit, I don't understand how come this is needed. All I can say is that with this the issue is fixed, for me anyway.
Ideally someone with big-picture knowledge of winit and of this fork should review this and probably trace the root issue instead of patching the problem as I did. But maybe this commit can at least guide such a person... So I decided to make a PR, it can always be closed if nothing can come out of it.

[x] Tested on all platforms changed
[x] Compilation warnings were addressed
[x] cargo fmt has been run on this branch
[ ] cargo doc builds successfully
[ ] Added an entry to CHANGELOG.md if knowledge of this change could be valuable to users
[ ] Updated documentation to reflect any user-facing changes, including notes of platform-specific behavior
[ ] Created or updated an example program if it would help users understand this functionality
[ ] Updated feature matrix, if new features were added or implemented

This does not work if the window manager calls XGrabKey on the XK_Super_L, XK_Super_R keys alone. The bug remains the same, with or without this pull request's changes:
	const KeySym modkeysyms[] = { XK_Super_L, XK_Super_R };
	unsigned int i;
	KeyCode code;

	for(i = 0; i < LENGTH(modkeysyms); ++i)
		if((code = XKeysymToKeycode(dpy, modkeysyms[i])))
			XGrabKey(dpy, code, AnyModifier, window,
				True, GrabModeAsync, GrabModeAsync);

launch neovide
press and release Super key (windows key)
neovide no longer responds to keys and needs to be clicked with the mouse

works for me 100% on fedora 37 with the sway window manager otherwise.

As I understand it, the bug relies in grabbed modifiers from other programs, be it bundled with other key presses or not. This pull request fixes the issue only partially

closing, i think this is very obsolete now.


Update to Angular 17

Update to Angular 17.
Could you please create the new branch 8.0.0 for this?
Thanks in advance!

@bertlobbezoo created new branch 8.0.x please check

Great, thanks!


Interface or IP binding

Hello. Is there any ways to bind proxy to the interface or ip address? I have a lot of IPs on the server and the proxy use all of them after start so I want to limit it and bind to the dedicated IP address.

Hello, this feature has been just implemented: https://github.com/alexbers/mtprotoproxy/commit/298614b1f67f7fa548c4eb3682974cddb0addd1b
Now if you using the lattest version from master, please, add LISTEN_ADDR_IPV4 = "<IP_ADDRESS>"  to make it listen on <IP_ADDRESS>.

@alexbers I think we need to add this to docs or README.md

Hello!
It not worked. I set LISTEN_ADDR_IPV4 = "<IP_ADDRESS>" in config.py but proxy ignoring it and bind other address.

Everything works fine. It seems you incorrectly set the values in the configuration file or use the old version.

I'm using socks5 proxy and script bind address from proxy instead from interface. Is it correct in config.py to define address like this?
LISTEN_ADDR_IPV4 = "<IP_ADDRESS>"

Comment this string resolve problem:
my_ip_info["ipv4"] = get_ip_from_url(IPV4_URL1) or get_ip_from_url(IPV4_URL2)

Listen address can be different from the server address. tg://proxy?server=185.220.xx.xx — here you get your outside IP with NAT or something like that. But the listen address can be <IP_ADDRESS> i.e.


Use null-propogation where applicable and useful.

Primarily where it means one fewer field-access or simplifies event delegate invocation, though one or two cases have just the lesser advantage of allowing an IL stack dup rather than local access.
(Cases that involve introducing a nullable, e.g. where obj != null ? obj.Value : 0 can be turned into (obj?.Value) ?? 0 are less clearly wins, and so not done).

Looks good to me.

Looks good to me. Merged


Feature request: find .postcss-sorting.json in any parent folder

if I have project structure like this:
project/
  templates/
  static/
    package.json
    gulpfile.js
    .postcss-sorting.json
    component/
      component.css

Plugin can't find .postcss-sorting.json.

atom-postcss-sorting is an Atom editor plugin and it works in the context of atom project, not in your project context. So it shouldn't process all of your folders recursively until package.json or .postcss-sorting.json will be founded. If you have any specific file structure, you should use "Custom path to config file" plugin option for that https://github.com/lysyi3m/atom-postcss-sorting#options


Implement add, iadd custom methods on slist/sdict

Why:
slist()+slist() retuns a list() object

Fixed in https://github.com/asuiu/pyxtension/commit/aeb5fe1f6191a4ec8db5d101619810893ae23298.
Implemented also __iadd__ methods, so slist() += Iterable also functions now.
Closing as fixed.


[fpga_cw310_sival] emulation fails with  fpga_cw310_sival / fpga_cw310_sival_rom_ext

Description
While debugging #20589 I found this happens most of tests with
fpga_cw310_sival / fpga_cw310_sival_rom_ext
Same tests pass with fpga_cw310_test_rom and silicon_*_rom_ext
Boot with sival_rom code crush in flash_ctrl_init

With the latest master (296efbb67bdc99feb3df4359622c97f3801d7894)
if I read flash_fault_status, it return 0x144 for
fpga_cw310_test_rom, fpga_cw310_sival, and fpga_cw310_sival_rom_ext
But it is clean with silicon_owner_sival_rom_ext
This implies we have read seed errors from our secret partition in fpga_cw310_* target.

If you can, it might be good to try simulation. The FPGA isn't going to have different logic in flash_ctrl--It uses the same RTL. (There is some potential for different parameters, though.)

If you can, it might be good to try simulation. The FPGA isn't going to have different logic in flash_ctrl--It uses the same RTL. (There is some potential for different parameters, though.)

Running it. I am suspecting creator / owner secret may not be create in consistent with hw_cfg.
i.e.  hw_cfg sets scramble enable while those secrets are written without it.
Will update in this thread.

If you can, it might be good to try simulation. The FPGA isn't going to have different logic in flash_ctrl--It uses the same RTL. (There is some potential for different parameters, though.)

Running it. I am suspecting creator / owner secret may not be created in consistent with hw_cfg. i.e. hw_cfg sets scramble enable while those secrets are written without it.
Will update in this thread.

Simulation returns 0 fault. Next best debug env will be fpga_test_rom :)

Once I disabled scramble/ecc from flash_ctrl hw_info, fault status are all clean.
This implies, creator / owner seeds are not created with scrambled.
Mulling over how to fix.

Most of fpga tests using either rma or prod_personalized otp image.
This means whenever rom code trigger flash_ctrl_init, flash controller reads
creator/owner seed and pass to key manager. However, in fpga, the device comes up without those seeds
and this end up causing fatal error for every fpga_cw_310_* target.
In silicon, this won't happen because provisioned device have those seeds in flash.
So, workaround for fpga can be to use non-provisioned otp image for those tests
which need clean flash_ctrl status. I will submit a sample workaround for #20589


[Help] Some help required on how to implement the clear, undo and redo functionality.

Hi,
Thanks so much for you help here. However, I need a bit more help from you in extending your already awesome library. Your help is deeply appreciated.
What am I trying to do?
I am trying to add basically 4 new features -

CLEAR (clear the canvas and comments, basically empty everything)
UNDO (Maintain a history of annotations, and ability to undo a particular extension)
REDO (From the same history of annotations, ability to redo a particular extension)
SET ANNOTATIONS (Instead of read from file, write the annotations from server)

What I have tried?
My approach was to extend your toolbar for more buttons to trigger the above mentioned operations(except the set annotations). Here is what I did step by step,

First I extended src/const/icon.ts to export 3 more icons through SVG for - clear, undo, redo.
Imported the icons inside the toolbar something like this,

                        <ClearIcon />

{t('normal.clear')}

Passing the onClear and other functions from parent i.e src/index.tsx.
This is how implementation is on my src/index.tsx

// This is passed on to the toolbar as argument onClear()

private async clearAnnotations() {
        this.painter.clear()
        this.painter.reDrawAllAnnotations() // Re-draw all annotations
        const updatedAnnotations = this.painter.getData()
        console.log('Clear ', updatedAnnotations)
    }

Inside src/painter/index.ts -
public clear(): void {
        this.store.clear() // calling store clear which is defined below
        this.konvaCanvasStore.clear()
}

public reDrawAllAnnotations(): void {
        console.log('Redrawing')
        this.konvaCanvasStore.forEach(({ pageNumber }) => {
            this.reDrawAnnotation(pageNumber)  // call reDrawAnnotation for each page
        })
    }

Finally, inside the src/painter/store.ts -
public clear(): void {
        const annotationIds = Array.from(this.annotationStore.keys())
        annotationIds.forEach(id => this.delete(id))
    }

This is for my implementation for CLEAR, for undo and redo, I am doing something like this -
Inside src/painter/store.ts -
 private annotationStore: Map<string, IAnnotationStore> = new Map()
    private originalAnnotationStore: Map<string, IAnnotationStore> = new Map()
    private pdfViewerApplication: PDFViewerApplication
    private history: IAnnotationStore[][] = []
    private future: IAnnotationStore[][] = []

    .....
    .....

    public undo() {
        if (this.history.length > 0) {
            this.future.push(this.annotaions)
            const previousState = this.history.pop()
            this.annotationStore = new Map(previousState.map(annotation => [annotation.id, annotation]))
        }
    }

    public redo() {
        if (this.future.length > 0) {
            this.history.push(this.annotaions)
            const nextState = this.future.pop()
            this.annotationStore = new Map(nextState.map(annotation => [annotation.id, annotation]))
        }
    }

Then triggering it from src/index.tsx -
private undoAnnotations() {
        this.painter.undo()
        this.painter.reDrawAllAnnotations() // Re-draw all annotations
        const updatedAnnotations = this.painter.getData()

        console.log('Undo ', updatedAnnotations)
    }

    private redoAnnotations() {
        this.painter.redo()
        this.painter.reDrawAllAnnotations() // Re-draw all annotations
        const updatedAnnotations = this.painter.getData()
        console.log('Redo ', updatedAnnotations)
    }

What is not working?
When I press the clear button, it does trigger the functions and the updateAnnotations inside my clearAnnotations function inside src/index.tsx, I can see annotations being cleared.
console.log('Clear ', updatedAnnotations)  // Empty
but the annotations still stays on the top of canvas/pdf. I tried to redraw also, as you can see in my this.painter.reDrawAllAnnotations, but I am not seeing any changes with this.
Where I need help?
Sorry for such a long message, I wanted to make it detailed and easy for you to understand as well. I was hoping if you could help me with the SET_ANNOTATIONS, where I can send the stored annotations to a clear canvas, as well as UNDO,REDO, CLEAR methods.
For that I wanted to clear everything and then initialize the annotations. Steps I am taking - 1. CLEAR 2.  SET_ANNOTATIONS from parent through postMessage api from window.content.
Inside my src/index.tsx
if (event.data.type === 'SET_ANNOTATIONS') {
            const annotations = event.data.annotations  // Read annotations in the parent from server, then pass it to iframe through postMessage api
            this.setAnnotations(annotations)
 }

 private async setAnnotations(annotations: object) {
        const annotationsArray = Object.values(annotations) as IAnnotationStore[]
        await this.store.clear()
        await this.painter.initAnnotations(annotationsArray, false)
        this.painter.reDrawAllAnnotations()
        const updatedAnnotations = this.painter.getData()
        console.log('Set ', updatedAnnotations)
    }

Thank you so much for making to this far, any help appreciated. Happy to host the library if you want to see the code as well 🙏

Hi, I am closing this issue.
The ideas was to call this.updatePdfjs() after clearing annotations to reflect the changes.


Make sure planning document is up to date

Priority (1-3): 1
Impediment:
Prof. Dr. Riehle mentioned, that

the sprint goal sheet was not current
we should product glossary could be richer
burn down chart for the final project release was missing

Notes:

[x] remind Rebecca and Irene to update the Planning Document (and help them if needed)

Solution:

[x] Sprint goal sheet is consistent with the release plan
[x] product glossary is updated
[x] burn down chart for final project release is there

everything mentioned is updated :)


Dead link?

Hi, the link to the working paper in the ReadMe doesn't seem to work.

Thanks for calling my attention to this. It seems that github thinks that the link is an image, and anonymizes the URL. I will attempt to defeat it.

Since you outsmarted GitHub, I will close this issue


Rebase the subnet branch onto master

This rebases the upstream branch onto the PR which adds subnet tag filtering.

Helpful diff against master is here: https://github.com/terraform-aws-modules/terraform-aws-vpc/compare/master...plaid:terraform-aws-vpc:jandersen-rebase-onto-master


Bump revisions for fastrpc, qrtr, rmtfs tqftpserv and skales recipes

Bumped SRCREV for fastrpc, qrtr, rmtfs tqftpserv and skales recipes to pick latest commits from respective projects and build.

Also, could you please take a look at the surrounding commits and follow the existing  subject style.

I am not able to cleanly update commits. I am taking down this request and 'll submit another one.

@quic-vkraleti No. Please don't do that. Reopening.

Please find a good Git manual and study how to work with commits. Opening new PR for the same featureset means killing previous review and conversations, thus it is frowned upon.

No need to merge master. It's done automatically during the merge. Please remove the merge commit.

Please fix commit sujects to follow 'name: description' instead of 'recipes-foo: bar do something'.


Unexpected behavior due to bad handling of overridden responseInterceptor

If the InMemoryDbService class has a responseInterceptor function, InMemoryBackendService currently copies that function to its own responseInterceptor variable, and then uses that variable to call the function while processing requests.
This leads to unexpected behavior, because the function gets executed with the this variable set to the InMemoryBackendService instead of the InMemoryDbService (verify by calling console.log(this) from your responseInterceptor). Any code that uses this inside the overridden responseInterceptor to reference other variables or functions in the InMemoryDbService class will fail.

Closed by PR #79


(Ready for review) Update Key Benefits page

Resolves #569
@tennlee thinks the changes are okay
@nicholasloveday can you please review?

I have merged this into https://scores.readthedocs.io/en/228-documentation-testing-branch/ along with other changes.


How I can stub s3 in Rspec?

something like https://ruby.awsblog.com/post/Tx2SU6TYJWQQLC3/Stubbing-AWS-Responses ?

+1


GC with compaction filter support multi tablets

Development Task
Currently, GC with compaction filter works globally against the global rocksdb engine. We need to make it support multi tablets.
The basic idea is to make the global gc context and compaction_filter from global to per tablet.

/assign @BornChanger


Fix font button and emotes button placement

as seen from image above, one button needs to be adjusted or made smaller
i will do

fixed


#11867: Cleanup Unary composites

Ticket
https://github.com/tenstorrent/tt-metal/issues/11867
Problem description
Amount of code written here is remarkably unnecessary

we declare structs to register as TT-NN ops (A)
we want to save some code and we can templates so we create structs templated with enum representing op type
we then create an actual function
we wrap each function into a structure to map function to enum (we create a structure which we wanted to avoid at step 1) (B)
we call B from A
we reregister A as ttnn-op

What's changed
Clean things up
Checklist

[ ] Post commit CI passes

So now we simply register the function directly with register_operation_from_function and stop using the template enum in the template args?

I did consider that way, I see some artifact from that in the PR.
But no, this is not whats going on in this change and I expect that the change is a bit controversial.
Here are my considerations:
First of all, I just wanted us to cleanup the situation around enum and handle struct.
I think it was supposed to reduce amount of code, but it increased it. And I think for no reason.
I described in the PR description why I think so.
Second, I saw three options. Each option is ok and just has some pros and cons, largely taste.
1 Register function directly
This approach is clean and I overall like it.

Whatever happens to the registration - operation implementation does not have to be touched. Nice decoupling [great]
There is no code duplication, e.g. I don't have to maintain interface of a function, of Operation::invoke, etc [great]
Function is available to anyone and can be called directly, not going though the registered path [rather bad]
Raw function can be called to compose whatever without paying any cost a decorator might add [rather good]
Does not currently allow for overload, but there is no need for this today [neutral]
Does not extend well if we need to associate more things with an operation, so might have to rewrite to a struct later [neutral]

2 Create struct, register struct, call to those functions from struct's invoke
Same as above, but because this is just a manual implementation - remove the point about code duplication.
Between 1 and 2 I definitely would prefer 1.
Unless there is more to an operation than a function and something else has to be added. In the past it was a schema, it is not removed. Overloads, can probably be handled with more template code with option 1, though maybe not as conveniently.
3 Create structs, register structs, move function impl inside operation::invoke impl
This removes the thing I like - the raw function.
Means there is no nice separation. Registration infra (op struct) is tightly coupled with the math implementation itself.
Means when you compose, you might pay price of decorators.
But it keeps things largely consistent. As far as I see there are no function registrations today.
Because my main objective here was to minimize the maintenance surface, I went with option 3 as it removes much code and does not introduce a new way of doing things.

Will redo to functions registration later


As a developer, I want the readme file to be updated, so that the issues identified in the artifact quality assessment are addressed to make artifact setup easier

Technical requirements – Modification of the readme file to address the issues identified in the artifact quality assessment as well as any notable changes in feature #1.
Initial assignments – Modify the readme file using the artifact quality assessment as a guide, and include any changes made from feature #1.
Acceptance Criteria - Readme file includes the changes mentioned in the artifact quality assessment and addresses any changes from #1.
Impact – 3/5. Moderately Important.  Modification to the readme file should clarify a few loose ends about artifact setup and thus make it easier for stakeholders to get started.
Effort – 1/5. Easy.  Modifying the readme file is minor maintenance and shouldn’t take much time.
Dependencies – feature #1 must be completed first.

Also I think it would be appropriate if this issue also addressed how Maki's current documentation does not explain the output of its Clang plugin.
Right now one has to read Maki's associated paper to learn what Maki's output means; but there shuold be documentation internal to Maki that explains each of these properties.
It may also be worth adding a help message with these explanations also.
Also - while this repo contains the current state of Maki, there is no link to revised version of the artifact for ICSE 2024.
Adding this documentation will greatly help new users understand what Maki does, but writing them will require a deep understanding of the tool

This feature is closed as satisfied by task #5 (which has dependency on #1) which was satisfied by the closing of pull request #28.


chore: add escape-string-regexp to renovate.json5

The version 5 requires Node 12 and ES modules

Done in https://github.com/netlify/renovate-config/pull/31 :+1:


Package releases

Hi thanks for this library!
I am installing it via https://pypi.org/project/sqlalchemy-graphqlapi/#history - how often will you release? I am keen to try out the changes recently merged via https://github.com/cancan101/graphql-db-api/commit/fd18c0de4d9b41c3849956bd861907981ef8dcbf
thanks

I just published an update to pypi.


Help with integration for Laravel Breeze Starter Kit

Hey,
thanks so much for providing this!
Laravel officially switched to their own vite-integration for their starter kits (See https://laravel.com/docs/9.x/vite, they are using https://www.npmjs.com/package/laravel-vite-plugin and their @vite-tag in blade).
I tried to use this plugin with the Laravel Breeze Starter Kit, but visiting https://ddev-laravel-breeze-vite.ddev.site:3001/@vite/client returns
502: Unresponsive/broken ddev back-end site.
This is the ddev-router container: The back-end webserver at the URL you specified is not responding. You may want to use "ddev restart" to restart the site.

Demo repo: https://github.com/mandrasch/ddev-laravel-breeze-vite
My installation commands: https://github.com/mandrasch/ddev-laravel-breeze-vite/blob/main/README.md#how-was-this-created
DDEV version: ddev version v1.19.3
OS: Mac OSX Big Sur 11.6.5, M1 chip
Is this an issue related to ddev-viteserve or a general DDEV issue?
Thanks very much in advance for any hints! 🙏
Best regards,
Matthias

Looks like the problem is in your vite.config.js file:
import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';

export default defineConfig({
    plugins: [
        laravel([
            'resources/css/app.css',
            'resources/js/app.js',
        ]),
    ],
    /* ADDED: */
    server: {
        https: true,
        hmr : {
            host: 'ddev-laravel-breeze-vite.ddev.site'
        },
        port: 3001
    },
});
```.

The "ADDED" section should instead be:

```js
    /* ADDED: */
    server: {
        port: 3000
    },

This is because the main point of ddev-viteserve is to let Vite operate behind DDEV's routers.  Default settings for my add-on expect the vite server to put out http on port 3000. DDEV's router will handle wrapping the output in https and translating the port to 3001.
I'll likely update the docs soon to make this more clear; I'm also working on an extension to how the configuration works for DDEV generally with config.*.yaml files; once that fix lands, I'll take advantage of the new DDEV configuration feature to make my add-on more readily and intuitively configurable.

Thanks very much for your fast reply! I tested some variations,
A)
server: {
        https: true,
        hmr : {
            host: 'ddev-laravel-breeze-vite.ddev.site'
        },
        port: 3000
    },

Opening https://ddev-laravel-breeze-vite.ddev.site/login returns: This site can’t provide a secure connectionddev-laravel-breeze-vite.ddev.site sent an invalid response. ERR_SSL_PROTOCOL_ERROR
B)
server: {
       /* https: true,*/
        hmr : {
            host: 'ddev-laravel-breeze-vite.ddev.site'
        },
        port: 3000
    },

Opening https://ddev-laravel-breeze-vite.ddev.site/login returns: Mixed Content: The page at 'https://ddev-laravel-breeze-vite.ddev.site/login' was loaded over HTTPS, but requested an insecure script 'http://ddev-laravel-breeze-vite.ddev.site:3000/@vite/client'. This request has been blocked; the content must be served over HTTPS.
But the good news:
C)
server: {
       /* https: true,*/
        hmr : {
            host: 'ddev-laravel-breeze-vite.ddev.site'
        },
        port: 3000
    },

and opening up http://ddev-laravel-breeze-vite.ddev.site/login without https:// works. 🥳
But... is there a way to make this work via https as well? 🤔

Thanks very much for your fast reply! I tested some variations,
A)
server: {
        https: true,
        hmr : {
            host: 'ddev-laravel-breeze-vite.ddev.site'
        },
        port: 3000
    },

This one can't work, for two reasons.

If you use https in the setting, the DDEV router won't be able to handle vite's output. It must have access to HTTP.
The hmr.host setting is referring to a URL on your host, and not inside of the container, since inside of the container is all vite.config.js and the DDEV router have access to. In general, the hmr setting is unneeded, since server will do hmr automatically on any host/port that DDEV exports for you.  These are by default 3000 for HTTP, and 3001 for HTTPS.  HTTPS will use the same certificates that DDEV uses for HTTPS.

Opening https://ddev-laravel-breeze-vite.ddev.site/login returns: This site can’t provide a secure connectionddev-laravel-breeze-vite.ddev.site sent an invalid response. ERR_SSL_PROTOCOL_ERROR

True.  The add-on exports HTTP on 3000, and HTTPS on 3001, as I said above.

B)
server: {
       /* https: true,*/
        hmr : {
            host: 'ddev-laravel-breeze-vite.ddev.site'
        },
        port: 3000
    },

Closer, but still not right: you don't want to hmr: {} block here, it's not what you want.

Opening https://ddev-laravel-breeze-vite.ddev.site/login returns: Mixed Content: The page at 'https://ddev-laravel-breeze-vite.ddev.site/login' was loaded over HTTPS, but requested an insecure script 'http://ddev-laravel-breeze-vite.ddev.site:3000/@vite/client'. This request has been blocked; the content must be served over HTTPS.
But the good news:
C)
server: {
       /* https: true,*/
        hmr : {
            host: 'ddev-laravel-breeze-vite.ddev.site'
        },
        port: 3000
    },

and opening up http://ddev-laravel-breeze-vite.ddev.site/login without https:// works. 🥳
But... is there a way to make this work via https as well? 🤔

Yep.  Omit the hmr:{} block on your config, and you'll find you get the output you want on ddev-laravel-breeze-https://ddev-laravel-breeze-vite.ddev.site:3001

I've updated the README for release 0.1.1 to help make this more clear.  I'm waiting on a new feature in DDEV to land before updating the README much more, since configuration will be a lot easier for people to do once I have access to config.*.yaml files that safely override config.yaml.

Hey, thanks again for your support! Your recommended setup
import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';

export default defineConfig({
    plugins: [
        laravel([
            'resources/css/app.css',
            'resources/js/app.js',
        ]),
    ],
});

results in the following generated HTML:
<script type="module" src="http://[::]:3000/@vite/client"></script><link rel="stylesheet" href="http://[::]:3000/resources/css/app.css" /><script type="module" src="http://[::]:3000/resources/js/app.js"></script>    </head>

Which results in:

Unfortunately I don't know all the details yet, but for me it seems to be the case that Laravels integration of vite depends on the {hmr:} setting.

https://github.com/laravel/framework/blob/baf526ed6e725d7aa0950b0675361f4009a892af/src/Illuminate/Foundation/Vite.php
in combination with https://github.com/laravel/vite-plugin (npm)

You don't want to add certs, but rather have ddev-router be in charge of TLS termination in all cases.

Thanks @rfay, I'll withdraw certificates from this discussion for now! :-D
Further technical investigation:
The @vite tag just reads an URL string from the file public/hot. Source code The hot-file is generated while running ddev vite-serve start (or ddev exec npm run dev) by laravel-vite-plugin (npm).
        if (is_file(public_path('/hot'))) {
            $url = rtrim(file_get_contents(public_path('/hot')));

            return new HtmlString(
                $entrypoints
                    ->map(fn ($entrypoint) => $this->makeTag("{$url}/{$entrypoint}"))
                    ->prepend($this->makeScriptTag("{$url}/@vite/client"))
                    ->join('')
            );
        }

Without {hmr} setting, this file is has just this content:

With hmr.host configured, there is the DDEV url in the hot-file.
Official docs for vites server.hmr: https://vitejs.dev/config/#server-hmr

If specifying server.hmr.server, Vite will process HMR connection requests through the provided server. If not in middleware mode, Vite will attempt to process HMR connection requests through the existing server. This can be helpful when using self-signed certificates or when you want to expose Vite over a network on a single port.

Forgot to mention the most important thing ;-) The @vite tag is used in resources/views/layouts/app.blade.php which is the basic template of the Laravel Breeze Starter Kit:
        <!-- Scripts -->
        @vite(['resources/css/app.css', 'resources/js/app.js'])

And sorry in advance if I'm totally on the wrong track with hmr ;-)

And sorry in advance if I'm totally on the wrong track with hmr ;-)

:-)
What does the blade tag
<!-- Scripts -->
        @vite(['resources/css/app.css', 'resources/js/app.js'])

resolve to in the actual HTML generated and passed to the browser?
It would need to either use the full path with the full URL using the host name used in DDEV generated certs, or a relative URI starting in "/", so that you inherit the correct protocol://HOST_NAME from the document. Anything else would be a problem.

 @vite(['resources/css/app.css', 'resources/js/app.js']) expands to ...
<script type="module" src="http://<IP_ADDRESS>:3000/@vite/client"></script>
<link
    rel="stylesheet"
    href="http://<IP_ADDRESS>:3000/resources/css/app.css"
>
<script
    type="module"
    src="http://<IP_ADDRESS>:3000/resources/js/app.js"
></script>
<link
    rel="icon"
    type="image/x-icon"
    href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAHZJREFUOE/t08ENgDAIBdD/6XjO4Jhup2CIMVXaao3xZq/AS4HAYZxmvHjcARGklqOKpRU7AaQUeaYKEGghFcAOCOEAhTCzKtINuFpDMkAkirdQ/iD2pZZncgvEYm/pARDLt5n8wPczuL6syy30HmV1jb3FMW8FYduDoVoaPbwAAAAASUVORK5CYII="
>

@tyler36 Where does Laravel Vite get its notion of what the src is for that script tag? How is it set?
Assuming that you're getting served HTTPS at MY-DDEV-SECURE-HOST:someport, we'd want src to be:
src="https://MY-DDEV-SECURE-HOST:3001
if we are using the add-on with its default settings. How would we get the Laravel integration to do that?  Where is it getting the setting?

@tyler36 Where does Laravel Vite get its notion of what the src is for that script tag? How is it set?

See comment above, @vite (PHP) reads the URL string from public/hot-file (generated via nodejs in laravel-vite-plugin).
I quickly checked, that seems to be a laravel-vite-plugin feature and not a standard feature of vite?
configureServer(server) {
            const hotFile = path.join(pluginConfig.publicDirectory, 'hot')

            const envDir = resolvedConfig.envDir || process.cwd()
            const appUrl = loadEnv('', envDir, 'APP_URL').APP_URL

            server.httpServer?.once('listening', () => {
                const address = server.httpServer?.address()

                const isAddressInfo = (x: string|AddressInfo|null|undefined): x is AddressInfo => typeof x === 'object'
                if (isAddressInfo(address)) {
                    viteDevServerUrl = resolveDevServerUrl(address, server.config)
                    fs.writeFileSync(hotFile, viteDevServerUrl)

                    setTimeout(() => {
                        server.config.logger.info(colors.red(`\n  Laravel ${laravelVersion()} `))
                        server.config.logger.info(`\n  > APP_URL: ` + colors.cyan(appUrl))
                    })
                }
            })

//...

/**
 * Resolve the dev server URL from the server address and configuration.
 */
function resolveDevServerUrl(address: AddressInfo, config: ResolvedConfig): DevServerUrl {
    const configHmrProtocol = typeof config.server.hmr === 'object' ? config.server.hmr.protocol : null
    const clientProtocol = configHmrProtocol ? (configHmrProtocol === 'wss' ? 'https' : 'http') : null
    const serverProtocol = config.server.https ? 'https' : 'http'
    const protocol = clientProtocol ?? serverProtocol

    const configHmrHost = typeof config.server.hmr === 'object' ? config.server.hmr.host : null
    const configHost = typeof config.server.host === 'string' ? config.server.host : null
    const serverAddress = address.family === 'IPv6' ? `[${address.address}]` : address.address
    const host = configHmrHost ?? configHost ?? serverAddress

    return `${protocol}://${host}:${address.port}`
}

https://github.com/laravel/vite-plugin/blob/85c69328af542c80b368f6f4c270067033911af3/src/index.ts#L159

But according to that, config.server.host should also work (without setting server.hmr).
    server:{
        host: 'ddev-laravel-breeze-vite.ddev'
    }

But it returns http://[::]:3000 in public/hot. Maybe a bug in laravel-vite-plugin? 🤔

How is Laravel Vite configured?  I find it unlikely that it's getting settings out of vite.config.js, for the same reason I don't do it in golang:  parsing that file is not something you want to do if you're not using nodejs.  THERE HAS TO BE SOME OTHER PLACE LARAVEL VITE IS GETTING ITS SETTINGS.
This is a good question for Enzo Innocenzi, but a quick look at the docs shows that there is indeed a place for these configurations. Short version: the dev-server configuration needs to tell Laravel Vite how to create the tags.  I'm not sure exactly how vite.php is being used, so you'll need to explain that vite is running inside a docker container and that it is routed out to the host.  Not sure exactly what the settings would be, but likely that is the place to get this configured.

https://github.com/innocenzi/laravel-vite/blob/fa591aa02f20a0bec6d3b6e32c03ef438e4ceb06/docs/src/guide/essentials/development.md
Has some information about changing host, certificates and using with Lagoon, Laravel Sails

Whoops, I should have made this more clearer and do a better research before:
I'm trying to use the brand new core integration of vite in Laravel. This is not the third party plugin https://laravel-vite.dev/ by Enzo Innocenzi anymore.
It is in laravel/framework  and laravel/vite-plugin by Laravel.
References:

https://twitter.com/taylorotwell/status/1541795873838989314
https://github.com/mandrasch/ddev-laravel-breeze-vite/blob/main/composer.json
https://github.com/mandrasch/ddev-laravel-breeze-vite/blob/main/package.json#L12

Still, it's substantially based on Enzo's work.  Looked at the docs for the official integration; this is in fact this case, also as Enzo explains it on the Vite dev discord.
I've left a long note explaining what we're trying to do for Enzo, asking who is best suited to answer the question. My sense is that Enzo may well be able to, since the official integration owes so much to his previous work.

I've left a long note explaining what we're trying to do for Enzo, asking who is best suited to answer the question. My sense is that Enzo may well be able to, since the official integration owes so much to his previous work.

Thanks, very much appreciated! (Already learned a lot about Laravel & Vite as well here in this issue 👍 )

Here's what I hear from Enzo:

But I need Laravel Vite to generate the correct tags for the web page that Laravel renders to the browser

That would be configurable with dev_url - that's the URL with which tags are generated. But it's also used to configure some stuff in the Vite plugin, so there may be side-effect depending on what you use. I'd be willing to work out a solution if that's not sufficient though, I'll need to understand the problem better but we might PR something to have a different dev_url and URL for generated tags

Thanks very much for working on this together!
Maybe we should split our efforts at this point? 🤔
A) My goal is to use the official (new) vite implementation in laravel/framework + laravel-vite-plugin with DDEV.
Demo DDEV repository to play around: https://github.com/mandrasch/ddev-laravel-breeze-vite/
Enzo Innocenzi just confirmed in vite Discord that Laravels new implementation does not have a dev_url and no config/vite.php-file (currently).
But I guess the NodeJS source code of laravel-vite-plugin could be changed to read something like VITE_DEV_URL from .env I guess. I already posted the important source code as comment.
B) We could try to get innocenzi/laravel-vite working with DDEV and ddev-vite-serve.

I'm not that familiar with the Laravel project, so I don't know how easy / how hard it is to get feature changes.  But I encourage you to file an issue on the Laravel project with your use case.
I did notice a feature where you can substitute your own code to render out the blade tag. This might be your best approach, since you'd be able to read DDEV environment variables w/o causing side effects.

Here's what I was thinking about.  I'd try constructing the correct URL using the DDEV generated environment variables, largely ignoring whatever laravel is telling you :-)

BTW -- if you're happy with where we are, feel free to close this issue if Github lets you do that.

Thanks, also interesting approach! 👍
I just read in the Laravel Sail community (also a Docker tool), that they just overwrite public/hot file manually for testing (after first run of vite). This is the easiest way of testing/debugging of course, could have figured this out myself. Sorry! 🤦 😆
I tried it with the following for public/hot
https://ddev-laravel-breeze-vite.ddev.site:3001

and a the vite.config.ts you suggested earlier:
import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';

export default defineConfig({
    plugins: [
        laravel([
            'resources/css/app.css',
            'resources/js/app.js',
        ]),
    ]
});

It renders out the script tag correctly and the first run works:
<script type="module" src="https://ddev-laravel-breeze-vite.ddev.site:3001/@vite/client">

But the web socket tries to connect on 3000 instead of 3001:

Also tried the following config, unfortunately no success. But it feels close?! 🤔
import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';

export default defineConfig({
    plugins: [
        laravel([
            'resources/css/app.css',
            'resources/js/app.js',
        ]),
    ],
    server:{
        hmr:{
            port: 3001
        }
    }
});

No, server.hmr is almost certainly wrong.  A web socket will need to be routed out by the nginx router, inside of DDEV.  So if you do that, the web socket will never get out of DDEV.
Remember, the settings of vite.config.ts are seen entirely inside of ddev, before routing occurs. Everything seen by the browser is outside of DDEV, after routing. But the Laravel app, since it runs inside of DDEV, can see DDEV_HOSTNAME and HTTPS_EXPOSE.  On one of my test systems these have the values of:
DDEV_HOSTNAME=phpunit-course.ddev.site
HTTPS_EXPOSE=8843:80,8026:8025,3001:3000

The 3001:3000 portion of the latter is the configuration of the router; port 3000 inside the container (HTTP) is 3001 outside the container (HTTPS).  This is why server.hmr will not work.  I'll creating settings for the 3000 and 3001 defaults as soon as the config.*.yaml merger issue lands in DDEV HEAD.
So you want Laravel to generate the tags as "https://$DDEV_HOSTNAME:3001". If the official Laravel Vite does not give you a vite.php setting, you'll need to do this substitution in these calls, something like this:
// Overrides script tag generation
Vite::makeScriptTagsUsing(function (string $url, Chunk $chunk = null): string {
   if (isset($_ENV['DDEV_HOSTNAME']) {
     $url = sprintf('https://%s:3001', $_ENV['DDEV_HOSTNAME']);
  }
    return sprintf('<script type="module" src="%s" defer></script>', $url);
});

// Overrides style tag generation
Vite::makeStyleTagsUsing(function (string $url, Chunk $chunk = null): string {
   if (isset($_ENV['DDEV_HOSTNAME']) {
     $url = sprintf('https://%s:3001', $_ENV['DDEV_HOSTNAME']);
  }
    return sprintf('<link rel="stylesheet" href="%s" crossorigin="anonymous" />', $url);
});

calling them where the docs say you should.  This will change your URLs w/o side effects, I think.  Once I have a place to set the default values of vite-port-inside-ddev and vite-port-outside-ddev, you'd use those as well.

http://ddev-laravel-breeze-vite.ddev.site:3000 works to serve HTTP (but not HTTPS, as you've seen) because DDEV's internal router renders port 3000 inside as 3000 outside as well.
The router also proxies out that internal 3000/HTTP out as 3001/HTTPS external.

I'm unfortunately not deeply familiar with DDEV router. But DDEV docs state

This works only for services with an http API, but results in having both http and https ports (9998 and 9999)
https://ddev.readthedocs.io/en/stable/users/extend/custom-compose-files/#docker-composeyaml-examples

So is this a DDEV router issue? Would opening the site via https:// work with vite if we could expose port 3000 as HTTPS-only port (without caring about HTTP whatsoever)? 🤔

You potentially could; but you have to route HTTP to somewhere from what @rfay tells me, or the router won't work right. This is, um, a FEATURE of the router.
But you certainly could switch the HTTP and HTTPS ports if you wish; easy to do by changing the DDEV env variables HTTPS_EXPOSE and HTTP_EXPOSE (see config.yaml), making external HTTPS 3000, and external HTTP 3001, for example. But I'm going to wait to config update I've been working on with Randy.

This is all about what all reverse proxies do... all over the world. They typically route traffic from one entrypoint to a back-end HTTP server. And they often also terminate https.
Because https traffic is encrypted, the back-end servers can't be serving https, because the reverse proxy (ddev-router in this case) can't decrypt it. And even if it did, it would mean two separate encryption/decryption processes and two separate sets of keys. Quite a mess.
So ddev-router and every other reverse proxy in its class do https on the edge, and talk http typically to back-end servers. vite in this case is the back-end server.
I hope that helps understanding of what's going on here.

Thanks very much @rfay for clarification! (And sorry for the noob questions!)
So I guess this narrows it down to vite and use the reverse proxies + https?
I saw that they were quite a few issues submitted regarding reverse proxies (and docker) in vites official repo, I'll try to dive into them: https://github.com/vitejs/vite/issues?q=reverse+proxy+
Some mention server.hmr.clientPort which I haven't heard before). Maybe it's gotten easier with vite v3 as well. And on the bright side: The Laravel Sail Docker users face a similiar challenge I guess.
But for debugging this I think I'll have to take a step back and start with just vite instead of a Laravel Starterkit:
I'll try to get a working DDEV https setup with a blank vite v2 and blank vite v3 first. (I still don't have an idea what the correct vite config for https + docker + reverse proxy is).
If anyone has any working DDEV + vite + https example repository, please let me know 🙏

PS: Okay, Craft CMS devs to the rescue!
Just saw https://nystudio107.com/docs/vite/#local-development-environment-setup (via craftquest)
They use the following config, which worked for me in https (with overriding public/hot manually and using ddev exec npm run dev) 🥳🥳🥳
# Override the web container's standard HTTP_EXPOSE and HTTPS_EXPOSE services
# to expose port `3000` of DDEV's web container.
version: '3.6'
services:
  web:
    ports:
      - '3000'
    environment:
      - HTTP_EXPOSE=${DDEV_ROUTER_HTTP_PORT}:80,${DDEV_MAILHOG_PORT}:8025,3001:3000
      - HTTPS_EXPOSE=${DDEV_ROUTER_HTTPS_PORT}:80,${DDEV_MAILHOG_HTTPS_PORT}:8025,3000:3000

server: {
  host: '<IP_ADDRESS>',
  port: 3000
}

The downside of this is mentioned in the DDEV docs as far as I understand it:

That approach usually isn't sustainable because two projects might want to use the same port, so we expose the additional port (to the docker network) and then use the ddev-router to bind it to the host.
https://ddev.readthedocs.io/en/stable/users/extend/custom-compose-files/#docker-composeyaml-examples

You just want expose, not ports if you're going to put it on port 3000, because with your current setup ddev-router is also going to try to use port 3000, so I don't think this one will even be able to come up.
I'll be happy to do a screenshare call with you and work with you on your project and explain what's going on here. Let me know if you'd like to and there's a convenient time.
But if you're going to use ports then remove 3000/3001 from HTTP_EXPOSE and HTTPS_EXPOSE. But then if you try to use https, and if vite is serving https, your browser won't trust it. DDEV has things set up to trust the mkcert CA.

Thanks so much for your offer, @rfay! But I do hope this won't be necessary anymore (and you can use your time in a better way. )
I just tried out another simple setup with vite3, a custom port 5133 and your suggested approach - it works! 🥳 🥳 🥳
(Hope I got it right this time. Funfact: ports also worked. But thanks for the details, I won't use ports of course! 😉 )
Repo: mandrasch/vite-php-setup-ddev-test (Fork of andrefelipe/vite-php-setup)
# ./ddev/docker-compose.vite.yaml
version: '3.6'
services:
  web:
    expose:
      - '5133'
    environment:
      - HTTP_EXPOSE=${DDEV_ROUTER_HTTP_PORT}:80,${DDEV_MAILHOG_PORT}:8025,5134:5133
      - HTTPS_EXPOSE=${DDEV_ROUTER_HTTPS_PORT}:80,${DDEV_MAILHOG_HTTPS_PORT}:8025,5133:5133

/* vite/vite.config.js */
  server: {
    // respond to all network requests
    host: '<IP_ADDRESS>',
    // "Set to true to exit if port is already in use, instead of automatically try the next available port."
    strictPort: true,
    port: 5133
  },

So using the vite port in HTTPS_EXPOSE instead of HTTP_EXPOSE did the trick for https-DDEV-sites.
If I switch it to  the following - which is also used in https://github.com/torenware/ddev-viteserve/blob/b133b2dd70c4359190755625ebc8f4887d72a850/docker-compose.viteserve.yaml - I get the following error when I open my DDEV project with https (which is the DDEV default afaik?):
GET https://vite-php-setup-ddev-test.ddev.site:5133/main.js net::ERR_SSL_PROTOCOL_ERROR
    expose:
      - '5133'
    environment:
      - HTTP_EXPOSE=${DDEV_ROUTER_HTTP_PORT}:80,${DDEV_MAILHOG_PORT}:8025,5133:5133
      - HTTPS_EXPOSE=${DDEV_ROUTER_HTTPS_PORT}:80,${DDEV_MAILHOG_HTTPS_PORT}:8025,5134:5133

Needs some more testing with Laravel, vite2, etc. - but I won't share that here anymore. :wink:
Thanks so much you all! 🙏 🙏 🙏

I got it working on a similar note but i used web_extra_exposed_ports and abusing the wss protocol (picked from https://github.com/laravel/vite-plugin/blob/main/src/index.ts#L393);
.ddev/config.yaml
web_extra_exposed_ports:
  - name: ViteJS
    container_port: 5173
    http_port: 5172
    https_port: 5173

vite.config.js
...
    server: {
        hmr: {
            protocol: 'wss',
            host: 'example.ddev.site',
        }
    },
...

and then run ddev exec npm run dev -- --host
I dont know if this will conflict any websocket flow but it works for my usecase and wanted to share :-)


PHP 8.0 support

Hey there,
is there already any plan regarding PHP 8.0 support (and thus, phpunit 9.3 support)?
Is there anything I can help with?

That is fixed in master.


calico apply bgpPeer Error

This is my config file:
[root@slave1 ~]# cat bgpPeer.yml
apiVersion: v1
kind: bgpPeer
metadata:
  scope: node
  node: slave2
  peerIP: <IP_ADDRESS>
  scope: node
  node: slave3
  peerIP: <IP_ADDRESS>
spec:
  asNumber: 64512

[root@slave2 ~]# cat bgpPeer.yml
apiVersion: v1
kind: bgpPeer
metadata:
  scope: node
  node: slave1
  peerIP: <IP_ADDRESS>
  scope: node
  node: slave3
  peerIP: <IP_ADDRESS>
spec:
  asNumber: 64512

[root@slave3 ~]# cat bgpPool.yml
apiVersion: v1
kind: bgpPeer
metadata:
  scope: node
  node: slave2
  peerIP: <IP_ADDRESS>
  scope: node
  node: slave1
  peerIP: <IP_ADDRESS>
spec:
  asNumber: 64512

[root@slave3 ~]# calicoctl node status
Calico process is running.

IPv4 BGP status
+--------------+---------------+-------+----------+--------------------------------+
| PEER ADDRESS |   PEER TYPE   | STATE |  SINCE   |              INFO              |
+--------------+---------------+-------+----------+--------------------------------+
| <IP_ADDRESS> | node specific | start | 14:50:02 | Idle BGP Error: Bad BGP        |
|              |               |       |          | identifier                     |
+--------------+---------------+-------+----------+--------------------------------+

IPv6 BGP status
No IPv6 peers found.

[root@slave3 ~]#

[root@slave3 ~]# calicoctl get bgpPeers
SCOPE   PEERIP         NODE     ASN
node    <IP_ADDRESS>    slave1   64512
node    <IP_ADDRESS>   slave3   64512

[root@slave3 ~]#

Idle BGP Error: Bad BGP identifier...
what mean? Please help.

Are you trying to configure your bgp manually? If so, I feel like I need to ask why, what are you trying to achieve?
Running calico node should handle the bgp peering between the nodes unless you need something more advanced.

I'm Sorry, I have traveled these days.
I see the official said “We generally expect the full node-to-node mesh to be disabled and explicit BGP peering to be configured.”
So I did the following:
$ calicoctl config set nodeToNodeMesh off
$ cat bgpPeer.yml
apiVersion: v1
kind: bgpPeer
metadata:
  scope: node
  node: slave1
  peerIP: <IP_ADDRESS>
  scope: node
  node: slave3
  peerIP: <IP_ADDRESS>
spec:
  asNumber: 64512

And then it was. Idle BGP Error: Bad BGP identifier

Ah. Maybe I can clarify that a bit.  Using the node-to-node mesh is fine for small deployments, which I think you are as it looks like you are currently using 3 nodes.  I believe I have seen the recommendation to consider utilizing Route Reflectors when having clusters around 100 nodes.  Disabling the node-to-node mesh is usually with the expectation that alternate peering is setup, like using Route Reflectors.  I don't believe there is any benefit to manually configuring node-to-node peering.
So I think you should not disable the node-to-node mesh unless you have a specific requirement or need to because your cluster is getting large.
I hope this helps.

Thank you for the suggestion, I know how to do it.
@tmjd you are a good man. :+1:

@tangjiaxing669 how to configure when in peer to peer ?I have the same problem like you.

@2014qirong There are good examples at the official site, you can go and have a look first.

Hi @2014qirong  & @tangjiaxing669 or anyone do you mind to give examples?
I'm having some trouble understand these bgp


Static analysis with PHPStan

Replaces #690, targets 3.x branch.
So far I have been able to get to level 3. Higher levels are proving to be nontrivial. You can merge it as is, and I can continue in another PRs, or I can do some more work in this one.

Thank you for contributing! 🎉


eslint does not consider default value as a defaultProps

The below checks fine in version 7.20.5 and throws these errors in 7.20.6.
error propType "width" is not required, but has no corresponding defaultProps declaration react/require-default-props
error propType "height" is not required, but has no corresponding defaultProps declaration react/require-default-props

export type Item = {
  name: string;
  label: string;
};

type Props = Item & {
  width?: 'regular' | 'large';
  height?: number;
};

const MyComponent = ({
  name,
  label,
  height = 8,
  width = 'regular',
}: Props) => {
  return ...
}

Note from https://github.com/yannickcr/eslint-plugin-react/issues/2762#issuecomment-681202088
7.20.5 did not support typescript TSTypeAliasDeclaration and TSIntersectionType, so eslint ignored the propType check.
After upgrade to 7.20.6, this feature is supported, so it will do the propType check

This seems correct to me. Default values aren't the same as defaultProps, and the rule is meant to force .defaultProps.

Sorry for the confusion.
According to document:

One advantage of defaultProps over custom default logic in your code is that defaultProps are resolved by React before the PropTypes typechecking happens, so typechecking will also apply to your defaultProps. The same also holds true for stateless functional components: default function parameters do not behave the same as defaultProps and thus using defaultProps is still preferred.

So default values are not the same as defaultProps.

We are using typescript in our project.
Do we have any benefit from adding .defaultProps and additional PropType checking?

Yes. It allows JS tooling, at runtime, to read the defaultProps; it helps explicitly document the types; it allows consumers to take advantage of those defaultProps.
Note that TypeScript (and Flow) both have a flaw in how they type props on react components: there's actually two types, the external ones (that users see), and the internal ones (that your component code sees). This can make it tricky to use defaultProps, but the benefits still exist.


Add build tooling to support releasing patches, i.e. <IP_ADDRESS>

Build tooling to release patches when there is no corresponding release from opentelemetry-proto.
For example, to release a patch for 1.3.2:

run the release build action
Set the release version argument to <IP_ADDRESS>
This will publish a release with version <IP_ADDRESS>, but which uses opentelemetry-proto sources from the 1.3.2 release tag

See https://github.com/open-telemetry/opentelemetry-proto-java/pull/17 for more info.

The release was successfully staged to sonatype, but failed to finish publishing: https://github.com/open-telemetry/opentelemetry-proto-java/actions/runs/11111731756/job/30872304418

What went wrong:
Execution failed for task ':release'.
version should not be set in build file when using nebula-release plugin. Instead use -Prelease.version parameter

So weird for the nebula plugin to partially succeed, only to have a later task reject the way that release.version is specified.

Also weird that two artifacts ended up in sonatype: 1.3.2 and <IP_ADDRESS>.
🤔
Obviously I should go and fix this, but I'm also tempted to close (i.e. release) the staged <IP_ADDRESS> artifact.


Moving just the contents up from directory

I was wondering if there is a way that I can move just the contents one (or more) levels up from a directory.
For example:
| main folder
| – – 1.jpg
| – – subfolder
| – – | – – 2.jpg
In this instance I would like to move 2.jpg into the main folder so it would become:
| main folder
| – – 1.jpg
| – – 2.jpg
| – – subfolder
Is this possible? Thanks

Yes, see the example. You can move multiple directories.


Change IAU showers source to official RMS file

https://raw.githubusercontent.com/CroatianMeteorNetwork/RMS/master/share/established_showers.csv

I have found iau_nos that fall outside established_showers.csv in the GMN trajectory dataset. https://www.ta3.sk/IAUC22DB/MDC2007/Etc/streamfulldata.txt will continue to be used as a source.