question-mark
Stuck on an issue?

Lightrun Answers was designed to reduce the constant googling that comes with debugging 3rd party libraries. It collects links to all the places you might be looking at while hunting down a tough bug.

And, if you’re still stuck at the end, we’re happy to hop on a call to see how we can help out.

Shared singleton store instance on server, handling dynamic user locales on SSR

See original GitHub issue

Hello. I’ve noticed that this library creates a single $locale store shared in sveltekit server instance. As per sveltekit documentation

Mutating any shared state on the server will affect all clients, not just the current one.

As I understand, in init as per

<script>
  init({
    fallbackLocale: 'en',
    initialLocale: getLocaleFromNavigator($session.acceptedLanguage)
  });	
</script>

you set current user’s request locale in this single store instance. I don’t think this is desired behavior. This could probably cause racing conditions between multiple SSR requests. Store should be created per request on SSR, probably in the highest level component, or am I missing something?

Issue Analytics

  • State:open
  • Created 2 years ago
  • Reactions:1
  • Comments:10 (3 by maintainers)

github_iconTop GitHub Comments

1reaction
OwsOwiescommented, Oct 11, 2022

I don’t agree with your reasoning here. No one reported race-conditions on some different repository, how is that an argument.

Here is an official discussion on svelte kit where someone mentions data leaking: https://github.com/sveltejs/kit/discussions/4339#discussioncomment-3258927 Still, it’s anecdotal, just like you saying that you don’t think anyone has reported race conditions. It might be possible, it might be not. Please note that it might be hard to determine that such issue even exists in your production application if there is no one reporting such a mismatch, if you don’t have dedicated analytics for this or you don’t encounter it yourself. That is the nature of such issues. I don’t have any evidence to confirm the issue exists or not as my app is not in a production yet and I can’t perform any experiment myself. However I do think that if svelte documentation mentions explicitly not to keep shared state like this evidence is not really necessary, it’s just something you should not do period. If you do you might potentially encounter issues, which is the case here.

Here is official svelte kit paragraph saying explicitly that those stores should not be global:

In many server environments, a single instance of your app will serve multiple users. For that reason, per-request state must not be stored in shared variables outside your load functions.

https://kit.svelte.dev/docs/load#shared-state

Here is similar issue to this one on the library you mentioned: https://github.com/kaisermann/svelte-i18n/issues/165 As per this issue, the owner admits that he doesn’t really know if the library is compatibile with sveltekit. It’s still open: https://github.com/kaisermann/svelte-i18n/issues/166

If the goal of this library is to be compatible with svelte kit, this issue should be resolved.

0reactions
cibernoxcommented, Aug 5, 2022

The race condition seems possible in theory but I haven’t been able to reproduce it. If this repo is affected by this, i believe the svelte-i18n should too as our approach to setting the current locale is the same, and I don’t think anyone has reported race conditions.

I have the hunch that while possible in theory, the single threaded nature of javascript makes it not happen in practice.

Read more comments on GitHub >

github_iconTop Results From Across the Web

Issues · cibernox/svelte-intl-precompile · GitHub
Cannot find module '$locales' or its corresponding type declarations ... Shared singleton store instance on server, handling dynamic user locales on SSR.
Read more >
Server-Side Rendering (SSR) - Vue.js
The pattern declares shared state in a JavaScript module's root scope. This makes them singletons - i.e. there is only one instance of...
Read more >
[feat] helper for creating stores · Issue #7105 · sveltejs/kit · GitHub
Describe the problem You can't just blindly create a store in SSR or it'll end up being a global store shared by all...
Read more >
Writing Universal Code - Quasar Framework
Instead of directly creating a Router and Vuex Store instances, ... For tasks shared between server and client but use different platform APIs, ......
Read more >
Next.js: The Good, Bad and Ugly - An Idiosyncratic Blog
Out of the box, it provides features like server-side rendering (SSR), static-site generation (SSG), incremental-static-regeneration (ISR), ...
Read more >

github_iconTop Related Medium Post

No results found

github_iconTop Related StackOverflow Question

No results found

github_iconTroubleshoot Live Code

Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free

github_iconTop Related Reddit Thread

No results found

github_iconTop Related Hackernoon Post

No results found

github_iconTop Related Tweet

No results found

github_iconTop Related Dev.to Post

No results found

github_iconTop Related Hashnode Post

No results found