Why is crypto.subtle.digest designed to return a promise?

Every other system I’ve ever worked with has the signature hash(bytes) => bytes, yet whatever committee designed the Subtle Crypto API decided that the browser version should return a promise. Why? I’ve looked around but I’ve never found any discussion on the motivation behind that.

  • @Technus@lemmy.zip
    link
    fedilink
    1327 days ago

    It executes on a native thread in the background. That way it doesn’t stall the Javascript execution loop, even if you give it a gigabyte of data to hash.

  • @vzq
    link
    927 days ago

    It’s standard for operations that take a while and can be performed asynchronously.

    What’s your problem with it?

    • EthanOP
      link
      fedilink
      English
      326 days ago

      async/await infecting all of my code, being unable to create a get myField() method that involves a hash calculation. It may be standard to do heavy lifting concurrently, but async hash functions are certainly not standard in any of the languages I’ve used (which is quite a few).

      • @vzq
        link
        226 days ago

        From browsing your other comments on this thread I understand that you are in a context where you can’t await, that you expect the invocation to take very little time, and that the library offers no complementary sync interface.

        As far was I know you’re stuck in this case. I consider the stubborn refusal to add “resolve this promise synchronously right now” a major flaw in js.

        • macniel
          link
          fedilink
          7
          edit-2
          26 days ago

          Given the nature of JS running only on a single thread. Promises/asynchronity is the only way to keep the browser from locking up.

          Thus insisting on any other way is a major flaw in the developer not the language.

          • @vzq
            link
            526 days ago

            Thus insisting on any other way is a major flaw in the developer not the language.

            I mean, I understand the idea, but this is a pretty asshole way to frame it. I don’t think I deserve that, and certainly OP doesn’t deserve that.

          • John
            link
            fedilink
            226 days ago

            @DmMacniel @vzq

            > Given the nature of JS running only on a single thread.

            No no, I think you found the language flaw.

  • macniel
    link
    fedilink
    727 days ago

    its a good idea to be as non blocking as possible especially on time and resource consuming tasks like IO, cryptography, …

    just use await in an async function.

    • EthanOP
      link
      fedilink
      English
      426 days ago

      just use await in an async function.

      Sure, I’ll just put await and async everywhere. Oh wait, I can’t. A constructor can’t be async so now I need to restructure my code to use async factories instead of constructors. Wonderful…

      • @vzq
        link
        3
        edit-2
        26 days ago

        A constructor can’t be async so now I need to restructure my code to use async factories instead of constructors

        It sounds like you’re trying to do OOD/OOP. In js that’s usually not the way to go. You might want to restructure into a more functional architecture anyway.

      • macniel
        link
        fedilink
        226 days ago

        Sounds like an architectural issue to begin with. A constructor shouldn’t do the heavy lifting to begin with.

        • EthanOP
          link
          fedilink
          English
          126 days ago

          You consider calculating the hash of a few bytes to be heavy lifting?

          • macniel
            link
            fedilink
            426 days ago

            The API doesn’t restrict the amount of bytes to be hashed. So yeah it’s still heavy lifting.

            Trigger a loading event after the constructor is finished that the view model takes to calculate your hash.