WritableStreamDefaultWriter.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. /*
  2. * Copyright (c) 2023, Matthew Olsson <mattco@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibJS/Runtime/PromiseCapability.h>
  7. #include <LibWeb/Bindings/Intrinsics.h>
  8. #include <LibWeb/Bindings/WritableStreamDefaultWriterPrototype.h>
  9. #include <LibWeb/Streams/AbstractOperations.h>
  10. #include <LibWeb/Streams/WritableStream.h>
  11. #include <LibWeb/Streams/WritableStreamDefaultWriter.h>
  12. #include <LibWeb/WebIDL/ExceptionOr.h>
  13. namespace Web::Streams {
  14. WebIDL::ExceptionOr<JS::NonnullGCPtr<WritableStreamDefaultWriter>> WritableStreamDefaultWriter::construct_impl(JS::Realm& realm, JS::NonnullGCPtr<WritableStream> stream)
  15. {
  16. auto writer = MUST_OR_THROW_OOM(realm.heap().allocate<WritableStreamDefaultWriter>(realm, realm));
  17. // 1. Perform ? SetUpWritableStreamDefaultWriter(this, stream).
  18. TRY(set_up_writable_stream_default_writer(*writer, stream));
  19. return writer;
  20. }
  21. // https://streams.spec.whatwg.org/#default-writer-closed
  22. JS::GCPtr<JS::Object> WritableStreamDefaultWriter::closed()
  23. {
  24. // 1. Return this.[[closedPromise]].
  25. return m_closed_promise->promise();
  26. }
  27. // https://streams.spec.whatwg.org/#default-writer-desired-size
  28. WebIDL::ExceptionOr<Optional<double>> WritableStreamDefaultWriter::desired_size() const
  29. {
  30. // 1. If this.[[stream]] is undefined, throw a TypeError exception.
  31. if (!m_stream)
  32. return WebIDL::SimpleException { WebIDL::SimpleExceptionType::TypeError, "Cannot get desired size of writer that has no locked stream"sv };
  33. // 2. Return ! WritableStreamDefaultWriterGetDesiredSize(this).
  34. return writable_stream_default_writer_get_desired_size(*this);
  35. }
  36. // https://streams.spec.whatwg.org/#default-writer-ready
  37. JS::GCPtr<JS::Object> WritableStreamDefaultWriter::ready()
  38. {
  39. // 1. Return this.[[readyPromise]].
  40. return m_ready_promise->promise();
  41. }
  42. // https://streams.spec.whatwg.org/#default-writer-abort
  43. WebIDL::ExceptionOr<JS::GCPtr<JS::Object>> WritableStreamDefaultWriter::abort(JS::Value reason)
  44. {
  45. auto& realm = this->realm();
  46. // 1. If this.[[stream]] is undefined, return a promise rejected with a TypeError exception.
  47. if (!m_stream) {
  48. auto exception = MUST_OR_THROW_OOM(JS::TypeError::create(realm, "Cannot abort a writer that has no locked stream"sv));
  49. return WebIDL::create_rejected_promise(realm, exception)->promise();
  50. }
  51. // 2. Return ! WritableStreamDefaultWriterAbort(this, reason).
  52. return TRY(writable_stream_default_writer_abort(*this, reason))->promise();
  53. }
  54. // https://streams.spec.whatwg.org/#default-writer-close
  55. WebIDL::ExceptionOr<JS::GCPtr<JS::Object>> WritableStreamDefaultWriter::close()
  56. {
  57. auto& realm = this->realm();
  58. // 1. Let stream be this.[[stream]].
  59. // 2. If stream is undefined, return a promise rejected with a TypeError exception.
  60. if (!m_stream) {
  61. auto exception = MUST_OR_THROW_OOM(JS::TypeError::create(realm, "Cannot close a writer that has no locked stream"sv));
  62. return WebIDL::create_rejected_promise(realm, exception)->promise();
  63. }
  64. // 3. If ! WritableStreamCloseQueuedOrInFlight(stream) is true, return a promise rejected with a TypeError exception.
  65. if (writable_stream_close_queued_or_in_flight(*m_stream)) {
  66. auto exception = MUST_OR_THROW_OOM(JS::TypeError::create(realm, "Cannot close a stream that is already closed or errored"sv));
  67. return WebIDL::create_rejected_promise(realm, exception)->promise();
  68. }
  69. // 4. Return ! WritableStreamDefaultWriterClose(this).
  70. return TRY(writable_stream_default_writer_close(*this))->promise();
  71. }
  72. WritableStreamDefaultWriter::WritableStreamDefaultWriter(JS::Realm& realm)
  73. : Bindings::PlatformObject(realm)
  74. {
  75. }
  76. JS::ThrowCompletionOr<void> WritableStreamDefaultWriter::initialize(JS::Realm& realm)
  77. {
  78. MUST_OR_THROW_OOM(Base::initialize(realm));
  79. set_prototype(&Bindings::ensure_web_prototype<Bindings::WritableStreamDefaultWriterPrototype>(realm, "WritableStreamDefaultWriter"));
  80. return {};
  81. }
  82. void WritableStreamDefaultWriter::visit_edges(Cell::Visitor& visitor)
  83. {
  84. Base::visit_edges(visitor);
  85. visitor.visit(m_closed_promise);
  86. visitor.visit(m_ready_promise);
  87. visitor.visit(m_stream);
  88. }
  89. }